📄 des.c
字号:
DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_FP( Y, X ); PUT_UINT32_BE( Y, output, 0 ); PUT_UINT32_BE( X, output, 4 );}/* * DES block encryption (ECB mode) */void des_encrypt( des_context *ctx, unsigned char input[8], unsigned char output[8] ){ des_crypt( ctx->esk, input, output );}/* * DES block decryption (ECB mode) */void des_decrypt( des_context *ctx, unsigned char input[8], unsigned char output[8] ){ des_crypt( ctx->dsk, input, output );}/* * DES-CBC buffer encryption */void des_cbc_encrypt( des_context *ctx, unsigned char iv[8], unsigned char *input, unsigned char *output, int len ){ int i; while( len > 0 ) { for( i = 0; i < 8; i++ ) output[i] = input[i] ^ iv[i]; des_crypt( ctx->esk, output, output ); memcpy( iv, output, 8 ); input += 8; output += 8; len -= 8; }}/* * DES-CBC buffer decryption */void des_cbc_decrypt( des_context *ctx, unsigned char iv[8], unsigned char *input, unsigned char *output, int len ){ int i; unsigned char temp[8]; while( len > 0 ) { memcpy( temp, input, 8 ); des_crypt( ctx->dsk, input, output ); for( i = 0; i < 8; i++ ) output[i] = output[i] ^ iv[i]; memcpy( iv, temp, 8 ); input += 8; output += 8; len -= 8; }}/* * Triple-DES key schedule (112-bit) */void des3_set_2keys( des3_context *ctx, unsigned char key[16] ){ int i; des_main_ks( ctx->esk , key ); des_main_ks( ctx->dsk + 32, key + 8 ); for( i = 0; i < 32; i += 2 ) { ctx->dsk[i ] = ctx->esk[30 - i]; ctx->dsk[i + 1] = ctx->esk[31 - i]; ctx->esk[i + 32] = ctx->dsk[62 - i]; ctx->esk[i + 33] = ctx->dsk[63 - i]; ctx->esk[i + 64] = ctx->esk[ i]; ctx->esk[i + 65] = ctx->esk[ 1 + i]; ctx->dsk[i + 64] = ctx->dsk[ i]; ctx->dsk[i + 65] = ctx->dsk[ 1 + i]; }}/* * Triple-DES key schedule (168-bit) */void des3_set_3keys( des3_context *ctx, unsigned char key[24] ){ int i; des_main_ks( ctx->esk , key ); des_main_ks( ctx->dsk + 32, key + 8 ); des_main_ks( ctx->esk + 64, key + 16 ); for( i = 0; i < 32; i += 2 ) { ctx->dsk[i ] = ctx->esk[94 - i]; ctx->dsk[i + 1] = ctx->esk[95 - i]; ctx->esk[i + 32] = ctx->dsk[62 - i]; ctx->esk[i + 33] = ctx->dsk[63 - i]; ctx->dsk[i + 64] = ctx->esk[30 - i]; ctx->dsk[i + 65] = ctx->esk[31 - i]; }}static void des3_crypt( unsigned long SK[96], unsigned char input[8], unsigned char output[8] ){ unsigned long X, Y, T; GET_UINT32_BE( X, input, 0 ); GET_UINT32_BE( Y, input, 4 ); DES_IP( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_ROUND( Y, X ); DES_ROUND( X, Y ); DES_FP( Y, X ); PUT_UINT32_BE( Y, output, 0 ); PUT_UINT32_BE( X, output, 4 );}/* * Triple-DES block encryption (ECB mode) */void des3_encrypt( des3_context *ctx, unsigned char input[8], unsigned char output[8] ){ des3_crypt( ctx->esk, input, output );}/* * Triple-DES block decryption (ECB mode) */void des3_decrypt( des3_context *ctx, unsigned char input[8], unsigned char output[8] ){ des3_crypt( ctx->dsk, input, output );}/* * 3DES-CBC buffer encryption */void des3_cbc_encrypt( des3_context *ctx, unsigned char iv[8], unsigned char *input, unsigned char *output, int len ){ int i; while( len > 0 ) { for( i = 0; i < 8; i++ ) output[i] = input[i] ^ iv[i]; des3_crypt( ctx->esk, output, output ); memcpy( iv, output, 8 ); input += 8; output += 8; len -= 8; }}/* * 3DES-CBC buffer decryption */void des3_cbc_decrypt( des3_context *ctx, unsigned char iv[8], unsigned char *input, unsigned char *output, int len ){ int i; unsigned char temp[8]; while( len > 0 ) { memcpy( temp, input, 8 ); des3_crypt( ctx->dsk, input, output ); for( i = 0; i < 8; i++ ) output[i] = output[i] ^ iv[i]; memcpy( iv, temp, 8 ); input += 8; output += 8; len -= 8; }}#ifdef SELF_TEST#include <stdio.h>/* * DES/3DES test vectors (source: NIST, tripledes-vectors.zip) */static const unsigned char DES3_keys[24] ={ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23};static const unsigned char DES3_init[8] ={ 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74};static const unsigned char DES3_enc_test[3][8] ={ { 0x6A, 0x2A, 0x19, 0xF4, 0x1E, 0xCA, 0x85, 0x4B }, { 0x03, 0xE6, 0x9F, 0x5B, 0xFA, 0x58, 0xEB, 0x42 }, { 0xDD, 0x17, 0xE8, 0xB8, 0xB4, 0x37, 0xD2, 0x32 }}; static const unsigned char DES3_dec_test[3][8] ={ { 0xCD, 0xD6, 0x4F, 0x2F, 0x94, 0x27, 0xC1, 0x5D }, { 0x69, 0x96, 0xC8, 0xFA, 0x47, 0xA2, 0xAB, 0xEB }, { 0x83, 0x25, 0x39, 0x76, 0x44, 0x09, 0x1A, 0x0A }};/* * Checkup routine */int des_self_test( void ){ int i, j, u, v; des_context ctx; des3_context ctx3; unsigned char buf[8]; for( i = 0; i < 6; i++ ) { u = i >> 1; v = i & 1; printf( " DES%c-EBC-%3d (%s): ", ( u == 0 ) ? ' ' : '3', 64 + u * 64, ( v == 0 ) ? "enc" : "dec" ); memcpy( buf, DES3_init, 8 ); if( u == 0 ) des_set_key( &ctx, (unsigned char *) DES3_keys ); if( u == 1 ) des3_set_2keys( &ctx3, (unsigned char *) DES3_keys ); if( u == 2 ) des3_set_3keys( &ctx3, (unsigned char *) DES3_keys ); for( j = 0; j < 10000; j++ ) { if( u == 0 ) { if( v == 0 ) des_encrypt( &ctx, buf, buf ); if( v == 1 ) des_decrypt( &ctx, buf, buf ); } else { if( v == 0 ) des3_encrypt( &ctx3, buf, buf ); if( v == 1 ) des3_decrypt( &ctx3, buf, buf ); } } if( ( v == 0 && memcmp( buf, DES3_enc_test[u], 8 ) != 0 ) || ( v == 1 && memcmp( buf, DES3_dec_test[u], 8 ) != 0 ) ) { printf( "failed\n" ); return( 1 ); } printf( "passed\n" ); } printf( "\n" ); return( 0 );}#elseint des_self_test( void ){ return( 0 );}#endif
void main()
{
//des_self_test();
des3_context ctx3_test;
// unsigned char DES3_keys_test[24] =
// {
// 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
// 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01,
// 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23
// };
unsigned char DES3_keys_test[24] =
{
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10
};
unsigned char buf_test[16] = {0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8};
unsigned char res_test[16] = {0};
int i=0;
des3_set_2keys( &ctx3_test, (unsigned char *) DES3_keys_test);
des3_encrypt( &ctx3_test, buf_test, buf_test );
des3_decrypt( &ctx3_test, buf_test, res_test );
for(i = 0; i<8; ++i)
printf("%02X ", buf_test[i]);
printf("\n");
for(i = 0; i<8; ++i)
printf("%02X ", res_test[i]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -