Показаны сообщения с ярлыком composite. Показать все сообщения
Показаны сообщения с ярлыком composite. Показать все сообщения

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

GF2p8 Преобразования в композитных полях GF((2^2)^2)

Преобразования в композитных полях

Базовая идея состоит в том, чтобы выполнять вычисления в простых, самых простых полях GF(2^2), а для перехода к большей разрядности использовать расширение поля.

Аффинные преобразования позволяют параллельно расчитывать множество матриц меньшей размерности, матрицы можно масштабировать 8x8 => 4x4 => 2x2, если научиться раскладывать операции в поле GF(2^8) на две операции в поле GF(2^4) и дальше на четыре операции GF(2^2).

Существует всего один нередуцируемый полином поля GF(2^2) 2 степени .

0x07 p(x) =x2+x+1

И три нередуцируемых полинома 4 степени.

0x13 p(x) = x4+x+1
0x19 p(x) = x4+x3+1
0x1F p(x) = x4+x3+x2+x+1

Почему так хочется снизить степень полинома. Поля GF(2^4) привлекательны тем, что любая унарная операция может быть представлена таблично и подставляться с использованием векторных иструкций Intel PSHUFB, или аналогичных. Размер таблиц 16 байт. Вся таблица помещается в векторный регистр. Использование векторных инструкций для табличной подстановки создает возможность выполнять алгоритм с фиксированными задержками.

Для реализации в аппаратуре представляет интерес дальнейшее снижение размерности, потому что операции в поле GF(2^2) выглядят очень просто.

Инверсия в поле GF(2^2) представлена матрицей 2x2, эта же матрица отвечает за возведение в квадрат, поскольку x-1 = xp-2=x2.

1 0 =2
1 1 =3

умножение на 1:

1 0 =2
0 1 =1

умножение на 2, сдвиг-редуцирование по полиному 0x7, XTime(a):

1 1 =3
1 0 =2

умножение на 3:

0 1 =1
1 1 =3

Утверждаем, что инверсию (gf2p2_inv) можно выполнить в одну инструкцию с использованием аффинных преобразований, а умножение (gf2p2_mul) в поле GF(2^2) можно выполнить в две-три инструкции gf2p8affine.

Для иллюстрации аппаратной реализации функций инверсии и умножения в поле GF(2^2) привожу логические функции соответствующие операциям. Функция довольно простая, выражена в базисе логических функций: Исключающее ИЛИ, И, 1. Любую логику можно выразить в этом базисе. Этот базис соответствует операции gf2p8affine. Таким образом, функцию аффинного преобразования можно использовать и для параллельного вычисления каскада подобных операций. Преобразование произвольных логических фукнций из базиса {И,ИЛИ,НЕ} к базису: {Исключающее ИЛИ, И, 1} -- достойно отдельной статьи. В литературе показано, что применение композитного поля для расчетов позволяет существенно снизить число логических элементов для реализации операций в поле и S-Box, в частности. Надо научиться представлять логическую функцию заданную таблично в виде разложения в каскад операций аффинного преобразования.

Операция инверсии в нижнем поле GF(2^2)/q(x)=x2+x+1 запишется следующим образом.

r0 = x0 ⊕ x1
r1 = x1

Можем выразить операцию инверсии в композитном поле через инверсию в нижнем поле:

d  = (a12·n + a1·a0·t + a02)-1 --  инверсия в поле GF(2^2).
r1 =  d·a1 mod q(x)
r0 =  d·(a1·t + a0) mod q(x)
Результат операции: r = r1·y + r0

При этом разложении все операции (умножение, сложение и инверсия) выполняются в поле GF(2^2)

Можно выразить умножение в композитном поле GF((2^2)^2)/s(y)=y2+y+10 через умножение в нижнем поле GF(2^2):

a = a1·y + a0, b = b1·y + b0
r1 = (a0·b1 + a1·(b0 + b1·t)) mod q(x)
r0 = (a0·b0 + a1·b1·n) mod q(x)
Результат операции: r = r1·y + r0

Значения параметров поля: t=1, n=2.

Ниже привожу реализацию функций умножени и инверсии в композитном поле GF((2^2)^2).

/*! Инверсия в композитном поле GF((2^2)^2) */
uint8_t gf2p4_composite_inverse(uint8_t x, uint32_t Poly) {
	const uint8_t N = 0x2, P2 = 0x7;
	uint8_t a1 = x>>2 & 0x3;
	uint8_t a0 = x&0x3;
	uint8_t D  = gf2p2_mul(a0,a0^a1, P2) 
		^ gf2p2_mul(gf2p2_mul(a1, a1, P2), N, P2);
	uint8_t d  = gf2p2_inv(D, P2);
	uint8_t b0 = gf2p2_mul(a0^a1, d, P2);
	uint8_t b1 = gf2p2_mul(a1, d, P2);
	return b1<<2 | b0;
}
/*! Умножение в композитном поле GF((2^2)^2) */
uint8_t gf2p4_composite_mul(uint8_t a, uint8_t b, uint32_t Poly) {
	const uint8_t N=0x2, P2 = 0x7;
	uint8_t a1 = (a>>2) & 0x3, a0 =  a & 0x3;
	uint8_t b1 = (b>>2) & 0x3, b0 =  b & 0x3;

	uint8_t d  = gf2p2_mul( b0,a0, P2);
	uint8_t r1 = gf2p2_mul((a0^a1), (b0^b1), P2) ^ d;
	uint8_t r0 = gf2p2_mul(gf2p2_mul(b1,a1, P2),N,P2) ^ d;
	return (r1<<2) | r0;
}
Таблица инверсии в поле GF(2^4)/p(x)=x4+x+1
 0 1 9 E D B 7 6 F 2 C 5 A 4 3 8
Таблица инверсии в композитном поле GF((2^2)^2)
 0 1 3 2 F C 9 B A 6 8 7 5 E D 4

Таблицы инверсии нужны для проверки реализации и поиска генератора поля (почему то генератор поля мы проверяем по таблице инверсии). Для перехода от вычислений в поле GF(2^4) в композитное поле и обратно GF((2^2)^2) используем матрицы изоморфного преобразования. Алгоритм расчета матриц изоморфного преобразования 4x4 такой же как и для расчета в композитных полях GF(2^8)=>GF((2^4)^2), был представлен в предыдущей части. Матрицы 4x4 мы упаковываем в формат 8x8, это позволяет использовать те же функции работы с матрицами аффинных преобразований, тот же инструментарий. Замечу, что два независимых преобразования 4x4 можно выполнить на одной операции аффинного преобразования 8x8.

изоморфное преобразование GF(2^4)/0x13 => GF((2^2)^2)
13=>07 02 04 M =010C0E0800000000 M-1 =01060A0800000000
13=>07 02 05 M =0F040E0800000000 M-1 =050E020800000000
13=>07 02 06 M =0502060800000000 M-1 =0702060800000000
13=>07 02 07 M =030A060800000000 M-1 =0B0A0E0800000000
Матрицы изоморфного преобразования
M =01060A080000000016
1000 =0x8
1110 =0xE
1100 =0xC
0001 =0x1
M-1 =01060A080000000016
1000 =0x8
1010 =0xA
0110 =0x6
0001 =0x1

Для отладки функций использовал данные и результаты расчета матриц преобразования из статьи[1]. Следующий шаг -- научиться считать еще более сложные композитные поля, в частности GF(((2^2)^2)^2) -- поле "Тауэр"/"Матрешка", используется в криптографии Rainbow. Причем есть две цели: преобразовать поле Тауэр к полю GF((2^4)^2) для использования 4-х битных таблиц и инструкций PSHUFB; или преобразовать Тауэр к полю GF(2^8)/0x11B для использования инструкций GFNI.

[1] A. Prathiba et al. Lightweight S-Box Architecture for Secure Internet of Things

пятница, 25 июня 2021 г.

GF2p8 Аффинные преобразования в Композитные поля GF((2^4)^2)

Расширение и сужение поля

Идея в том, чтобы вместо операции над 8-и битными значениям использовать операции с 4-х битными значениями. Как осуществить переход?

В теории полей Галуа есть понятие расширение поля. Расширением GF(2^4) образованного полиномом q(x) до GF(2^8) c образующим полиномом p(z) является полином второго порядка GF((2^4)^2) s(y), но действующий с 4х битными коэффициентами. Запишем так:
s(y) = y2+t·y+n. – полином расширения поля, второго порядка,
где t – “trap” n – “norm” коэффициенты 4 бит. Коэффициенты хотелось бы выбрать таким образом, чтобы один из них (t) обратился в единицу.

Необходимо описать, как выглядят операции в поле: умножение и инверсия. Все числа в надстройке поля представляются парами: старшая и младшая часть:
a = a1·y+a0
y - символизирует сдвиг на 4 разряда.

Умножение в композитном поле выглядит следующим образом:
(a1·y+a0)(b1·y+b0) = (a1·b1)·y2 + (a0·b1+b0·a1)·y + a0·b0

Используя редуцирование по полиному y2+t·y+n =0, получаем:
(a1·y+a0)(b1·y+b0) = (a0·b1 + b0·a1 + a1·b1·t)·y + (a0·b0 + a1·b1·n) = r1·y + r0
Результат представлен в виде пары чисел разрядностью 4 бита.

Таким образом, можно выразить умножение, через умножение нижнем поле GF(2^4):
r1 = (a0·b1 + b0·a1 + a1·b1·t) mod q(x)
r0 = (a0·b0 + a1·b1·n) mod q(x)

Также можем выразить операцию инверсии, через инверсию в нижнем поле:
(a1·y + a0)-1 = (d·a1)·y + d·(a1·t + a0),
где d = (a12·n + a1·a0·t + a02)-1 –- инверсия в поле GF(2^4).
r1 = (d·a1) mod q(x)
r0 = d·(a1·t + a0) mod q(x)

Можно проверить справедливость формулы инверсии с использованием операции умножения.

Надо определить коэффициенты {t, n}, выбрать полином в поле GF(2^4).
Всего существует 4 значения n удовлетворяющих требованию t=1 и три нередуцируемх полинома четвертой степени. Для каждого набора параметров можно составить 8 матриц трансформации.

Нередуцируемые полиномы 4-ого порядка:
13: q(x) =x4+x+1
19: q(x) =x4+x3+1
1F: q(x) =x4+x3+x2+x+1

Вариант расчета: t=1, n=1100 – используется в литературе, применительно к полям GF(2^8)/0x11B (AES) и в сочетании с полиномом GF(2^4)/0x13.

Нас интересует составление матриц изоморфного преобразования между полем GF(2^8) и композитным полем GF((2^4)^2)

Для реализации нам понадобятся следующие алгоритмы:
1. умножение и инверсия в поле расширения;
2. умножение и инверсия в поле основания GF(2^4);
3. выбор генератора поля в композитном поле GF((2^4)^2);
4. составление и проверка матрицы трансформации между полем GF(2^8) и композитным полем GF((2^4)^2).

Операции в поле GF(2^4) можно реализовать методом табличной подстановки. Ниже привожу таблицы инверсии и редуцирования. Кроме того, можно реализовать таблицу квадратов и таблицу умножения на константу. Любую функцию одного переменного мы можем записать LUT таблицей (LookUp Table), четыре входа. При описаний логики для FPGA, четырех-битные LUT – оптимальный случай, поскольку, логика на четыре входа и таблица на четыре входа умещается в один логический элемент. При разработке алгоритмов с использованием векторных инструкций выигрыш в том, что вся таблица помещается в вектор 16 байт и для подстановки можно использовать функцию SHUFFLE.

Таблицы инверсии для полиномов 4-ого порядка:
13: 0,1,9,E,D,B,7,6,F,2,C,5,A,4,3,8
19: 0,1,C,8,6,F,4,E,3,D,B,A,2,9,7,5
1F: 0,1,F,A,8,6,5,9,4,7,3,E,D,C,B,2
Таблицы редуцирования старшей части полиномиального умножения:
13: 0,3,6,5,C,F,A,9,B,8,D,E,7,4,1,2
19: 0,9,B,2,F,6,4,D,7,E,C,5,8,1,3,A
1f: 0,F,1,E,2,D,3,C,4,B,5,A,6,9,7,8

Выбор генератора композитного поля можно совместить с генерацией таблицы инверсии, как было показано ранее. В данном случае нам нужно установить соответствие между (a) примитивным элементом поля GF(2^8) и (b) примитивным элементом поля GF((2^4)^2).

Алгоритм подбора генератора поля GF((2^4)^2):
1. Выбираем следующий примитивный элемент (b) поля GF((2^4)^2).
2. Составляем каким-то чудом матрицу прямого и обратного преобразования.
3. Выполняем проверку: произведение прямой и обратной матрицы дает единичную. 
Проверяем действительно ли полученное преобразование – изоморфизм. 
Если условие не выполняется, выбираем следующий примитивный элемент (b),
возвращаемся к шагу 1.
Свойства изоморфизма
    map(a×b) = map(a)×map(b)
    map(a⊕b) = map(a)⊕map(b)

Проверить можно гомоморфизм групповой по отношению к операциям сложения и умножения, для i,j принадлежащих множеству [0..2k-1] должно выполняться:
at = ai+aj => bt = bi+bj
ai+j = ai·aj => bi+j = bi·bj

Выбор генератора поля позволяет составить таблицу инверсии в композитном поле. Критерием того, что элемент поля может использоваться в качестве генератора, является целостность таблицы, степени генератора поля позволяют получить все элементы поля за исключением нуля.

Multiplicative Inverse GF((2^4)^2) 0x13, N=1100
 00 01 09 0E 0D 0B 07 06 0F 02 0C 05 0A 04 03 08
 AA A0 C7 CB 52 57 4F 4B FE F1 3E 3D 82 8A 2D 2F
 55 E9 50 E7 6A 8F 6C 87 B1 45 BA 41 2E 1E 2C 1F
 66 FA F5 60 96 48 4C 9F 5E D8 D5 5B 3F 1B 1A 3C
 BB 2B 7D C9 B0 29 7A C5 35 97 4E 17 36 9E 4A 16
 22 E6 14 56 E8 20 53 15 A9 75 D4 3B 72 A3 38 D9
 33 F4 E5 B7 EB BC 30 FB D3 9C 24 8E 26 86 DE 95
 99 B4 5C A2 A8 59 BF 90 D1 EF 46 C4 C8 42 E1 DC
 CC DA 1C 8B AF 9A 6D 27 C0 D7 1D 83 A5 93 6B 25
 77 BE A4 8D DF 6F 34 49 B5 70 85 AE 69 D2 4D 37
 11 AB 73 5D 92 8C B3 F2 74 58 10 A1 B8 FD 9B 84
 44 28 F3 A6 71 98 E4 63 AC FC 2A 40 65 EA 91 76
 88 D6 E2 F8 7B 47 CA 12 7C 43 C6 13 80 DB EC F7
 EE 78 9D 68 5A 3A C1 89 39 5F 81 CD 7F E0 6E 94
 DD 7E C2 F9 B6 62 51 23 54 21 BD 64 CE F6 D0 79
 FF 19 A7 B2 61 32 ED CF C3 E3 31 67 B9 AD 18 F0

Алгоритм (2) поиска матрицы прямого и обратного преобразования привожу ниже. Идея сводится к тому, чтобы из степеней генератора поля (a) составить диагональную матрицу и применив те же степени к генератору поля (b) сформировать по столбцам матрицу изоморфного преобразования. Для составления обратной матрицы поля меняются местами.

/* Алгоритм составления матрицы изоморфного преобразования
    a - примитивный элемент поля А
    P1 - образующий полином поля A
    b - примитивный элемент поля B 
    P2 - образующий полином поля B
 */
uint64_t map_ab(uint8_t a, uint32_t P1, uint8_t b, uint32_t P2)
{
	uint64_t m=0;
	int i;
	for(i=0;i<8;i++){
		int k=1;
		uint8_t v=1, r=1;
		while (v != (1<<(i))) {
			v = gf2p8_mul(v, a, P1);
			r = gf2p8_mul(r, b, P2);
		}
		m |= (uint64_t)r<<(8*(7-i));
	}
	return m_transpose(m);
}

В представленном алгоритме при выполнении операции умножения для композитного поля применяется арифметика композитного поля GF((2^4)^2), для поля AES арифметика поля GF(2^8), функции gf2p8_mul для композитного поля и для GF(2^8) по сути будут разные.

Матрицы изоморфного преобразования 11B => 13, N=1100
11B=>13 03 20 M =03A85C6870D2ACA0 M-1 =B1B042829AD45E54
11B=>13 03 22 M =737AF0C870D2ACA0 M-1 =A1B062A23A94BE14
11B=>13 03 35 M =91BC4AC4AE720CA0 M-1 =5FD0BAFAC21C2E9C
11B=>13 03 36 M =3FCE4664AE720CA0 M-1 =AFD01A5AE2DCCE5C
11B=>13 03 41 M =5DFC1C18DCAC72A0 M-1 =83700CACA4128692
11B=>13 03 45 M =81506EB8DCAC72A0 M-1 =B370CC6CE432E6B2
11B=>13 03 5B M =05E608CAA20CD2A0 M-1 =259024044C2A36AA
11B=>13 03 5E M =A7EADA6AA20CD2A0 M-1 =759064448C8A560A

Полученный результат позволяет выполнять операции композитного поля на инструкциях GFNI при изоморфном преобразовании из композитного поля в поле AES. И наоборот, позволяет перейти от операций в поле GF(2^8) к операциям меньшей разрядности GF(2^4). Такая техника может давать прирост производительности при реализации алгоритмов шифрования аппаратно и в микроконтроллерах.

В качестве тестового примера для проверки работоспособности методики выполняем генерацию S-Box AES в композитном поле с использованием изоморфного преобразования. При этом операция инверсии выполняется в арфиметике композитного поля.

S(x) = (A·M-1)·(M·x)-1 ⊕ C
A =F1E3C78F1F3E7CF816 - матрица аффинных преобразовний AES. 
C =6316
M =A7EADA6AA20CD2A016, -- матрица изоморфного преобразования
M-1 =759064448C8A560A16, -- обратное изоморфное преобразование
(A·M-1) =2F33DDCF49B6701E16

sbox[x] = affine(m_mul(A, M_), composite_inverse(affine(M, x)))^0x63;

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

Расчет S-Box CLEFIA в композитных полях

Ранее мы рассматривали пример расчета нелинейного преобразования блочного шифра CLEFIA в изоморфных полях GF(2^8). Хотим закрепить навык выполнения расчетов в композитных полях и использовать технику преобразования в композитное поле, с расчетом инверсии на полиноме GF(2^4)/0x13.

Расчет нелинейного преобразования (биекции) дается следующим выражением:

S(x) = A2·(A1·x ⊕ C1)-1 ⊕ C2
A2,A1 - матрицы аффинных преобразовний.
инверсия считается в поле GF(2^8)/0x11D.
A1 =0x81605C6503015118 C1=0x1E
A2 =0x449002302058410A C2=0x69

Перейдем к расчетам в композитном поле:

S(x) = (A2·M-1)·((M·A1)·x ⊕ (M·C1))-1 ⊕ C2
инверсия считается в композитном поле GF((2^4)^2)/0x13.
M =B9C292428A441A2016
M-1 =9F547C4E5A805C0A16
(M·A1)  =FE297B311D0D060116,  (M·C1) =0x6A
(A2·M-1) =205054DA8048C31A16
// Расчет SBox - фрагмент кода
sbox[x] = affine(m_mul(A2,M_), composite_inverse(affine(m_mul(M,A1), x) 
                                               ^ affine(M,C1))) ^ C2;

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


[1] D. Canright. A Very Compact S-box for AES
[2] A. Rudra et al. Efficient Rijndael Encryption Implementation with Composite Field Arithmetic