⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rijn.c

📁 加密解密,安全工具!很有意思的代码
💻 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 + -