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

📄 aes.cpp

📁 aes的原代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    *SK++ = *RK++;    *SK++ = *RK++;    *SK++ = *RK++;    *SK++ = *RK++;    return( 0 );}/* AES 128-bit block encryption routine */void aes_encrypt( aes_context *ctx, uint8 input[16], uint8 output[16] ){    uint32 *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;    RK = ctx->erk;    GET_UINT32( X0, input,  0 ); X0 ^= RK[0];    GET_UINT32( X1, input,  4 ); X1 ^= RK[1];    GET_UINT32( X2, input,  8 ); X2 ^= RK[2];    GET_UINT32( X3, input, 12 ); X3 ^= RK[3];#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3)     \{                                               \    RK += 4;                                    \                                                \    X0 = RK[0] ^ FT0[ (uint8) ( Y0 >> 24 ) ] ^  \                 FT1[ (uint8) ( Y1 >> 16 ) ] ^  \                 FT2[ (uint8) ( Y2 >>  8 ) ] ^  \                 FT3[ (uint8) ( Y3       ) ];   \                                                \    X1 = RK[1] ^ FT0[ (uint8) ( Y1 >> 24 ) ] ^  \                 FT1[ (uint8) ( Y2 >> 16 ) ] ^  \                 FT2[ (uint8) ( Y3 >>  8 ) ] ^  \                 FT3[ (uint8) ( Y0       ) ];   \                                                \    X2 = RK[2] ^ FT0[ (uint8) ( Y2 >> 24 ) ] ^  \                 FT1[ (uint8) ( Y3 >> 16 ) ] ^  \                 FT2[ (uint8) ( Y0 >>  8 ) ] ^  \                 FT3[ (uint8) ( Y1       ) ];   \                                                \    X3 = RK[3] ^ FT0[ (uint8) ( Y3 >> 24 ) ] ^  \                 FT1[ (uint8) ( Y0 >> 16 ) ] ^  \                 FT2[ (uint8) ( Y1 >>  8 ) ] ^  \                 FT3[ (uint8) ( Y2       ) ];   \}    AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 1 */    AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 2 */    AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 3 */    AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 4 */    AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 5 */    AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 6 */    AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 7 */    AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 8 */    AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 9 */    if( ctx->nr > 10 )    {        AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );   /* round 10 */        AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );   /* round 11 */    }    if( ctx->nr > 12 )    {        AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );   /* round 12 */        AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );   /* round 13 */    }    /* last round */    RK += 4;    X0 = RK[0] ^ ( FSb[ (uint8) ( Y0 >> 24 ) ] << 24 ) ^                 ( FSb[ (uint8) ( Y1 >> 16 ) ] << 16 ) ^                 ( FSb[ (uint8) ( Y2 >>  8 ) ] <<  8 ) ^                 ( FSb[ (uint8) ( Y3       ) ]       );    X1 = RK[1] ^ ( FSb[ (uint8) ( Y1 >> 24 ) ] << 24 ) ^                 ( FSb[ (uint8) ( Y2 >> 16 ) ] << 16 ) ^                 ( FSb[ (uint8) ( Y3 >>  8 ) ] <<  8 ) ^                 ( FSb[ (uint8) ( Y0       ) ]       );    X2 = RK[2] ^ ( FSb[ (uint8) ( Y2 >> 24 ) ] << 24 ) ^                 ( FSb[ (uint8) ( Y3 >> 16 ) ] << 16 ) ^                 ( FSb[ (uint8) ( Y0 >>  8 ) ] <<  8 ) ^                 ( FSb[ (uint8) ( Y1       ) ]       );    X3 = RK[3] ^ ( FSb[ (uint8) ( Y3 >> 24 ) ] << 24 ) ^                 ( FSb[ (uint8) ( Y0 >> 16 ) ] << 16 ) ^                 ( FSb[ (uint8) ( Y1 >>  8 ) ] <<  8 ) ^                 ( FSb[ (uint8) ( Y2       ) ]       );    PUT_UINT32( X0, output,  0 );    PUT_UINT32( X1, output,  4 );    PUT_UINT32( X2, output,  8 );    PUT_UINT32( X3, output, 12 );}/* AES 128-bit block decryption routine */void aes_decrypt( aes_context *ctx, uint8 input[16], uint8 output[16] ){    uint32 *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;    RK = ctx->drk;    GET_UINT32( X0, input,  0 ); X0 ^= RK[0];    GET_UINT32( X1, input,  4 ); X1 ^= RK[1];    GET_UINT32( X2, input,  8 ); X2 ^= RK[2];    GET_UINT32( X3, input, 12 ); X3 ^= RK[3];#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3)     \{                                               \    RK += 4;                                    \                                                \    X0 = RK[0] ^ RT0[ (uint8) ( Y0 >> 24 ) ] ^  \                 RT1[ (uint8) ( Y3 >> 16 ) ] ^  \                 RT2[ (uint8) ( Y2 >>  8 ) ] ^  \                 RT3[ (uint8) ( Y1       ) ];   \                                                \    X1 = RK[1] ^ RT0[ (uint8) ( Y1 >> 24 ) ] ^  \                 RT1[ (uint8) ( Y0 >> 16 ) ] ^  \                 RT2[ (uint8) ( Y3 >>  8 ) ] ^  \                 RT3[ (uint8) ( Y2       ) ];   \                                                \    X2 = RK[2] ^ RT0[ (uint8) ( Y2 >> 24 ) ] ^  \                 RT1[ (uint8) ( Y1 >> 16 ) ] ^  \                 RT2[ (uint8) ( Y0 >>  8 ) ] ^  \                 RT3[ (uint8) ( Y3       ) ];   \                                                \    X3 = RK[3] ^ RT0[ (uint8) ( Y3 >> 24 ) ] ^  \                 RT1[ (uint8) ( Y2 >> 16 ) ] ^  \                 RT2[ (uint8) ( Y1 >>  8 ) ] ^  \                 RT3[ (uint8) ( Y0       ) ];   \}    AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 1 */    AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 2 */    AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 3 */    AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 4 */    AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 5 */    AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 6 */    AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 7 */    AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 8 */    AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 9 */    if( ctx->nr > 10 )    {        AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );   /* round 10 */        AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );   /* round 11 */    }    if( ctx->nr > 12 )    {        AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );   /* round 12 */        AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );   /* round 13 */    }    /* last round */    RK += 4;    X0 = RK[0] ^ ( RSb[ (uint8) ( Y0 >> 24 ) ] << 24 ) ^                 ( RSb[ (uint8) ( Y3 >> 16 ) ] << 16 ) ^                 ( RSb[ (uint8) ( Y2 >>  8 ) ] <<  8 ) ^                 ( RSb[ (uint8) ( Y1       ) ]       );    X1 = RK[1] ^ ( RSb[ (uint8) ( Y1 >> 24 ) ] << 24 ) ^                 ( RSb[ (uint8) ( Y0 >> 16 ) ] << 16 ) ^                 ( RSb[ (uint8) ( Y3 >>  8 ) ] <<  8 ) ^                 ( RSb[ (uint8) ( Y2       ) ]       );    X2 = RK[2] ^ ( RSb[ (uint8) ( Y2 >> 24 ) ] << 24 ) ^                 ( RSb[ (uint8) ( Y1 >> 16 ) ] << 16 ) ^                 ( RSb[ (uint8) ( Y0 >>  8 ) ] <<  8 ) ^                 ( RSb[ (uint8) ( Y3       ) ]       );    X3 = RK[3] ^ ( RSb[ (uint8) ( Y3 >> 24 ) ] << 24 ) ^                 ( RSb[ (uint8) ( Y2 >> 16 ) ] << 16 ) ^                 ( RSb[ (uint8) ( Y1 >>  8 ) ] <<  8 ) ^                 ( RSb[ (uint8) ( Y0       ) ]       );    PUT_UINT32( X0, output,  0 );    PUT_UINT32( X1, output,  4 );    PUT_UINT32( X2, output,  8 );    PUT_UINT32( X3, output, 12 );}#ifdef TEST#include <string.h>#include <stdio.h>/* * Rijndael Monte Carlo Test: ECB mode * source: NIST - rijndael-vals.zip */static unsigned char AES_enc_test[3][16] ={    { 0xA0, 0x43, 0x77, 0xAB, 0xE2, 0x59, 0xB0, 0xD0,      0xB5, 0xBA, 0x2D, 0x40, 0xA5, 0x01, 0x97, 0x1B },    { 0x4E, 0x46, 0xF8, 0xC5, 0x09, 0x2B, 0x29, 0xE2,      0x9A, 0x97, 0x1A, 0x0C, 0xD1, 0xF6, 0x10, 0xFB },    { 0x1F, 0x67, 0x63, 0xDF, 0x80, 0x7A, 0x7E, 0x70,      0x96, 0x0D, 0x4C, 0xD3, 0x11, 0x8E, 0x60, 0x1A }};    static unsigned char AES_dec_test[3][16] ={    { 0xF5, 0xBF, 0x8B, 0x37, 0x13, 0x6F, 0x2E, 0x1F,      0x6B, 0xEC, 0x6F, 0x57, 0x20, 0x21, 0xE3, 0xBA },    { 0xF1, 0xA8, 0x1B, 0x68, 0xF6, 0xE5, 0xA6, 0x27,      0x1A, 0x8C, 0xB2, 0x4E, 0x7D, 0x94, 0x91, 0xEF },    { 0x4D, 0xE0, 0xC6, 0xDF, 0x7C, 0xB1, 0x69, 0x72,      0x84, 0x60, 0x4D, 0x60, 0x27, 0x1B, 0xC5, 0x9A }};    /*int main( void ){    int m, n, i, j;    aes_context ctx;    unsigned char buf[16];    unsigned char key[32];    for( m = 0; m < 2; m++ )    {        printf( "\n Rijndael Monte Carlo Test (ECB mode) - " );        if( m == 0 ) printf( "encryption\n\n" );        if( m == 1 ) printf( "decryption\n\n" );        for( n = 0; n < 3; n++ )        {            printf( " Test %d, key size = %3d bits: ",                    n + 1, 128 + n * 64 );            fflush( stdout );            memset( buf, 0, 16 );            memset( key, 0, 16 + n * 8 );            for( i = 0; i < 400; i++ )            {                aes_set_key( &ctx, key, 128 + n * 64 );                for( j = 0; j < 9999; j++ )                {                    if( m == 0 ) aes_encrypt( &ctx, buf, buf );                    if( m == 1 ) aes_decrypt( &ctx, buf, buf );                }                if( n > 0 )                {                    for( j = 0; j < (n << 3); j++ )                    {                        key[j] ^= buf[j + 16 - (n << 3)];                    }                }                if( m == 0 ) aes_encrypt( &ctx, buf, buf );                if( m == 1 ) aes_decrypt( &ctx, buf, buf );                for( j = 0; j < 16; j++ )                {                    key[j + (n << 3)] ^= buf[j];                }            }            if( ( m == 0 && memcmp( buf, AES_enc_test[n], 16 ) != 0 ) ||                ( m == 1 && memcmp( buf, AES_dec_test[n], 16 ) != 0 ) )            {                printf( "failed!\n" );                return( 1 );            }            printf( "passed.\n" );        }    }    printf( "\n" );    return( 0 );}*/#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -