我想在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
答案 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字节的倍数。