将16添加到指针?

时间:2017-10-27 06:05:36

标签: c encryption aes

正在查看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);
  }

2 个答案:

答案 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可以安全地保留加密结果。