不正确的十六进制矩阵乘法结果
Incorrect hexadecimal matrix multiplication results
矩阵 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) 字段中执行的,因此不要尝试使用 +
和 *
运算符,而 ^
用于 +
运算符和 byteProduct()
函数 returns uint8_t
的乘法。
我已经执行了行 x 列乘法。
不要将值填入您仍在用于计算的矩阵之一。
先复制一份或填充一个新矩阵。
否则,您将妥协您仍用于计算的值。
例如
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]
.
矩阵 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) 字段中执行的,因此不要尝试使用 +
和 *
运算符,而 ^
用于 +
运算符和 byteProduct()
函数 returns uint8_t
的乘法。
我已经执行了行 x 列乘法。
不要将值填入您仍在用于计算的矩阵之一。
先复制一份或填充一个新矩阵。
否则,您将妥协您仍用于计算的值。
例如
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]
.