матрица 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
1044 * из-за молочной железыФункция отличается от этой.
Есть ли какие-либо решения для этого?
Обратите внимание, что эти вычисления выполняются в поле GF (2 ^ 8), поэтому не тпопробуйте использовать операторы +
и *
, вместо оператора +
используется ^
, а функции byteProduct()
возвращают умножение uint8_t
s.
Я выполнил строку x столбецумножение.