blowfish.c

来自「BestCrypt开源加密原代码」· C语言 代码 · 共 475 行 · 第 1/2 页

C
475
字号
  0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,   0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,   0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,   0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,   0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,   0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,   0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,   0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,   0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,   0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,   0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,   0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,   0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,   0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,   0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,   0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,   0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,   0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,   0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,   0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,   0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,   0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,   0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,   0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,   0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,   0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,   0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,   0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,   0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,   0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,   0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,   0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,   0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,   0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,   0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,   0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,   0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,   0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,   0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,   0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,   0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,   0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,   0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,   0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}};//************ BLOWFISH ECB mode encryption **************#define S(x,i) ((KeyAddress->Array.sArray)[i][x.Byte.Byte##i])#define F(x)   (((S(x,0) + S(x,1)) ^ S(x,2)) + S(x,3))#define ROUND(a,b,n) (a.Dword ^= F(b) ^ (KeyAddress->Array.pArray[n]))VOIDBlowfish_ECB_Encrypt( PDWORD Left,                      PDWORD Right,		             PBKEY  KeyAddress ){ union unionDWORD  Xl;  union unionDWORD  Xr;  Xl.Dword = *Left;  Xr.Dword = *Right;  Xl.Dword ^= KeyAddress->Array.pArray[0];  ROUND (Xr, Xl, 1);  ROUND (Xl, Xr, 2);  ROUND (Xr, Xl, 3);  ROUND (Xl, Xr, 4);  ROUND (Xr, Xl, 5);  ROUND (Xl, Xr, 6);  ROUND (Xr, Xl, 7);  ROUND (Xl, Xr, 8);  ROUND (Xr, Xl, 9);  ROUND (Xl, Xr, 10);  ROUND (Xr, Xl, 11); ROUND (Xl, Xr, 12);  ROUND (Xr, Xl, 13); ROUND (Xl, Xr, 14);  ROUND (Xr, Xl, 15); ROUND (Xl, Xr, 16);    Xr.Dword ^= KeyAddress->Array.pArray[17];  *Right = Xl.Dword;  *Left  = Xr.Dword;}//************ BLOWFISH ECB mode decryption **************VOIDBlowfish_ECB_Decrypt( PDWORD Left,                      PDWORD Right,		              PBKEY  KeyAddress ){ union unionDWORD  Xl;  union unionDWORD  Xr;  Xl.Dword = *Left;  Xr.Dword = *Right;  Xl.Dword ^= KeyAddress->Array.pArray[17];  ROUND (Xr, Xl, 16);  ROUND (Xl, Xr, 15);  ROUND (Xr, Xl, 14);  ROUND (Xl, Xr, 13);  ROUND (Xr, Xl, 12);  ROUND (Xl, Xr, 11);  ROUND (Xr, Xl, 10);  ROUND (Xl, Xr, 9);  ROUND (Xr, Xl, 8);   ROUND (Xl, Xr, 7);  ROUND (Xr, Xl, 6);   ROUND (Xl, Xr, 5);  ROUND (Xr, Xl, 4);   ROUND (Xl, Xr, 3);  ROUND (Xr, Xl, 2);   ROUND (Xl, Xr, 1);    Xr.Dword ^= KeyAddress->Array.pArray[0];  *Right = Xl.Dword;  *Left  = Xr.Dword;}//************ BLOWFISH CBC mode encryption **************VOIDEncrypt( DWORD *IVector,          DWORD *KeyAddress,         DWORD *SrcBuffer,         DWORD *DstBuffer,         DWORD Length )    // in bytes{ DWORD i;  DWORD left, right;  left  = IVector[0];  right = IVector[1];  for(i = 0; i < (Length >> 2); i = i+2)    { 	  // do EBC encryption of (Initial_Vector XOR Data)      left  = SrcBuffer[i] ^ left;      right = SrcBuffer[i+1] ^ right;      Blowfish_ECB_Encrypt( &left, &right, (PBKEY)KeyAddress );                  DstBuffer[i]   = left;      DstBuffer[i+1] = right;	      }}//************ BLOWFISH CBC mode decryption **************VOIDDecrypt( DWORD *IVector,          DWORD *KeyAddress,         DWORD *SrcBuffer,         DWORD *DstBuffer,         DWORD Length )    // in bytes{ DWORD i;  DWORD left, right, ivectorL, ivectorR, oldSrcL, oldSrcR;  ivectorL = IVector[0];  ivectorR = IVector[1];  for(i = 0; i < (Length >> 2); i = i+2)    {       left  = oldSrcL = SrcBuffer[i];      right = oldSrcR = SrcBuffer[i+1];	  // Encrypted Data -> new IV, 	  // then do EBC decryption of Encrypted Data,       // then XOR decrypted data with old IV	  Blowfish_ECB_Decrypt( &left, &right, (PBKEY)KeyAddress );            DstBuffer[i]   = left  ^ ivectorL;      DstBuffer[i+1] = right ^ ivectorR;	              ivectorL = oldSrcL;      ivectorR = oldSrcR;    }}//*********** BLOWFISH Key Extension **************BOOLKeyExtend( PUCHAR KeySource,          // 32       8-bit  uchars           PDWORD KeyDestination )    // (4168/4) 32-bit dwords{  PBKEY  pKey = (PBKEY)KeyDestination;  USHORT i,j;  DWORD  left = 0, right = 0;  union  unionDWORD tmp;   if ((!KeySource) || (!KeyDestination)) return FALSE;  // (1)  for(i=0; i<18; i++) pKey->Array.pArray[i] = bf_P[i];  for(i=0; i<4; i++) 	for(j=0; j<256; j++) pKey->Array.sArray[i][j] = bf_S[i][j];    // (2)/*  pKey->Array.pArray[0]=0x243f6a88;   pKey->Array.pArray[1]=0x85a308d3;  pKey->Array.pArray[2]=0x13198a2e;  pKey->Array.pArray[3]=0x03707344;  pKey->Array.pArray[4]=0xa4093822;   pKey->Array.pArray[5]=0x299f31d0;   pKey->Array.pArray[6]=0x082efa98;   pKey->Array.pArray[7]=0xec4e6c89;  pKey->Array.pArray[8]=0x452821e6;   pKey->Array.pArray[9]=0x38d01377;  pKey->Array.pArray[10]=0xbe5466cf;  pKey->Array.pArray[11]=0x34e90c6c;  pKey->Array.pArray[12]=0xc0ac29b7;   pKey->Array.pArray[13]=0xc97c50dd;   pKey->Array.pArray[14]=0x3f84d5b5;   pKey->Array.pArray[15]=0xb5470917;  pKey->Array.pArray[16]=0x9216d5d9;   pKey->Array.pArray[17]=0x8979fb1b;*/  for(i=0, j=0; i<18; i++)   { tmp.Dword = 0;     tmp.Byte.Byte0 = KeySource[j];     tmp.Byte.Byte1 = KeySource[(j+1)%(KEY_LENGTH / 8)];     tmp.Byte.Byte2 = KeySource[(j+2)%(KEY_LENGTH / 8)];     tmp.Byte.Byte3 = KeySource[(j+3)%(KEY_LENGTH / 8)];     pKey->Array.pArray[i] ^= tmp.Dword;     j = (j + 4) % (KEY_LENGTH / 8);   }  // (3) - (7)  for(i=0; i<1042; i = i+2)    { Blowfish_ECB_Encrypt( &left, &right, pKey );      pKey->Key[i]   = left;      pKey->Key[i+1] = right;    }  return TRUE;}char blowfish_c[]="$Id: blowfish.c,v 1.3 2002/10/29 07:11:46 crypt Rel-1.6-5 $";

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?