矩阵1:
0x02 0x03 0x01 0x01
0x01 0x02 0x03 0x01
0x01 0x01 0x02 0x03
0x03 0x01 0x01 0x02
矩阵2:
0x63 0x53 0xe0 0x8c
0x09 0x60 0xe1 0x04
0xcd 0x70 0xb7 0x51
0xba 0xca 0xd0 0xe7
这两个矩阵在这个函数中是多重的:
void mul(uint8_t state[4][4])
{
for(unsigned short i = 0; i < 4; i++)
{
state [0][i] = byteProduct(0x02 ,state[0][i]) ^ byteProduct(0x03, state[1][i]) ^ state[2][i] ^ state[3][i];
state [1][i] = state[0][i] ^ byteProduct(0x02, state[1][i]) ^ byteProduct(0x03, state[2][i]) ^ state[3][i];
state [2][i] = state[0][i] ^ state[1][i] ^ byteProduct(0x02, state[2][i]) ^ byteProduct(0x03, state[3][i]);
state [3][i] = byteProduct(0x03, state[0][i]) ^ state[1][i] ^ state[2][i] ^ byteProduct(0x02, state[3][i]);
}
}
在这个函数中,我逐列地采用矩阵2,并分别乘以矩阵1的行的值。并且值应该在状态矩阵中替换。
ByteProduct定义为:
uint8_t byteProduct(uint8_t x, uint8_t y)
{
uint8_t result = 0, temp;
while(x != 0)
{
if((x & 1) != 0)
result ^= y;
temp = y & 0x80;
y <<= 1;
if(temp != 0)
y ^= 0x1b;
x >>= 1;
}
return result;
}
结果应为:
0x5f 0x72 0x64 0x15
0x57 0xf5 0xbc 0x92
0xf7 0xbe 0x3b 0x29
0x1d 0xb9 0xf9 0x1a
但该功能产生的母线与此不同。
任何解决方案吗?
请注意,这些计算是在GF(2 ^ 8)字段中执行的,因此请勿尝试使用+
和*
运算符,而^
用于{ {1}}运算符和+
函数返回byteProduct()
s的乘法。
我已经执行了行x列乘法。
答案 0 :(得分:1)
请勿将值填充到您仍用于计算的其中一个矩阵中 首先复制它或填写新矩阵 否则,您将损害仍用于计算的值。
E.g。
state [0][i] = byteProduct(0x02 ,state[0][i]) ^ byteProduct(0x03, state[1][i]) ^ state[2][i] ^ state[3][i];
state [1][i] = state[0][i] ^ byteProduct(0x02, state[1][i]) ^ byteProduct(0x03, state[2][i]) ^ state[3][i];
第一行已经覆盖state [0][i]
的值,然后第二行再次使用它来计算state [1][i]
。