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)
您的代码具有未定义的行为。
这个:
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", ...);无论如何都不会正确打印。
| 归档时间: |
|
| 查看次数: |
3053 次 |
| 最近记录: |