2

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

  1. 使用大小为 8KB(加密)/5KB(解密)的查找表。
  2. 使用大小为 2KB(加密)/2KB(解密)的查找表。在这种情况下LTC_SMALL_CODE是真的。

这是和的源aes_tab.c代码aes.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

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

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

我正在使用 Ubuntu 16.04 / Debian 8. gcc v-4.9。

4

0 回答 0