【问题标题】:Issue with AES encrypting a 0x00 charAES 加密 0x00 字符的问题
【发布时间】:2020-06-09 07:28:16
【问题描述】:

我目前正在开发一个使用 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*/

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

【问题讨论】:

  • 请用您用来调用加密函数的代码更新您的问题。

标签: c encryption aes


【解决方案1】:

您正在使用 strlen(in),它最多计数到第一个 nul 字节 (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));

但是,如果您为可变长度数组重写代码,这将不起作用。在这种情况下,您应该将长度作为额外参数传递。

【讨论】:

  • 确实,这是我的一个非常愚蠢的错误。对此感到抱歉,非常感谢。
  • 请使用sizeof(in) 使用代码版本更新您的答案,以便未来的程序员可以立即来到这里查看工作代码。
猜你喜欢
  • 2012-01-18
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 2013-10-16
相关资源
最近更新 更多