如何在C语言中使用tiny-aes 128库?

5 c encryption aes

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

我的代码如下:

    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);
    }
Run Code Online (Sandbox Code Playgroud)

我从小型AES 128库中使用的功能是这样的:

void AES128_CBC_encrypt_buffer(uint8_t* output, uint8_t* input, uint32_t length, const uint8_t* key, const uint8_t* iv)
Run Code Online (Sandbox Code Playgroud)

但是,打印“密码”的最后一行为空。我相信它应该在加密后打印原始输入的密文。这是使用库的正确方法吗?谢谢。

编辑:我在这里更新了代码,其中“密码”现在以一种奇怪的方式打印字符。它在加密前后会打印相同的内容,但实际情况并非如此。即使我将“键”和“ IV”更改为16位,并输入消息“ in”为64位,情况也是如此。这是输出的一部分:

cipher(before): 20003A34
cipher[0]: 20003A34
cipher[1]: 20003A34
cipher[2]: 20003A34
         .
         .
cipher[63]: 20003A34
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 5

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

这个:

unsigned char *cipher = "";
Run Code Online (Sandbox Code Playgroud)

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

这不会给您任何可写空间,因为字符串文字是只读的,因此尝试在其中写入整个加密块会给您带来未定义的行为。

要修复它,您需要:

unsigned char in[] = "THJmaoeuf2jsn4jebc7ak3mUdnyHeklOYopdna/OOndu3bis/E7jTd/enasduR3h";   //64 bits
unsigned char cipher[sizeof in];
Run Code Online (Sandbox Code Playgroud)

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