AES加密0x00字符的问题

时间:2020-06-09 07:28:16

标签: c encryption aes

我目前正在使用AES-128(使用tiny-aes-c)加密文件的程序。我的第一个包含\ 0的数组有问题:

uint8_t in[16] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52};
uint8_t key[16] = "ABCDEFGHIJKLMNOP";
uint8_t iv[16] = { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff };

struct AES_ctx ctx;
AES_init_ctx_iv(&ctx, key, iv);
AES_CTR_xcrypt_buffer(&ctx, in, strlen((char*)in));
printf("\nENCODED:      %s", (char*)in);
/*Another print for hex values*/

按预期,只有左侧部分被加密,其余部分消失。我应该如何纠正这个问题?谢谢。

1 个答案:

答案 0 :(得分:3)

您使用的是strlen(in),它最多计数到第一个空字节(0x00),在这种情况下,它将返回8,而不是缓冲区的全长(16)。

要更正,请通过其他方法确定缓冲区的长度。在这里您已经知道现在是16。您可以在此处使用sizeof(in),例如:

uint8_t in[16] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52};
uint8_t key[16] = "ABCDEFGHIJKLMNOP";
uint8_t iv[16] = { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff };

struct AES_ctx ctx;
AES_init_ctx_iv(&ctx, key, iv);
AES_CTR_xcrypt_buffer(&ctx, in, sizeof(in));

,但是如果您重写可变长度数组的代码,则此操作将无效。在这种情况下,您应该将长度作为附加参数传递。