C AES查找表的实现
我试图在AES加密(Rijndael)中实现查找表。公式如下(): 我的代码是(仅适用于一轮): (j=0;j<4;++j)的C AES查找表的实现,c,encryption,aes,C,Encryption,Aes,我试图在AES加密(Rijndael)中实现查找表。公式如下(): 我的代码是(仅适用于一轮): (j=0;j16; 输入[2][j]=xRoperation>>8; 输入[3][j]=xorOperation; } 问题是: 我的代码是否完全映射了公式?因为当我用某个密钥对纯文本进行加密时,我没有得到预期的密码。我已经找出了代码中的错误…:) 我将输入用作影响结果的输出。。我所做的一切就是使用另一个数组作为输出,然后在循环结束后将结果复制回输入 感谢大家与我一起尝试……要创建AES查找表,
{
无符号整型;
xRoperation=T_0_enc_2[输入[0][j]]
^T_1_enc_2[输入[1][(j-C1)%Nb]///Nb=4,C1=1,C2=2,C3=3
^T_2_enc_2[输入[2][(j-C2)%Nb]]
^T_3_enc_2[输入[3][(j-C3)%Nb];
(w[0][j+(Nb*(i+1))]>16;
输入[2][j]=xRoperation>>8;
输入[3][j]=xorOperation;
}
问题是:
我的代码是否完全映射了公式?因为当我用某个密钥对纯文本进行加密时,我没有得到预期的密码。我已经找出了代码中的错误…:) 我将输入用作影响结果的输出。。我所做的一切就是使用另一个数组作为输出,然后在循环结束后将结果复制回输入
感谢大家与我一起尝试……要创建AES查找表,必须将上述代码应用于每个字节256个输入状态。欢迎使用堆栈溢出!寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建。如果您的代码工作正常,为什么要问我们?输入[]数组的类型是什么?如何声明?如果
j
和C1
都是无符号int,那么j-C1
可能是溢出,而(j-C1)%Nb
可能是错误的。你觉得可能吗?如果添加多个Nb,会发生什么?你能试试像(j+(C1*Nb-C1))%Nb
这样的东西吗?@francis问了一个关于j
类型的好问题。只有当j
被签名时,才可能影响结果。在这种情况下,索引值可能为负值。对于无符号类型,溢出会给出预期结果,因为Nb=4
。无论如何,最好使用保护添加Nb
:(j+Nb-C)%Nb
for(j = 0; j < 4; ++j)
{
unsigned int xorOperation;
xorOperation = T_0_enc_2[input[0][j]]
^ T_1_enc_2[input[1][(j-C1) % Nb]] // Nb = 4, C1 = 1, C2 = 2, C3 = 3
^ T_2_enc_2[input[2][(j-C2) % Nb]]
^ T_3_enc_2[input[3][(j-C3) % Nb]];
xorOperation ^= (w[0][j + (Nb * (i+1))] << 24) // w[x] is the key array, (i+1) is the round number
| (w[1][j + (Nb * (i+1))] << 16)
| (w[2][j + (Nb * (i+1))] << 8)
| (w[3][j + (Nb * (i+1))]);
input[0][j] = xorOperation >> 24;
input[1][j] = xorOperation >> 16;
input[2][j] = xorOperation >> 8;
input[3][j] = xorOperation;
}