Неверные результаты умножения шестнадцатеричной матрицы - PullRequest
0 голосов
/ 23 мая 2018

матрица 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 столбецумножение.

1 Ответ

0 голосов
/ 24 мая 2018

Не заполняйте значения в одну из матриц, которые вы все еще используете для расчета.
Сначала сделайте копию или заполните новую матрицу.
В противном случае вы скомпрометируете значения, которые вы все еще используете для расчета.

Например,

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...