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

📄 des.c

📁 des 加密算法,VC++6编写的,很不错.
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -