如何编译/运行C代码来调用基于libtomcrypt AES 2KB查找表的实现

时间:2018-01-29 16:50:30

标签: c gcc encryption aes libtomcrypt

在Libtomcrypt加密库中,AES加密/解密以两种不同的方式实现。

  1. 使用大小为8KB(加密)/ 5KB(解密)的查找表。
  2. 使用大小为2KB(加密)/ 2KB(解密)的查找表。在这种情况下,LTC_SMALL_CODE为真。
  3. 这是aes_tab.caes.c的源代码。

    #ifdef LTC_SMALL_CODE
    
    #define Te0(x) TE0[x]
    #define Te1(x) RORc(TE0[x], 8)
    #define Te2(x) RORc(TE0[x], 16)
    #define Te3(x) RORc(TE0[x], 24)
    
    #define Td0(x) TD0[x]
    #define Td1(x) RORc(TD0[x], 8)
    #define Td2(x) RORc(TD0[x], 16)
    #define Td3(x) RORc(TD0[x], 24)
    
    #define Te4_0 0x000000FF & Te4
    #define Te4_1 0x0000FF00 & Te4
    #define Te4_2 0x00FF0000 & Te4
    #define Te4_3 0xFF000000 & Te4
    
    #else
    
    #define Te0(x) TE0[x]
    #define Te1(x) TE1[x]
    #define Te2(x) TE2[x]
    #define Te3(x) TE3[x]
    
    #define Td0(x) TD0[x]
    #define Td1(x) TD1[x]
    #define Td2(x) TD2[x]
    #define Td3(x) TD3[x]
    
    #endif /* ENCRYPT_ONLY */
    
    #endif /* SMALL CODE */
    

    以下C代码使用libtomcrypt加密库执行AES加密和解密。 但是,代码调用使用8KB / 5KB查找表的AES实现 (表示LTC_SMALL_CODE条件变为false)。

    //aes_tom_example.c
    #include <tomcrypt.h>
    
    static const unsigned char key[] = {
        0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
        0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
        0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
    };
    
    int main()
    {
    
        unsigned char text[]="hello world!";
        unsigned char enc_out[80];
        unsigned char dec_out[80];
        symmetric_key skey;
        int keysize = 32;
        int status;
    
        status = aes_keysize(&keysize);
    
    
        status = aes_setup(key, 32, 0, &skey);
    
        status = aes_ecb_encrypt(text,enc_out,&skey);
    
        status = aes_ecb_decrypt(enc_out, dec_out, &skey);
    
    
        int i;
    
        printf("original:\t");
        for(i=0;*(text+i)!=0x00;i++)
            printf("%c ",*(text+i));
        printf("\nencrypted:\t");
        for(i=0;*(enc_out+i)!=0x00;i++)
            printf("%X ",*(enc_out+i));
        printf("\ndecrypted:\t");
        for(i=0;*(dec_out+i)!=0x00;i++)
            printf("%c ",*(dec_out+i));
        printf("\n");
    
        return 0;
    } 
    

    编译并运行如下,

    gcc aes_tom_example.c -o aes -ltomcrypt
    ./aes
    
    Sample Output 
    
    original:   h e l l o   w o r l d ! 
    encrypted:  AE 21 D5 A5 5E D5 F1 EF 6D FC E5 30 60 34 3D 12 
    decrypted:  h e l l o   w o r l d ! 
    

    我的问题是:

    • 如何修改此C代码以便调用#ifdef LTC_SMALL_CODE条件部分(意味着调用基于2KB查找表的实现代码)?

    • 如何使用LTC_SMALL_CODE条件true运行上述代码?

    在调用SETUP(aes_setup)函数之前是否需要一些参数?或者我是否需要在编译/运行时传递一些参数?

    如果有人能提供一些链接或示例代码,那就太棒了。

    我使用的是Ubuntu 16.04 / Debian 8. gcc v-4.9。

0 个答案:

没有答案