我正在为学校项目实施AES。我有一个函数aes_block,它接受uint8_t的一维数组(长度为16)作为消息;我想加密这条消息。第一步是将[0]中的[0],[1],......中的字节映射到二维状态数组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;
...
}
允许我按状态[col] [row]索引状态数组。 这给了我一个编译错误"无效的初始化程序&#34 ;;我怎样才能完成我想要做的事情?
答案 0 :(得分:1)
对此的一个常见解决方案是以不同方式处理数组。
您可以使用arr[i][j]
而不是arr[i*4+j]
。最终结果是相同的,但不需要将数组复制到二维数组中。
答案 1 :(得分: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
是指向第一个四个uint8_t
数组的指针。然后state
可以像普通数组一样使用:state[i][j]
是第i个数组的第j个元素。
注意:如果uint8_t
是一种字符类型,就像主流硬件的所有正常C实现一样,这种重新解释是由C标准定义的。
答案 2 :(得分:0)
现在,您正在将指向uint8_t
的指针分配给uint8_t
的二维数组,这就是您收到该错误的原因。
您需要单独初始化变量state
,然后使用for
循环一次为msg
分配一个条目。