📄 rijn.c
字号:
/***************************************************************************************
* File: bc_rijn.c
*
* Purpose: Using the Rijndael algorithm in CBC and CFB mode
* We use it with 16-bytes blocks and 256-bit key
*
* Rijndael algorithm's authors:
* Joan Daemen
* Vincent Rijmen
*
* The code is based on Dr B. R. Gladman <brg@gladman.uk.net> algorithm implementation.
*
***************************************************************************************/
#include "bc_types.h"
#include "bc_rijn.h"
#include "aes.h"
/************ RIJNDAEL 32-bit CFB mode encryption *****************/
VOID
encrypt_CFB( DWORD *IVector,
DWORD *KeyAddress,
DWORD *SrcBuffer,
DWORD *DstBuffer,
DWORD Length ) /* in bytes */
{
DWORD i,j,dwLength;
DWORD shReg[4], shRegEnc[4];
for(i=0; i<(R_BLOCK_SIZE/32); i++) shReg[i] = IVector[i];
dwLength = Length>>2; /* Length of buffer in 32-bit DWORDs */
for(i=0; i<dwLength; i++)
{
for(j=0; j<(R_BLOCK_SIZE/32); j++) shRegEnc[j] = shReg[j];
_encrypt((const byte *)shRegEnc, (byte *)shRegEnc, (const aes *)KeyAddress );
DstBuffer[i] = SrcBuffer[i] ^ shRegEnc[ (R_BLOCK_SIZE/32 - 1) ];
for(j=R_BLOCK_SIZE/32; (j--)>0 ;)
{ shReg[ j ] = shReg[ j - 1];
}
shReg[0] = DstBuffer[i];
}
}
/************ RIJNDAEL 32-bit CFB mode decryption *****************/
VOID
decrypt_CFB( DWORD *IVector,
DWORD *KeyAddress,
DWORD *SrcBuffer,
DWORD *DstBuffer,
DWORD Length ) /* in bytes */
{
DWORD i,j,dwLength;
DWORD shReg[4], shRegEnc[4], srcSave;
for(i=0; i<(R_BLOCK_SIZE/32); i++) shReg[i] = IVector[i];
dwLength = Length>>2; /* Length of buffer in 32-bit DWORDs */
for(i=0; i<dwLength; i++)
{
for(j=0; j<(R_BLOCK_SIZE/32); j++) shRegEnc[j] = shReg[j];
srcSave = SrcBuffer[i];
_encrypt((const byte *)shRegEnc, (byte *)shRegEnc, (const aes *)KeyAddress );
DstBuffer[i] = SrcBuffer[i] ^ shRegEnc[ (R_BLOCK_SIZE/32 - 1) ];
for(j=R_BLOCK_SIZE/32; (j--)>0 ;)
{ shReg[ j ] = shReg[ j - 1];
}
shReg[0] = srcSave;
}
}
/************ RIJNDAEL CBC mode encryption *****************/
VOID
Encrypt( DWORD *IVector,
DWORD *KeyAddress,
DWORD *SrcBuffer,
DWORD *DstBuffer,
DWORD Length ) /* in bytes */
{ DWORD i,l;
DWORD ivLocal[4];
for(i=0; i<4; i++) ivLocal[i] = IVector[i&1];
if (Length < (R_BLOCK_SIZE/8))
{
encrypt_CFB(ivLocal,KeyAddress,SrcBuffer,DstBuffer,Length);
return;
}
/* CBC encryption */
for(i=0, l=0; l<(Length>>4); l++, i=i+4)
{
// do ECB encryption of (Initial_Vector XOR Data)
ivLocal[0] ^= SrcBuffer[i ];
ivLocal[1] ^= SrcBuffer[i+1];
ivLocal[2] ^= SrcBuffer[i+2];
ivLocal[3] ^= SrcBuffer[i+3];
_encrypt((const byte *)ivLocal, (byte *)ivLocal, (const aes *)KeyAddress );
DstBuffer[i ] = ivLocal[0];
DstBuffer[i+1] = ivLocal[1];
DstBuffer[i+2] = ivLocal[2];
DstBuffer[i+3] = ivLocal[3];
}
}
/************** RIJNDAEL CBC mode decryption ****************/
VOID
Decrypt( DWORD *IVector,
DWORD *KeyAddress,
DWORD *SrcBuffer,
DWORD *DstBuffer,
DWORD Length ) // in bytes
{ DWORD i,j,l;
DWORD ivOld[4], ivNew[4], buf[4];
for(i=0; i<4; i++) ivOld[i] = IVector[i&1];
if (Length < (R_BLOCK_SIZE/8))
{
decrypt_CFB(ivOld,KeyAddress,SrcBuffer,DstBuffer,Length);
return;
}
/* CBC decryption */
for(i=0, l=0; l<(Length>>4) ; l++, i = i+4)
{
// Encrypted Data -> new IV,
// then do ECB decryption of Encrypted Data,
// then XOR decrypted data with old IV
for(j=0; j<4; j++) buf[j] = ivNew[j] = SrcBuffer[i+j];
_decrypt((const byte *)buf, (byte *)buf, (const aes *)KeyAddress );
for(j=0; j<4; j++)
{ DstBuffer[i+j] = ivOld[j] ^ buf[j];
ivOld[j] = ivNew[j];
}
}
}
////////////////////////////////////////////////////////
BOOL
KeyExtend( PUCHAR KeySource, //32 8-bits bytes - 256-bit key
PDWORD KeyDestination )
{
if (set_key((const byte*)KeySource, KEY_LENGTH / 8, both, (aes *)KeyDestination ) != aes_good)
return FALSE;
return TRUE;
}
char rijn_c[]="$Id: rijn.c,v 1.3 2002/10/29 07:11:46 crypt Rel-1.6-3 $";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -