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

📄 3des.c

📁 BestCrypt开源加密原代码
💻 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 + -