• 博客(0)
  • 资源 (2)

空空如也

AKE32位的源代码

// ake32.c #include "ake32.h" // performs n ^ 2 mod p operation word32 squaremod( word32 n, word32 p ) { word32 k, sum, result = 0; word32 partial; int carry = 0; // copy 'n' into 'sum' and into 'bits' and set 'n' to zero k = sum = n; // extract the bits from the right part of 'bits' // for each bit to 1 we add 'sum' to 'n' // 'sum' is shifted to the left in each step while ( k > 0 ) { if ( k & 1 ) { // if bit0 == 1 // then we add 'sum' to 'result' partial = result + sum; if ( (partial < result) || (partial < sum) ) carry = 1; result = partial; // check if 'result' is greater than 'p' if ( (result > p) || carry ) {// if result>p then result-p */ result -= p; carry = 0; } } // Multiply sum by 2 if ( sum & 0x80000000 ) carry = 1; sum <<= 1; // check if sum is greater than 'p' if ( (sum > p) || carry ) { // if sum>p then sum-p sum -= p; carry = 0; } k >>= 1; } return result; } // performs the leftwise rotation operation on a 128-bit word void rotl128( word32 * a, int b ) { word32 temp1, temp2; register int i; if ( b < 32 ) { temp1 = a[3]; for ( i = 3; i > 0; i-- ) { a[i] <<= b; if ( b != 0 ) a[i] |= a[i-1] >> (32-b); } a[0] <<= b; if ( b != 0 ) a[0] |= temp1 >> (32-b); } else if ( b < 64 ) { temp1 = a[3]; temp2 = a[2]; for ( i = 3; i > 1; i-- ) { a[i] = 0; a[i] = a[i-1] << (b-32); if ( b != 32 ) a[i] |= a[i-2] >> (64-b); } a[1] = 0; a[1] = a[0] << (b-32); if ( b != 32 ) a[1] |= temp1 >> (64-b); a[0] = 0; a[0] = temp1 << (b-32); if ( b != 32 ) a[0] |= temp2 >> (64-b); } else if ( b < 96 ) { temp1 = a[0]; temp2 = a[1]; b = 128-b; for ( i = 0; i < 2; i++ ) { a[i] = 0; if ( b != 64 ) a[i] = a[i+1] >> (b-32); a[i] |= a[i+2] << (64-b); } a[2] = 0; if ( b != 64 ) a[2] = a[3] >> (b-32); a[2] |= temp1 << (64-b); a[3] = 0; if ( b != 64 ) a[3] = temp1 >> (b-32); a[3] |= temp2 << (64-b); } else { temp1 = a[0]; b = 128-b; for ( i = 0; i < 3; i++ ) { if ( b != 32 ) a[i] >>= b; else a[i] = 0; a[i] |= a[i+1] << (32-b); } if ( b != 32 ) a[3] >>= b; else a[3] = 0; a[3] |= temp1 << (32-b); } } // rotate left the 31 most significant bits word32 rotl31( word32 x, int y ) { word32 bit = 0; bit = x & 0x1; x &= 0xfffffffe; return ((x<<(y&0x1f)) | (x>>(31-(y&0x1f))))|bit; } // rotate left the 31 less significant bits word32 rotl1( word32 x, int y ) { word32 bit = 0; bit = x & 0x80000000; x &= 0x7fffffff; return ((x<<(y&0x1f)) | (x>>(31-(y&0x1f))))|bit; } // generate the encryption subkeys from the user-key void en_key_ake32(word32 *userkey, word32 *EK) { register int i; word32 t[DWORDS_IN_KEY]; // First we initialize the auxiliar variables t(i) // t(i) = (k(i)+a(i))^2 mod p(i) for ( i = 0; i < DWORDS_IN_KEY; i++ ) t[i] = squaremod( userkey[i]+constant[i], prime[i] ); // Next we calculate as many subkeys as necessary for ( i = 0; i < SUBKEYS; i++ ) { // K(i) = t(i) ^ t(i+2) EK[i] = t[i%DWORDS_IN_KEY] ^ t[(i+2)%DWORDS_IN_KEY]; // t(i) = (t(i) ^ t(i+1)) mod p(i) t[i%DWORDS_IN_KEY] = squaremod( t[i%DWORDS_IN_KEY]^t[(i+1)%DWORDS_IN_KEY], prime[i%DWORDS_IN_KEY] ); // t(i+2) = (t(i+2) ^ t(i+3)) mod p(i+2) t[(i+2)%DWORDS_IN_KEY] = squaremod( t[(i+2)%DWORDS_IN_KEY]^t[(i+3)%DWORDS_IN_KEY], prime[(i+2)%DWORDS_IN_KEY] ); } } // generates the decryption subkeys from the encryption subkeys void de_key_ake32(ake32key EK, ake32key DK) { register int i, j; word32 t1, t2, t3, t[11]; ake32key T; word32 *p=T+SUBKEYS; t1=-*EK++; t2=*EK++; t3=*EK++; *--p=-*EK++; *--p=t3; *--p=t2; *--p=t1; *--p=128-(*EK++)&0x7f; for (j=0;j<ROUNDS;j++) { for ( i = 0; i < 11; i++ ) t[i]=*EK++; *--p=*EK++; for ( i = 10; i >= 0; i-- ) *--p=t[i]; *--p=128-(*EK++)&0x7f; } t1=-*EK++; t2=*EK++; t3=*EK++; *--p=-*EK++; *--p=t3; *--p=t2; *--p=t1; //copy and destroy temp copy for(j=0,p=T;j<SUBKEYS;j++) { *DK++=*p; *p++=0; } } // encrypts the input text into the output ciphertext using the subkeys void cipher_ake32( word32 in[4], word32 out[4], register ake32key EK ) { word32 x[4], t1, t2; int r = ROUNDS; x[0] = *in++; x[1] = *in++; x[2] = *in++; x[3] = *in; // Initial rotation and addition and XOR operations x[0] += *EK++; x[1] ^= *EK++; x[2] ^= *EK++; x[3] += *EK++; do { rotl128( x, (*EK++)&0x7f ); t1 = x[0] ^ x[2]; t2 = x[1] ^ x[3]; // Next, the additions-rotations t2 = rotl31( t2, t1 ); t2 += *EK++; t2 = rotl1( t2, t1 >> 5 ); t2 += *EK++; t2 = rotl31( t2, t1 >> 10 ); t2 += *EK++; t2 = rotl1( t2, t1 >> 15 ); t2 += *EK++; t2 = rotl31( t2, (t1 >> 20)&0xf ); t2 += *EK++; t2 = rotl1( t2, (t1 >> 24)&0xf ); t2 += *EK++; t2 = rotl31( t2, (t1 >> 28)&0xf ); t1 = rotl1( t1, t2 ); t1 += *EK++; t1 = rotl31( t1, t2 >> 5 ); t1 += *EK++; t1 = rotl1( t1, t2 >> 10 ); t1 += *EK++; t1 = rotl31( t1, t2 >> 15 ); t1 += *EK++; t1 = rotl1( t1, (t2 >> 20)&0xf ); t1 += *EK++; t1 = rotl31( t1, (t2 >> 24)&0xf ); t1 += *EK++; t1 = rotl1( t1, (t2 >> 28)&0xf ); x[0] ^= t2; x[2] ^= t2; x[1] ^= t1; x[3] ^= t1; } while (--r); // Final rotation and addition and XOR operations rotl128( x, (*EK++)&0x7f ); *out++ = x[0] + *EK++; *out++ = x[1] ^ *EK++; *out++ = x[2] ^ *EK++; *out = x[3] + *EK; } int main ( ) { word32 userkey[DWORDS_IN_KEY] = { 0x0000000,0x0000,0x0000,0X0000 }; clock_t start, finish; word32 AA[4],BB[4],CC[4]; ake32key EK,DK; register long l; FILE *fich; AA[0] = AA[1] = AA[2] = 0; AA[3] = 0x10000000; en_key_ake32(userkey,EK); fich = fopen( "clave3.txt", "wt" ); for ( l = 0; l < SUBKEYS; l++ ) fprintf( fich, "EK[%d] = %08X\n", l, EK[l] ); de_key_ake32(EK,DK); fclose( fich ); printf( "AA = %08X %08X %08X %08X\n", AA[0], AA[1], AA[2], AA[3] ); printf("\nEncrypting %lu words: ", ITERATIONS ); start = clock( ); cipher_ake32(AA,BB,EK); /*for ( l = 0; l < ITERATIONS; l++ ) cipher_ake32(BB, BB, EK);*/ finish = clock( ) - start; fich = fopen( "crypt.txt", "at" ); fprintf( fich, "BB = %08X %08X %08X %08X\n", BB[0], BB[1], BB[2], BB[3] ); fclose( fich ); printf( "BB = %08X %08X %08X %08X\n", BB[0], BB[1], BB[2], BB[3] ); printf( "%2.3f seconds\n", (double) finish/CLK_TCK ); printf("\nDecrypting %lu words: ", ITERATIONS ); start = clock( ); cipher_ake32( BB, CC, DK ); /*for ( l = 0; l < ITERATIONS; l++ ) cipher_ake32( CC, CC, DK );*/ finish = clock( ) - start; printf( "CC = %08X %08X %08X %08X\n", CC[0], CC[1], CC[2], CC[3] ); printf( "%2.3f seconds\n", (double) finish/CLK_TCK ); getchar( ); return 0; }

2011-04-10

des源代码(加解密的密钥生成)

C代码 //初始置换表IP int IP_Table[64] = { 57,49,41,33,25,17,9,1, 59,51,43,35,27,19,11,3, 61,53,45,37,29,21,13,5, 63,55,47,39,31,23,15,7, 56,48,40,32,24,16,8,0, 58,50,42,34,26,18,10,2, 60,52,44,36,28,20,12,4, 62,54,46,38,30,22,14,6}; //逆初始置换表IP^-1 int IP_1_Table[64] = {39,7,47,15,55,23,63,31, 38,6,46,14,54,22,62,30, 37,5,45,13,53,21,61,29, 36,4,44,12,52,20,60,28, 35,3,43,11,51,19,59,27, 34,2,42,10,50,18,58,26, 33,1,41,9,49,17,57,25, 32,0,40,8,48,16,56,24}; //扩充置换表E int E_Table[48] = {31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 7, 8,9,10,11,12, 11,12,13,14,15,16, 15,16,17,18,19,20, 19,20,21,22,23,24, 23,24,25,26,27,28, 27,28,29,30,31, 0}; //置换函数P int P_Table[32] = {15,6,19,20,28,11,27,16, 0,14,22,25,4,17,30,9, 1,7,23,13,31,26,2,8, 18,12,29,5,21,10,3,24}; //S盒 int S[8][4][16] =//S1 {{{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7}, {0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8}, {4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0}, {15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}}, //S2 {{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10}, {3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5}, {0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15}, {13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}}, //S3 {{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8}, {13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1}, {13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7}, {1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}}, //S4 {{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15}, {13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9}, {10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4}, {3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}}, //S5 {{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9}, {14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6}, {4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14}, {11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}}, //S6 {{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11}, {10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8}, {9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6}, {4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}}, //S7 {{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1}, {13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6}, {1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2}, {6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}}, //S8 {{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7}, {1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2}, {7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8}, {2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}}}; //置换选择1 int PC_1[56] = {56,48,40,32,24,16,8, 0,57,49,41,33,25,17, 9,1,58,50,42,34,26, 18,10,2,59,51,43,35, 62,54,46,38,30,22,14, 6,61,53,45,37,29,21, 13,5,60,52,44,36,28, 20,12,4,27,19,11,3}; //置换选择2 int PC_2[48] = {13,16,10,23,0,4,2,27, 14,5,20,9,22,18,11,3, 25,7,15,6,26,19,12,1, 40,51,30,36,46,54,29,39, 50,44,32,46,43,48,38,55, 33,52,45,41,49,35,28,31}; //对左移次数的规定 int MOVE_TIMES[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; //初始置换表IP int IP_Table[64] = { 57,49,41,33,25,17,9,1, 59,51,43,35,27,19,11,3, 61,53,45,37,29,21,13,5, 63,55,47,39,31,23,15,7, 56,48,40,32,24,16,8,0, 58,50,42,34,26,18,10,2, 60,52,44,36,28,20,12,4, 62,54,46,38,30,22,14,6}; //逆初始置换表IP^-1 int IP_1_Table[64] = {39,7,47,15,55,23,63,31, 38,6,46,14,54,22,62,30, 37,5,45,13,53,21,61,29, 36,4,44,12,52,20,60,28, 35,3,43,11,51,19,59,27, 34,2,42,10,50,18,58,26, 33,1,41,9,49,17,57,25, 32,0,40,8,48,16,56,24}; //扩充置换表E int E_Table[48] = {31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 7, 8,9,10,11,12, 11,12,13,14,15,16, 15,16,17,18,19,20, 19,20,21,22,23,24, 23,24,25,26,27,28, 27,28,29,30,31, 0}; //置换函数P int P_Table[32] = {15,6,19,20,28,11,27,16, 0,14,22,25,4,17,30,9, 1,7,23,13,31,26,2,8, 18,12,29,5,21,10,3,24}; //S盒 int S[8][4][16] =//S1 {{{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7}, {0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8}, {4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0}, {15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}}, //S2 {{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10}, {3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5}, {0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15}, {13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}}, //S3 {{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8}, {13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1}, {13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7}, {1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}}, //S4 {{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15}, {13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9}, {10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4}, {3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}}, //S5 {{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9}, {14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6}, {4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14}, {11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}}, //S6 {{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11}, {10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8}, {9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6}, {4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}}, //S7 {{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1}, {13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6}, {1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2}, {6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}}, //S8 {{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7}, {1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2}, {7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8}, {2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}}}; //置换选择1 int PC_1[56] = {56,48,40,32,24,16,8, 0,57,49,41,33,25,17, 9,1,58,50,42,34,26, 18,10,2,59,51,43,35, 62,54,46,38,30,22,14, 6,61,53,45,37,29,21, 13,5,60,52,44,36,28, 20,12,4,27,19,11,3}; //置换选择2 int PC_2[48] = {13,16,10,23,0,4,2,27, 14,5,20,9,22,18,11,3, 25,7,15,6,26,19,12,1, 40,51,30,36,46,54,29,39, 50,44,32,46,43,48,38,55, 33,52,45,41,49,35,28,31}; //对左移次数的规定 int MOVE_TIMES[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; 二、模块化。 对面向过程的程序,模块化是否清晰是至关重要的。 下面是函数的声明: C代码 int ByteToBit(ElemType ch,ElemType bit[8]); int BitToByte(ElemType bit[8],ElemType *ch); int Char8ToBit64(ElemType ch[8],ElemType bit[64]); int Bit64ToChar8(ElemType bit[64],ElemType ch[8]); int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]); int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]); int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]); int DES_ROL(ElemType data[56], int time); int DES_IP_Transform(ElemType data[64]); int DES_IP_1_Transform(ElemType data[64]); int DES_E_Transform(ElemType data[48]); int DES_P_Transform(ElemType data[32]); int DES_SBOX(ElemType data[48]); int DES_XOR(ElemType R[48], ElemType L[48],int count); int DES_Swap(ElemType left[32],ElemType right[32]); int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]); int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48], ElemType plainBlock[8]); int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile); int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile); int ByteToBit(ElemType ch,ElemType bit[8]); int BitToByte(ElemType bit[8],ElemType *ch); int Char8ToBit64(ElemType ch[8],ElemType bit[64]); int Bit64ToChar8(ElemType bit[64],ElemType ch[8]); int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]); int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]); int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]); int DES_ROL(ElemType data[56], int time); int DES_IP_Transform(ElemType data[64]); int DES_IP_1_Transform(ElemType data[64]); int DES_E_Transform(ElemType data[48]); int DES_P_Transform(ElemType data[32]); int DES_SBOX(ElemType data[48]); int DES_XOR(ElemType R[48], ElemType L[48],int count); int DES_Swap(ElemType left[32],ElemType right[32]); int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]); int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48], ElemType plainBlock[8]); int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile); int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile); 其实,模块化与速度也是一对矛盾,因为了解函数运行机制的人就知道,我们的计算机在运行某个函数时,是要用栈来保存入口状态的,在运行结束后又要恢复现场,这些操作势必会影像系统性能,但我们不能将所有代码写在Main函数里,虽然那样做我们的加密算法效率又会大增,但是那种代码未免太过于丑陋不堪。因此,为了帅,还是牺牲一下性能吧。 三、实现。 代码里能用移位操作都尽量用了移位操作,能用逻辑运算符的都用了逻辑运算符。 详细的行注相信你可以看懂吧。有问题可以M我。 C代码 //字节转换成二进制 int ByteToBit(ElemType ch, ElemType bit[8]){ int cnt; for(cnt = 0;cnt >cnt)&1; } return 0; } //二进制转换成字节 int BitToByte(ElemType bit[8],ElemType *ch){ int cnt; for(cnt = 0;cnt < 8; cnt++){ *ch |= *(bit + cnt)<<cnt; } return 0; } //将长度为8的字符串转为二进制位串 int Char8ToBit64(ElemType ch[8],ElemType bit[64]){ int cnt; for(cnt = 0; cnt < 8; cnt++){ ByteToBit(*(ch+cnt),bit+(cnt<<3)); } return 0; } //将二进制位串转为长度为8的字符串 int Bit64ToChar8(ElemType bit[64],ElemType ch[8]){ int cnt; memset(ch,0,8); for(cnt = 0; cnt < 8; cnt++){ BitToByte(bit+(cnt<<3),ch+cnt); } return 0; } //生成子密钥 int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]){ ElemType temp[56]; int cnt; DES_PC1_Transform(key,temp);//PC1置换 for(cnt = 0; cnt < 16; cnt++){//16轮跌代,产生16个子密钥 DES_ROL(temp,MOVE_TIMES[cnt]);//循环左移 DES_PC2_Transform(temp,subKeys[cnt]);//PC2置换,产生子密钥 } return 0; } //密钥置换1 int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]){ int cnt; for(cnt = 0; cnt < 56; cnt++){ tempbts[cnt] = key[PC_1[cnt]]; } return 0; } //密钥置换2 int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]){ int cnt; for(cnt = 0; cnt < 48; cnt++){ tempbts[cnt] = key[PC_2[cnt]]; } return 0; } //循环左移 int DES_ROL(ElemType data[56], int time){ ElemType temp[56]; //保存将要循环移动到右边的位 memcpy(temp,data,time); memcpy(temp+time,data+28,time); //前28位移动 memcpy(data,data+time,28-time); memcpy(data+28-time,temp,time); //后28位移动 memcpy(data+28,data+28+time,28-time); memcpy(data+56-time,temp+time,time); return 0; } //IP置换 int DES_IP_Transform(ElemType data[64]){ int cnt; ElemType temp[64]; for(cnt = 0; cnt < 64; cnt++){ temp[cnt] = data[IP_Table[cnt]]; } memcpy(data,temp,64); return 0; } //IP逆置换 int DES_IP_1_Transform(ElemType data[64]){ int cnt; ElemType temp[64]; for(cnt = 0; cnt < 64; cnt++){ temp[cnt] = data[IP_1_Table[cnt]]; } memcpy(data,temp,64); return 0; } //扩展置换 int DES_E_Transform(ElemType data[48]){ int cnt; ElemType temp[48]; for(cnt = 0; cnt < 48; cnt++){ temp[cnt] = data[E_Table[cnt]]; } memcpy(data,temp,48); return 0; } //P置换 int DES_P_Transform(ElemType data[32]){ int cnt; ElemType temp[32]; for(cnt = 0; cnt < 32; cnt++){ temp[cnt] = data[P_Table[cnt]]; } memcpy(data,temp,32); return 0; } //异或 int DES_XOR(ElemType R[48], ElemType L[48] ,int count){ int cnt; for(cnt = 0; cnt < count; cnt++){ R[cnt] ^= L[cnt]; } return 0; } //S盒置换 int DES_SBOX(ElemType data[48]){ int cnt; int line,row,output; int cur1,cur2; for(cnt = 0; cnt < 8; cnt++){ cur1 = cnt*6; cur2 = cnt<<2; //计算在S盒中的行与列 line = (data[cur1]<<1) + data[cur1+5]; row = (data[cur1+1]<<3) + (data[cur1+2]<<2) + (data[cur1+3]<>3; data[cur2+1] = (output&0X04)>>2; data[cur2+2] = (output&0X02)>>1; data[cur2+3] = output&0x01; } return 0; } //交换 int DES_Swap(ElemType left[32], ElemType right[32]){ ElemType temp[32]; memcpy(temp,left,32); memcpy(left,right,32); memcpy(right,temp,32); return 0; } //加密单个分组 int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]){ ElemType plainBits[64]; ElemType copyRight[48]; int cnt; Char8ToBit64(plainBlock,plainBits); //初始置换(IP置换) DES_IP_Transform(plainBits); //16轮迭代 for(cnt = 0; cnt = 0; cnt--){ memcpy(copyRight,cipherBits+32,32); //将右半部分进行扩展置换,从32位扩展到48位 DES_E_Transform(copyRight); //将右半部分与子密钥进行异或操作 DES_XOR(copyRight,subKeys[cnt],48); //异或结果进入S盒,输出32位结果 DES_SBOX(copyRight); //P置换 DES_P_Transform(copyRight); //将明文左半部分与右半部分进行异或 DES_XOR(cipherBits,copyRight,32); if(cnt != 0){ //最终完成左右部的交换 DES_Swap(cipherBits,cipherBits+32); } } //逆初始置换(IP^1置换) DES_IP_1_Transform(cipherBits); Bit64ToChar8(cipherBits,plainBlock); return 0; } //加密文件 int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile){ FILE *plain,*cipher; int count; ElemType plainBlock[8],cipherBlock[8],keyBlock[8]; ElemType bKey[64]; ElemType subKeys[16][48]; if((plain = fopen(plainFile,"rb")) == NULL){ return PLAIN_FILE_OPEN_ERROR; } if((cipher = fopen(cipherFile,"wb")) == NULL){ return CIPHER_FILE_OPEN_ERROR; } //设置密钥 memcpy(keyBlock,keyStr,8); //将密钥转换为二进制流 Char8ToBit64(keyBlock,bKey); //生成子密钥 DES_MakeSubKeys(bKey,subKeys); while(!feof(plain)){ //每次读8个字节,并返回成功读取的字节数 if((count = fread(plainBlock,sizeof(char),8,plain)) == 8){ DES_EncryptBlock(plainBlock,subKeys,cipherBlock); fwrite(cipherBlock,sizeof(char),8,cipher); } } if(count){ //填充 memset(plainBlock + count,'\0',7 - count); //最后一个字符保存包括最后一个字符在内的所填充的字符数量 plainBlock[7] = 8 - count; DES_EncryptBlock(plainBlock,subKeys,cipherBlock); fwrite(cipherBlock,sizeof(char),8,cipher); } fclose(plain); fclose(cipher); return OK; } //解密文件 int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile){ FILE *plain, *cipher; int count,times = 0; long fileLen; ElemType plainBlock[8],cipherBlock[8],keyBlock[8]; ElemType bKey[64]; ElemType subKeys[16][48]; if((cipher = fopen(cipherFile,"rb")) == NULL){ return CIPHER_FILE_OPEN_ERROR; } if((plain = fopen(plainFile,"wb")) == NULL){ return PLAIN_FILE_OPEN_ERROR; } //设置密钥 memcpy(keyBlock,keyStr,8); //将密钥转换为二进制流 Char8ToBit64(keyBlock,bKey); //生成子密钥 DES_MakeSubKeys(bKey,subKeys); //取文件长度 fseek(cipher,0,SEEK_END); //将文件指针置尾 fileLen = ftell(cipher); //取文件指针当前位置 rewind(cipher); //将文件指针重指向文件头 while(1){ //密文的字节数一定是8的整数倍 fread(cipherBlock,sizeof(char),8,cipher); DES_DecryptBlock(cipherBlock,subKeys,plainBlock); times += 8; if(times < fileLen){ fwrite(plainBlock,sizeof(char),8,plain); } else{ break; } } //判断末尾是否被填充 if(plainBlock[7] < 8){ for(count = 8 - plainBlock[7]; count < 7; count++){ if(plainBlock[count] != '\0'){ break; } } } if(count == 7){//有填充 fwrite(plainBlock,sizeof(char),8 - plainBlock[7],plain); } else{//无填充 fwrite(plainBlock,sizeof(char),8,plain); } fclose(plain); fclose(cipher); return OK; } //字节转换成二进制 int ByteToBit(ElemType ch, ElemType bit[8]){ int cnt; for(cnt = 0;cnt >cnt)&1; } return 0; } //二进制转换成字节 int BitToByte(ElemType bit[8],ElemType *ch){ int cnt; for(cnt = 0;cnt < 8; cnt++){ *ch |= *(bit + cnt)<<cnt; } return 0; } //将长度为8的字符串转为二进制位串 int Char8ToBit64(ElemType ch[8],ElemType bit[64]){ int cnt; for(cnt = 0; cnt < 8; cnt++){ ByteToBit(*(ch+cnt),bit+(cnt<<3)); } return 0; } //将二进制位串转为长度为8的字符串 int Bit64ToChar8(ElemType bit[64],ElemType ch[8]){ int cnt; memset(ch,0,8); for(cnt = 0; cnt < 8; cnt++){ BitToByte(bit+(cnt<<3),ch+cnt); } return 0; } //生成子密钥 int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]){ ElemType temp[56]; int cnt; DES_PC1_Transform(key,temp);//PC1置换 for(cnt = 0; cnt < 16; cnt++){//16轮跌代,产生16个子密钥 DES_ROL(temp,MOVE_TIMES[cnt]);//循环左移 DES_PC2_Transform(temp,subKeys[cnt]);//PC2置换,产生子密钥 } return 0; } //密钥置换1 int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]){ int cnt; for(cnt = 0; cnt < 56; cnt++){ tempbts[cnt] = key[PC_1[cnt]]; } return 0; } //密钥置换2 int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]){ int cnt; for(cnt = 0; cnt < 48; cnt++){ tempbts[cnt] = key[PC_2[cnt]]; } return 0; } //循环左移 int DES_ROL(ElemType data[56], int time){ ElemType temp[56]; //保存将要循环移动到右边的位 memcpy(temp,data,time); memcpy(temp+time,data+28,time); //前28位移动 memcpy(data,data+time,28-time); memcpy(data+28-time,temp,time); //后28位移动 memcpy(data+28,data+28+time,28-time); memcpy(data+56-time,temp+time,time); return 0; } //IP置换 int DES_IP_Transform(ElemType data[64]){ int cnt; ElemType temp[64]; for(cnt = 0; cnt < 64; cnt++){ temp[cnt] = data[IP_Table[cnt]]; } memcpy(data,temp,64); return 0; } //IP逆置换 int DES_IP_1_Transform(ElemType data[64]){ int cnt; ElemType temp[64]; for(cnt = 0; cnt < 64; cnt++){ temp[cnt] = data[IP_1_Table[cnt]]; } memcpy(data,temp,64); return 0; } //扩展置换 int DES_E_Transform(ElemType data[48]){ int cnt; ElemType temp[48]; for(cnt = 0; cnt < 48; cnt++){ temp[cnt] = data[E_Table[cnt]]; } memcpy(data,temp,48); return 0; } //P置换 int DES_P_Transform(ElemType data[32]){ int cnt; ElemType temp[32]; for(cnt = 0; cnt < 32; cnt++){ temp[cnt] = data[P_Table[cnt]]; } memcpy(data,temp,32); return 0; } //异或 int DES_XOR(ElemType R[48], ElemType L[48] ,int count){ int cnt; for(cnt = 0; cnt < count; cnt++){ R[cnt] ^= L[cnt]; } return 0; } //S盒置换 int DES_SBOX(ElemType data[48]){ int cnt; int line,row,output; int cur1,cur2; for(cnt = 0; cnt < 8; cnt++){ cur1 = cnt*6; cur2 = cnt<<2; //计算在S盒中的行与列 line = (data[cur1]<<1) + data[cur1+5]; row = (data[cur1+1]<<3) + (data[cur1+2]<<2) + (data[cur1+3]<>3; data[cur2+1] = (output&0X04)>>2; data[cur2+2] = (output&0X02)>>1; data[cur2+3] = output&0x01; } return 0; } //交换 int DES_Swap(ElemType left[32], ElemType right[32]){ ElemType temp[32]; memcpy(temp,left,32); memcpy(left,right,32); memcpy(right,temp,32); return 0; } //加密单个分组 int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]){ ElemType plainBits[64]; ElemType copyRight[48]; int cnt; Char8ToBit64(plainBlock,plainBits); //初始置换(IP置换) DES_IP_Transform(plainBits); //16轮迭代 for(cnt = 0; cnt = 0; cnt--){ memcpy(copyRight,cipherBits+32,32); //将右半部分进行扩展置换,从32位扩展到48位 DES_E_Transform(copyRight); //将右半部分与子密钥进行异或操作 DES_XOR(copyRight,subKeys[cnt],48); //异或结果进入S盒,输出32位结果 DES_SBOX(copyRight); //P置换 DES_P_Transform(copyRight); //将明文左半部分与右半部分进行异或 DES_XOR(cipherBits,copyRight,32); if(cnt != 0){ //最终完成左右部的交换 DES_Swap(cipherBits,cipherBits+32); } } //逆初始置换(IP^1置换) DES_IP_1_Transform(cipherBits); Bit64ToChar8(cipherBits,plainBlock); return 0; } //加密文件 int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile){ FILE *plain,*cipher; int count; ElemType plainBlock[8],cipherBlock[8],keyBlock[8]; ElemType bKey[64]; ElemType subKeys[16][48]; if((plain = fopen(plainFile,"rb")) == NULL){ return PLAIN_FILE_OPEN_ERROR; } if((cipher = fopen(cipherFile,"wb")) == NULL){ return CIPHER_FILE_OPEN_ERROR; } //设置密钥 memcpy(keyBlock,keyStr,8); //将密钥转换为二进制流 Char8ToBit64(keyBlock,bKey); //生成子密钥 DES_MakeSubKeys(bKey,subKeys); while(!feof(plain)){ //每次读8个字节,并返回成功读取的字节数 if((count = fread(plainBlock,sizeof(char),8,plain)) == 8){ DES_EncryptBlock(plainBlock,subKeys,cipherBlock); fwrite(cipherBlock,sizeof(char),8,cipher); } } if(count){ //填充 memset(plainBlock + count,'\0',7 - count); //最后一个字符保存包括最后一个字符在内的所填充的字符数量 plainBlock[7] = 8 - count; DES_EncryptBlock(plainBlock,subKeys,cipherBlock); fwrite(cipherBlock,sizeof(char),8,cipher); } fclose(plain); fclose(cipher); return OK; } //解密文件 int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile){ FILE *plain, *cipher; int count,times = 0; long fileLen; ElemType plainBlock[8],cipherBlock[8],keyBlock[8]; ElemType bKey[64]; ElemType subKeys[16][48]; if((cipher = fopen(cipherFile,"rb")) == NULL){ return CIPHER_FILE_OPEN_ERROR; } if((plain = fopen(plainFile,"wb")) == NULL){ return PLAIN_FILE_OPEN_ERROR; } //设置密钥 memcpy(keyBlock,keyStr,8); //将密钥转换为二进制流 Char8ToBit64(keyBlock,bKey); //生成子密钥 DES_MakeSubKeys(bKey,subKeys); //取文件长度 fseek(cipher,0,SEEK_END); //将文件指针置尾 fileLen = ftell(cipher); //取文件指针当前位置 rewind(cipher); //将文件指针重指向文件头 while(1){ //密文的字节数一定是8的整数倍 fread(cipherBlock,sizeof(char),8,cipher); DES_DecryptBlock(cipherBlock,subKeys,plainBlock); times += 8; if(times < fileLen){ fwrite(plainBlock,sizeof(char),8,plain); } else{ break; } } //判断末尾是否被填充 if(plainBlock[7] < 8){ for(count = 8 - plainBlock[7]; count < 7; count++){ if(plainBlock[count] != '\0'){ break; } } } if(count == 7){//有填充 fwrite(plainBlock,sizeof(char),8 - plainBlock[7],plain); } else{//无填充 fwrite(plainBlock,sizeof(char),8,plain); } fclose(plain); fclose(cipher); return OK; } 最后,写一个简单的main函数来检验它: C代码 int main() { clock_t a,b; a = clock(); DES_Encrypt("1.txt","key.txt","2.txt"); b = clock(); printf("加密消耗%d毫秒\n",b-a); system("pause"); a = clock(); DES_Decrypt("2.txt","key.txt","3.txt"); b = clock(); printf("解密消耗%d毫秒\n",b-a); getchar(); return 0; }

2011-04-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除