正在查看TinyAES(https://github.com/kokke/tiny-AES-c/blob/master/aes.c),我遇到了一段我不理解的代码片段。
假设AES-128(意思是16字节密钥和块大小),不会在输出结果中添加16作为0,因为for循环只会迭代一次?
主要的AES-CBC加密功能。
for (i = 0; i < 16; i += 16)
{
XorWithIv(input);
memcpy(output, input, BLOCKLEN);
state = (state_t*)output;
Cipher();
Iv = output;
input += BLOCKLEN;
output += BLOCKLEN;
//printf("Step %d - %d", i/16, i);
}
答案 0 :(得分:1)
输入长度不是密钥。密钥长度使用宏确定。
如果输入的长度为16
,则只需执行一次即可。
我们没有在结果的输出中添加16。仔细检查算法。
答案 1 :(得分:1)
output
是一个指针。在这种情况下,output+=16
可能意味着output
为零,甚至更糟,它可能超出范围。但是你应该保存另一个指向加密输出开头的指针。
示例:
uint8_t buffer[32]={0};
uint8_t *output = buffer;
...
for(i = 0; i < 32; i += 16)
{
XorWithIv(input);
//changing output is the same as changing buffer from index i to i + BLOCKLEN
memcpy(output, input, BLOCKLEN);
state = (state_t*)output;
Cipher();
Iv = output;
input += BLOCKLEN;
output += BLOCKLEN; //<== prepare to change the next block in buffer
}
在此示例中,output
被修改两次。它现在指向buffer[32]
,它超出范围。但是buffer
可以安全地保留加密结果。