вторник, 15 июня 2021 г.

GF2p8 Аффинные преобразования (продолжение)

В дополнение к предыдущим сообщениям по теме "Аффинные преобразования" и "изоморфные отображения между представлениями полей Галуа", продолжу разбор примеров применения ...

Вычисление CRC-8 с использованием аффинных преобразований

Операция вычисления CRC состоит из редуцирования в поле GF(2^8). В качестве примера используем CRC-8 с полиномом 0x11D. Для получения матрицы преобразования используем опыт полученный в предыдущем сообщении, составляем матрицу из операции сдвиг-редуцирование по полиному 0x11D, повторяем операцию 8 раз.

const uint64_t M = m_exp((E>>(8*1))^m_transpose(0x1D), 8);

M=71E2B51B478E1C3816 -- матрица преобразования. Результат от строки CRC8I("123456789")=0x7E.

// Вычисление CRC-8I с использованием аффинных преобразований
#define CRC8I_INIT 0xFD
#define CRC8I_CHECK 0x7E

for (i=0, crc=CRC8I_INIT; i<9; i++)
	crc = affine_byte(0x71E2B51B478E1C38, crc ^ data[i], 0);

Компилирую с использованием инструкций GFNI..


#include <intrin.h>
__m128i crc8_update(__m128i crc, uint8_t val) {
    __m128i M = _mm_set_epi64x (0x71E2B51B478E1C38, 0x71E2B51B478E1C38);
    __m128i v = _mm_maskz_set1_epi8(1, val);
    return _mm_gf2p8affine_epi64_epi8(v^crc, M, 0);
}

Результат совпадает!

Вычисление S-Box SM4 с использованием изоморфных преобразований

В прошлой части уже писал, как мне удалось преобразовать и сгенерировать S-Box с использовнием аффинных преобразований. Цель состоит в том, чтобы перейти от полинома 0x175 к вычислениям на полиноме 0x11B, что позволит использовать инструкции с аппаратной поддержкой инверсии и умножения в поле.


S[i] = affine_byte(A1, Inv[affine_byte((A1), i, 0xD3)], 0xD3);

// Выбираем изоморфное отображение 0x175=>0x11B
M_sm4  =0x51DE2604863CEA62;// прямая матрица
M_sm4_ =0x71BA0862FCB68CA2;// обратная
A2 = m_mul(A1, M_sm4_);// =0xD72D8E511E6C8B19
A3 = m_mul(M_sm4,  A1);// =0x34AC259E022DBC52
C3 = affine_byte(M_sm4, 0xD3);// =0x65

S[i] = affine_byte(A2, Inv[affine_byte(A3, i, C3)], 0xD3);

Количество преобразований от перехода в поле 11B не изменилось, всего две операции аффинного преобразования, которые могут быть представлены инструкцией gf2p8affineinv и gf2p8affine. В итоге S-Box можно расчитать за два такта для вектора 64 байт.

// Функция подстановки S-Box SM4 Intel GFNI
#include <intrin.h>
__m128i sm4_tau(__m128i state) {
    state = _mm_gf2p8affine_epi64_epi8(state, A3, 0x65);
    state = _mm_gf2p8affineinv_epi64_epi8(state, A2, 0xD3);
    return state;
}

Результат совпадает!

Комментариев нет:

Отправить комментарий