0

我正在为一个学校项目实施 AES。我有一个函数 aes_block,它接受 uint8_t 的一维数组(长度为 16)作为消息;我想就地加密这条消息。第一步是将字节 in[0], in[1], ... in[15] 映射到二维状态数组 s[0,0], s[1,0], s[2, 0], s[3,0], s[0,1], ..., s[3,3],由 FIPS 197 指定。我尝试这样做:

void aes_block(int keylen, const uint8_t *key, uint8_t *msg){
    uint8_t state[4][4] = msg;
    ...
}

允许我通过 state[col][row] 来索引状态数组。这给了我一个编译器错误“无效的初始化程序”;我怎样才能完成我想做的事情?

4

3 回答 3

1
uint8_t (*state)[4] = (uint8_t (*)[4]) msg;

解释:

您想将 的字节重新解释msg为 4×4 数组uint8_t。您可以定义state为指向此类数组的指针:

uint8_t (*state)[4][4] = (uint8_t (*)[4][4]) msg;

但是,您随后必须使用(*state)[i][j].

相反,我们只是认识到 C 通常将数组转换为指向其第一个元素的指针,这使得数组索引工作得很好。所以我们模仿它并自己进行转换:我们声明state为指向数组数组的第一个元素的指针。所以,state是指向第一个数组的指针 4 uint8_t。然后state可以像使用普通数组一样使用:state[i][j]是第 i 个数组的第 j 个元素。


注意:如果uint8_t是字符类型,就像在主流硬件的所有普通 C 实现中一样,这种重新解释由 C 标准定义。

于 2013-10-18T19:56:07.800 回答
1

一个常见的解决方案是对数组进行不同的寻址。

而不是arr[i][j],您可以使用arr[i*4+j]. 最终结果是一样的,但不需要将数组复制成二维数组。

于 2013-10-18T19:20:20.920 回答
0

现在,您正在将指向 a 的指针分配给suint8_t的二维数组uint8_t,这就是您收到该错误的原因。

您需要state单独初始化变量,然后使用for循环一次为其分配msg一个条目。

于 2013-10-18T19:16:55.233 回答