如何在c中使用tiny-aes 128库?

时间:2017-10-11 08:11:44

标签: c encryption aes

我想在C中为AES128使用微型AES库(https://github.com/kokke/tiny-AES-c)进行加密。

我的代码如下:

    unsigned char cipher[64];
    unsigned char in[] = "THJmaoeuf2jsn4jebc7ak3mUdnyHeklOYopdna/OOndu3bis/E7jTd/enasduR3h";   //64 bits

    printf("Size of AES input msg: %d \n", sizeof(in));              

    unsigned char key[] = "Gns7AauH3dnaod==";    //16 bits
    unsigned char IV[] = "vhdNaleuTHenaOlL";     //16 bits

    printf("cipher(before): %x \n", cipher);

    AES128_CBC_encrypt_buffer(cipher, in, 64, key, IV);

    for(int n=0; n<64; n++){
        printf("cipher[%d]: %x \n", n, cipher);
    }

我在微型AES 128库中使用的功能是:

void AES128_CBC_encrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, const uint8_t* key, const uint8_t* iv)

然而,最后一行印刷&#39;密码&#39;是空的。我相信它应该在加密后打印原始输入的密文。这是使用库的正确方法吗?谢谢。

编辑:我在这里更新了代码,其中包含了密码&#39;现在正以奇怪的方式打印字符。它在加密之前和之后打印相同的东西,但情况并非如此。即使我更改了“键”,情况也是如此。和&#39; IV&#39;为16位并输入消息&#39; in&#39;为64位。以下是输出的一部分:

cipher(before): 20003A34
cipher[0]: 20003A34
cipher[1]: 20003A34
cipher[2]: 20003A34
         .
         .
cipher[63]: 20003A34

3 个答案:

答案 0 :(得分:3)

您的代码有未定义的行为。

此:

unsigned char *cipher = "";

使cipher成为指向单个字节的指针,其值为0(字符串终止符)。这有点可疑,因为字符串文字不能保证为unsigned char(它们只是char有签名或无符号)但我认为它会构建。

这不会给你任何可写空间,因为字符串文字是只读的,所以尝试在那里写一个完整的加密块会给你未定义的行为。

要解决此问题,您需要:

unsigned char in[] = "THJmaoeuf2jsn4jebc7ak3mUdnyHeklOYopdna/OOndu3bis/E7jTd/enasduR3h";   //64 bits
unsigned char cipher[sizeof in];

此外,加密数据很可能不是有效的C字符串,它可能包含0字节,因此无论如何都无法使用printf("%s", ...);正确打印。

答案 1 :(得分:0)

在行中:        printf(&#34; cipher [%d]:%x \ n&#34;,n,cipher);

将其更改为:        printf(&#34; cipher [%d]:%x \ n&#34;,n,cipher [n]);

这样,输出密码的每个字节而不是你得到的密码地址。

答案 2 :(得分:0)

在aes.h中选择128,通过

#define AES128 1

及以下是加密和解密的示例

struct AES_ctx ctx;

uint8_t key[] = "aaaaaaaaaaaaaaaa";
uint8_t iv[]  = "bbbbbbbbbbbbbbbb";
uint8_t str[] = "This a sample text, Length eq 32";

printf("\n raw buffer \n");
for (int i = 0; i < 32; ++i) {
    printf("%.2x", str[i]);
}

AES_init_ctx_iv(&ctx, key, iv);
AES_CBC_encrypt_buffer(&ctx, str, 32);

printf("\n Encrypted buffer\n");

for (int i = 0; i < 32; ++i) {
    printf("%.2x", str[i]);
}

printf("\n Decrypted buffer\n");

AES_init_ctx_iv(&ctx, key, iv);
AES_CBC_decrypt_buffer(&ctx, str, 32);

for (int i = 0; i < 32; ++i) {
    printf("%.2x", str[i]);
}

printf("\n");

*注意:没有提供填充,因此对于CBC和ECB,所有缓冲区应为16字节的倍数。