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

📄 crypto.c

📁 java softwar for you to send out the request
💻 C
📖 第 1 页 / 共 2 页
字号:
    sha1_update( ctx, sha1_padding, padn );    sha1_update( ctx, msglen, 8 );    PUT_UINT32_BE( ctx->state[0], digest,  0 );    PUT_UINT32_BE( ctx->state[1], digest,  4 );    PUT_UINT32_BE( ctx->state[2], digest,  8 );    PUT_UINT32_BE( ctx->state[3], digest, 12 );    PUT_UINT32_BE( ctx->state[4], digest, 16 );}void hmac_sha1( uint8 *key, int keylen, uint8 *buffer, int length,                uint8 digest[20] ){    int i;    sha1_context ctx;    uint8 k_ipad[64];    uint8 k_opad[64];    uint8 tmpbuf[20];    memset( k_ipad, 0, sizeof( k_ipad ) );    memset( k_opad, 0, sizeof( k_opad ) );    memcpy( k_ipad, key, keylen );    memcpy( k_opad, key, keylen );    for( i = 0; i < 64; i++ )    {        k_ipad[i] ^= 0x36;        k_opad[i] ^= 0x5C;    }    sha1_starts( &ctx );    sha1_update( &ctx, k_ipad, 64 );    sha1_update( &ctx, buffer, length );    sha1_finish( &ctx, tmpbuf );    sha1_starts( &ctx );    sha1_update( &ctx, k_opad, 64 );    sha1_update( &ctx, tmpbuf, 20 );    sha1_finish( &ctx, digest );}/* An implementation of the ARC4 algorithm */void rc4_setup( struct rc4_state *s, unsigned char *key,  int length ){    int i, j, k, *m, a;    s->x = 0;    s->y = 0;	m = s->m;    for( i = 0; i < 256; i++ )    {        m[i] = i;    }    j = k = 0;    for(i=0 ; i < 256; i++ )    {        a = m[i];        j = (unsigned char) ( j + a + key[k] );        m[i] = m[j]; m[j] = a;        if( ++k >= length ) k = 0;    }}void rc4_crypt( struct rc4_state *s, unsigned char *data, int length ){     int i, x, y, *m, a, b;    x = s->x;    y = s->y;    m = s->m;    for( i = 0; i < length; i++ )    {        x = (unsigned char) ( x + 1 ); a = m[x];        y = (unsigned char) ( y + a );        m[x] = b = m[y];        m[y] = a;        data[i] ^= m[(unsigned char) ( a + b )];    }    s->x = x;    s->y = y;}/* FIPS-197 compliant AES implementation *//* forward S-box & tables */uint32 FSb[256];uint32 FT0[256]; uint32 FT1[256]; uint32 FT2[256]; uint32 FT3[256]; /* reverse S-box & tables */uint32 RSb[256];uint32 RT0[256];uint32 RT1[256];uint32 RT2[256];uint32 RT3[256];/* round constants */uint32 RCON[10];/* tables generation flag */int do_init = 1;/* tables generation routine */#define ROTR8(x) ( ( ( x << 24 ) & 0xFFFFFFFF ) | \                   ( ( x & 0xFFFFFFFF ) >>  8 ) )#define XTIME(x) ( ( x <<  1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) )#define MUL(x,y) ( ( x &&  y ) ? pow[(log[x] + log[y]) % 255] : 0 )void aes_gen_tables( void ){    int i;    uint8 x, y;    uint8 pow[256];    uint8 log[256];    /* compute pow and log tables over GF(2^8) */    for( i = 0, x = 1; i < 256; i++, x ^= XTIME( x ) )    {        pow[i] = x;        log[x] = i;    }    /* calculate the round constants */    for( i = 0, x = 1; i < 10; i++, x = XTIME( x ) )    {        RCON[i] = (uint32) x << 24;    }    /* generate the forward and reverse S-boxes */    FSb[0x00] = 0x63;    RSb[0x63] = 0x00;    for( i = 1; i < 256; i++ )    {        x = pow[255 - log[i]];        y = x;  y = ( y << 1 ) | ( y >> 7 );        x ^= y; y = ( y << 1 ) | ( y >> 7 );        x ^= y; y = ( y << 1 ) | ( y >> 7 );        x ^= y; y = ( y << 1 ) | ( y >> 7 );        x ^= y ^ 0x63;        FSb[i] = x;        RSb[x] = i;    }    /* generate the forward and reverse tables */    for( i = 0; i < 256; i++ )    {        x = (unsigned char) FSb[i]; y = XTIME( x );        FT0[i] =   (uint32) ( x ^ y ) ^                 ( (uint32) x <<  8 ) ^                 ( (uint32) x << 16 ) ^                 ( (uint32) y << 24 );        FT0[i] &= 0xFFFFFFFF;        FT1[i] = ROTR8( FT0[i] );        FT2[i] = ROTR8( FT1[i] );        FT3[i] = ROTR8( FT2[i] );        y = (unsigned char) RSb[i];        RT0[i] = ( (uint32) MUL( 0x0B, y )       ) ^                 ( (uint32) MUL( 0x0D, y ) <<  8 ) ^                 ( (uint32) MUL( 0x09, y ) << 16 ) ^                 ( (uint32) MUL( 0x0E, y ) << 24 );        RT0[i] &= 0xFFFFFFFF;        RT1[i] = ROTR8( RT0[i] );        RT2[i] = ROTR8( RT1[i] );        RT3[i] = ROTR8( RT2[i] );    }}/* decryption key schedule tables */int KT_init = 1;uint32 KT0[256];uint32 KT1[256];uint32 KT2[256];uint32 KT3[256];/* AES key scheduling routine */int aes_set_key( aes_context *ctx, uint8 *key, int nbits ){    int i;    uint32 *RK, *SK;    if( do_init )    {        aes_gen_tables();        do_init = 0;    }    switch( nbits )    {        case 128: ctx->nr = 10; break;        case 192: ctx->nr = 12; break;        case 256: ctx->nr = 14; break;        default : return( 1 );    }    RK = ctx->erk;    for( i = 0; i < (nbits >> 5); i++ )    {        GET_UINT32_BE( RK[i], key, i * 4 );    }    /* setup encryption round keys */    switch( nbits )    {    case 128:        for( i = 0; i < 10; i++, RK += 4 )        {            RK[4]  = RK[0] ^ RCON[i] ^                        ( FSb[ (uint8) ( RK[3] >> 16 ) ] << 24 ) ^                        ( FSb[ (uint8) ( RK[3] >>  8 ) ] << 16 ) ^                        ( FSb[ (uint8) ( RK[3]       ) ] <<  8 ) ^                        ( FSb[ (uint8) ( RK[3] >> 24 ) ]       );            RK[5]  = RK[1] ^ RK[4];            RK[6]  = RK[2] ^ RK[5];            RK[7]  = RK[3] ^ RK[6];        }        break;    case 192:        for( i = 0; i < 8; i++, RK += 6 )        {            RK[6]  = RK[0] ^ RCON[i] ^                        ( FSb[ (uint8) ( RK[5] >> 16 ) ] << 24 ) ^                        ( FSb[ (uint8) ( RK[5] >>  8 ) ] << 16 ) ^                        ( FSb[ (uint8) ( RK[5]       ) ] <<  8 ) ^                        ( FSb[ (uint8) ( RK[5] >> 24 ) ]       );            RK[7]  = RK[1] ^ RK[6];            RK[8]  = RK[2] ^ RK[7];            RK[9]  = RK[3] ^ RK[8];            RK[10] = RK[4] ^ RK[9];            RK[11] = RK[5] ^ RK[10];        }        break;    case 256:        for( i = 0; i < 7; i++, RK += 8 )        {            RK[8]  = RK[0] ^ RCON[i] ^                        ( FSb[ (uint8) ( RK[7] >> 16 ) ] << 24 ) ^                        ( FSb[ (uint8) ( RK[7] >>  8 ) ] << 16 ) ^                        ( FSb[ (uint8) ( RK[7]       ) ] <<  8 ) ^                        ( FSb[ (uint8) ( RK[7] >> 24 ) ]       );            RK[9]  = RK[1] ^ RK[8];            RK[10] = RK[2] ^ RK[9];            RK[11] = RK[3] ^ RK[10];            RK[12] = RK[4] ^                        ( FSb[ (uint8) ( RK[11] >> 24 ) ] << 24 ) ^                        ( FSb[ (uint8) ( RK[11] >> 16 ) ] << 16 ) ^                        ( FSb[ (uint8) ( RK[11] >>  8 ) ] <<  8 ) ^                        ( FSb[ (uint8) ( RK[11]       ) ]       );            RK[13] = RK[5] ^ RK[12];            RK[14] = RK[6] ^ RK[13];            RK[15] = RK[7] ^ RK[14];        }        break;    }    /* setup decryption round keys */    if( KT_init )    {        for( i = 0; i < 256; i++ )        {            KT0[i] = RT0[ FSb[i] ];            KT1[i] = RT1[ FSb[i] ];            KT2[i] = RT2[ FSb[i] ];            KT3[i] = RT3[ FSb[i] ];        }        KT_init = 0;    }    SK = ctx->drk;    *SK++ = *RK++;    *SK++ = *RK++;    *SK++ = *RK++;    *SK++ = *RK++;    for( i = 1; i < ctx->nr; i++ )    {        RK -= 8;        *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^                KT1[ (uint8) ( *RK >> 16 ) ] ^                KT2[ (uint8) ( *RK >>  8 ) ] ^                KT3[ (uint8) ( *RK       ) ]; RK++;        *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^                KT1[ (uint8) ( *RK >> 16 ) ] ^                KT2[ (uint8) ( *RK >>  8 ) ] ^                KT3[ (uint8) ( *RK       ) ]; RK++;        *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^                KT1[ (uint8) ( *RK >> 16 ) ] ^                KT2[ (uint8) ( *RK >>  8 ) ] ^                KT3[ (uint8) ( *RK       ) ]; RK++;        *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^                KT1[ (uint8) ( *RK >> 16 ) ] ^                KT2[ (uint8) ( *RK >>  8 ) ] ^                KT3[ (uint8) ( *RK       ) ]; RK++;    }    RK -= 8;    *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_BE( X0, input,  0 ); X0 ^= RK[0];    GET_UINT32_BE( X1, input,  4 ); X1 ^= RK[1];    GET_UINT32_BE( X2, input,  8 ); X2 ^= RK[2];    GET_UINT32_BE( 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_BE( X0, output,  0 );    PUT_UINT32_BE( X1, output,  4 );    PUT_UINT32_BE( X2, output,  8 );    PUT_UINT32_BE( 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_BE( X0, input,  0 ); X0 ^= RK[0];    GET_UINT32_BE( X1, input,  4 ); X1 ^= RK[1];    GET_UINT32_BE( X2, input,  8 ); X2 ^= RK[2];    GET_UINT32_BE( 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_BE( X0, output,  0 );    PUT_UINT32_BE( X1, output,  4 );    PUT_UINT32_BE( X2, output,  8 );    PUT_UINT32_BE( X3, output, 12 );}

⌨️ 快捷键说明

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