不正确的十六进制矩阵乘法结果

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].