📄 3des.c
字号:
#include "bc_des.h"
#include "bc_3des.h"
//*** 3DES ECB (Electronic Code Book mode encryption ***
void DES3_ECB_mode( BYTE *Input, /* 8 bytes of input data */
BYTE *Output, /* 8 bytes of output data */
DWORD *KeySchedule, /* Three [16][2] arrays of DWORDs */
BYTE Operation) /* DES_ECB_ENCRYPT or DES_ECB_DECRYPT */
{
if (Operation == DES_ECB_ENCRYPT)
{
DES_ECB_mode( Input, Output, KeySchedule, DES_ECB_ENCRYPT );
DES_ECB_mode( Output, Output, &(KeySchedule[ KEY_LENGTH_EXTENDED_DES / (8*4) ]), DES_ECB_DECRYPT );
DES_ECB_mode( Output, Output, &(KeySchedule[ 2 * (KEY_LENGTH_EXTENDED_DES / (8*4)) ]), DES_ECB_ENCRYPT );
}
else
{
DES_ECB_mode( Input, Output, &(KeySchedule[ 2 * (KEY_LENGTH_EXTENDED_DES / (8*4)) ]), DES_ECB_DECRYPT );
DES_ECB_mode( Output, Output, &(KeySchedule[ KEY_LENGTH_EXTENDED_DES / (8*4) ]), DES_ECB_ENCRYPT );
DES_ECB_mode( Output, Output, KeySchedule, DES_ECB_DECRYPT );
}
}
//************ 3DES CBC (Cipher Block Chaining) mode encryption **************
VOID
Encrypt( DWORD *IVector,
DWORD *KeyAddress,
DWORD *SrcBuffer,
DWORD *DstBuffer,
DWORD Length ) // in bytes
{ DWORD i;
DWORD buffer[2];
buffer[0] = IVector[0];
buffer[1] = IVector[1];
for(i = 0; i < (Length >> 2); i = i+2)
{
// do EBC encryption of (Initial_Vector XOR Data)
buffer[0] ^= SrcBuffer[i];
buffer[1] ^= SrcBuffer[i+1];
DES3_ECB_mode( (BYTE *)buffer, (BYTE *)buffer,
KeyAddress, DES_ECB_ENCRYPT );
DstBuffer[i] = buffer[0];
DstBuffer[i+1] = buffer[1];
}
}
//************ 3DES CBC mode decryption **************
VOID
Decrypt( DWORD *IVector,
DWORD *KeyAddress,
DWORD *SrcBuffer,
DWORD *DstBuffer,
DWORD Length ) // in bytes
{ DWORD i;
DWORD buffer[2], ivectorL, ivectorR, oldSrcL, oldSrcR;
ivectorL = IVector[0];
ivectorR = IVector[1];
for(i = 0; i < (Length >> 2); i = i+2)
{
buffer[0] = oldSrcL = SrcBuffer[i];
buffer[1] = oldSrcR = SrcBuffer[i+1];
// Encrypted Data -> new IV,
// then do EBC decryption of Encrypted Data,
// then XOR decrypted data with old IV
DES3_ECB_mode( (BYTE *)buffer, (BYTE *)buffer,
KeyAddress, DES_ECB_DECRYPT );
DstBuffer[i] = buffer[0] ^ ivectorL;
DstBuffer[i+1] = buffer[1] ^ ivectorR;
ivectorL = oldSrcL;
ivectorR = oldSrcR;
}
}
//*********** 3DES Key Extension **************
BOOL
KeyExtend( PUCHAR KeySource,
PDWORD KeyDestination )
{
int i;
for(i=0; i < DES_KEYS_IN_TRIPLE_DES; i++)
{
DES_KeyExtend( &(KeySource[i * (KEY_LENGTH_DES / 8)]),
&(KeyDestination[ i * (KEY_LENGTH_EXTENDED_DES / (8*4)) ] ) );
}
return TRUE;
}
char _3des_c[]="$Id: 3des.c,v 1.3 2002/10/29 07:11:46 crypt Rel-1.6-5 $";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -