SIMD (хеш-функция)

Материал из testwiki
Перейти к навигации Перейти к поиску

Шаблон:Не путать Шаблон:Карточка хеш-функции SIMD — итеративная криптографическая хеш-функция, разработанная Gaëtan Leurent, Charles Bouillaguet, Pierre-Alain Fouque. Была выдвинута как кандидат на конкурс стандарта SHA-3, проводимый Национальным институтом стандартов и технологий (США), где прошла во второй раундШаблон:Sfn.

Существуют два варианта хеш-функции: SIMD-256 и SIMD-512, преобразующие сообщение произвольной длины в 256 или 512-битное хеш-значение, называемое также дайджестом сообщения. Кроме того возможно определить хеш-функции SIMD-n как усечение функций SIMD-256 и SIMD-512 для n<256 и 256<n<512 соответственноюШаблон:Sfn.

Как утверждают создатели, главной особенностью хеш функции является значительное расширение сообщения, которое позволяет защититься от дифференциального криптоанализаШаблон:Sfn.

Алгоритм

Общее описание и параметры

Главной частью хеш-функции h является функция сжатия C:{0,1}p×{0,1}m{0,1}p. Чтобы вычислить h(M), сообщение M разбивается на k частей Mi по m бит. Затем к частям сообщения итеративно применяется функция сжатия: Hi+1=C(Hi,Mi). Начальное состояние H0 или Шаблон:Iw обозначается IV и является фиксированным для каждой функции семейства SIMD. Окончательный результат работы хеш-функции получается применением финализирующей функции (finalization function) D:{0,1}p{0,1}n к Hk1.

Функция сжатия C в режиме Дэвиса-Мейера обычно строится с использованием функции блочного шифрования Em: C(h,m)=Em(h)h, однако для хеш-функции SIMD используются несколько улучшений.

Семейство хеш-функций SIMD использует следующие параметры:

Размер хеша, n Размер блока сообщения, m Размер внутреннего состояния(Hi), p
SIMD-256 256 512 512
SIMD-512 512 1024 1024

Внутреннее состояние представлено матрицей 32-битных слов размером 4×4 для SIMD-256 и 8×4 для SIMD-512.


S256=[A0B0C0D0A1B1C1D1A2B2C2D2A3B3C3D3];S512=[A0B0C0D0A1B1C1D1A2B2C2D2A3B3C3D3A4B4C4D4A5B5C5D5A6B6C6D6A7B7C7D7]

Функция сжатия

Функция сжатия SIMD построена на основе конструкции Дэвиса-Мейера с некоторыми изменениями.

Во-первых, вместо функции сжатия C(h,m)=Em(h)h используется функция C(h,m)=Em(hm)h.

Во-вторых, вместо операции XOR для Em(hm) и h в SIMD применяются несколько дополнительных раундов Фейстеля с h в качестве входного ключа. Это действие выполняет функция P:{0,1}p×{0,1}p{0,1}p.

Таким образом, функция сжатия определена как C(h,m)=P(h,Em(hm)). Как утверждают авторы хеш-функции SIMD, эти модификации обеспечивают такой же уровень безопасности, как и оригинальная конструкция Дэвиса-Мейера, но в то же время предотвращают некоторые виды атак множественных блоков (multi-block attacks)Шаблон:Sfn.

Расширение сообщения

Расширение сообщения (message expansion) хеш-функции SIMD-256 (соотв. SIMD-512) преобразует блок сообщения в 512 бит (соотв. 1024 бита) в расширенное сообщение размером 4096 бит (соотв. 8192 бит) с минимальным расстоянием в 520 (соотв. 1032).

Использование сети Фейстеля

Использование структуры Фейстеля хеш-функцией SIMD построено аналогично семейству хеш-функций MD/SHA:

Aj(i)=(Dj(i1)Wj(i)ϕi(Aj(i1),Bj(i1),Cj(i1)))siApi(j)(i1)ri

Bj(i)=Aj(i1)ri

Cj(i)=Bj(i1)

Dj(i)=Cj(i1)

или в более удобном формате:

Step([A0B0C0D0A1B1C1D1A2B2C2D2A3B3C3D3],[W0W1W2W3],ϕ,r,s,p)=[(D0W0ϕi(A0,B0,C0))sAp(0)rA0rB0C0(D1W1ϕi(A1,B1,C1))sAp(1)rA1rB1C1(D2W2ϕi(A2,B2,C2))sAp(2)rA2rB2C2(D3W3ϕi(A3,B3,C3))sAp(3)rA3rB3c3] для SIMD-256

Step([A0B0C0D0A1B1C1D1A2B2C2D2A3B3C3D3A4B4C4D4A5B5C5D5A6B6C6D6A7B7C7D7],[W0W1W2W3W4W5W6W7],ϕ,r,s,p)=[(D0W0ϕi(A0,B0,C0))sAp(0)rA0rB0C0(D1W1ϕi(A1,B1,C1))sAp(1)rA1rB1C1(D2W2ϕi(A2,B2,C2))sAp(2)rA2rB2C2(D3W3ϕi(A3,B3,C3))sAp(3)rA3rB3c3(D4W4ϕi(A4,B4,C4))sAp(4)rA4rB4C4(D5W5ϕi(A5,B5,C5))sAp(5)rA5rB5C5(D6W6ϕi(A6,B6,C6))sAp(6)rA6rB6C6(D7W7ϕi(A7,B7,C7))sAp(7)rA7rB7c7] для SIMD-512

где ϕi - логическая функция, - сложение по модулю 232 и si - циклический сдвиг влево на si бит.

Используются 4 параллельные ячейки Фейстеля для SIMD-256 (соотв. 8 для SIMD-512), которые взаимодействуют между собой из-за перестановок pi. Перестановки выбираются таким образом, чтобы обеспечить хорошее перемешивание.

Для SIMD-256 определено:

p(i)(x)={x+1(mod4),if i is evenx+2(mod4),if i is odd

Соответственно для SIMD-512:

p(0)(x)={x+1(mod8),if x=0(mod2)x1(mod8),otherwise

В целом функция сжатия отрабатывает за 4 раунда, каждый из которых состоит из 8 шагов (step), плюс один дополнительный финальный раунд.

Финальная функция сжатия

После того как все блоки сообщения были сжаты совершается еще один дополнительный вызов функции сжатия с размером сообщения в качестве входного параметра. При этом длина сообщения вычисляется в битах по модулю 22m если необходимо.

Для финальной функции сжатия используется немного измененный метод расширения сообщения:

для SIMD-256 вместо O(M)=NTT128(M+X127) используется O(M)=NTT128(M+X127+X125).

Соответственно, для SIMD-512 вместо O(M)=NTT256(M+X255) используется O(M)=NTT256(M+X255+X253)

Таким образом, диапазон расширенных сообщений для финального этапа отличается от диапазона расширенных сообщений блоков тела сообщения.

После применения финальной функции сжатия на выход подается следующее строковой представление:

A0,A1,A2,A3,B0,B1,B2,B3 для SIMD-256

A0,A1,A2,A3,A4,A5,A6,A7,B0,B1,B2,B3,B4,B5,B6,B7 для SIMD-512

В случай SIMD-n на выход подаются первые n бит SIMD-256 (n < 256) или SIMD 512 (256 < n < 512). Например, для SIMD-384 на выходе будет A0,A1,A2,A3,A4,A5,A6,A7,B0,B1,B2,B3

Вектор инициализации

Каждая хеш-функция семейства SIMD использует собственный вектор инициализации IV, чтобы избежать связей между выходными результатами различных функций SIMD-n. IV для функции SIMD-n определяется следующим образом:

IV = SIMD-Compress(0, "SIMD-(i)" v1.0, 0), где строка записана в ASCII и дополнена нулями, а (i) - десятичное представление n.

Значения IV для различных хеш-функций семейства SIMD:

SIMD224IVA0..30xeebfea740x70c303460x4b5387180x4f06a655B0..30xa22aad990x434a528c0x355e2a290x8523b76eC0..30x20bcf05e0x9eb5b91a0x4ddc22e80xce0ae099D0..30x9d4dda030xae00fc410x40279fc80x9f0ec1f5SIMD256IVA0..30x99dae06a0xc3d432390x4979de730x3ee5d052B0..30xda4d98d00xcf5c52be0x655cbaf90x2a9d238eC0..30xfd892a600x8a471f8c0x86ce033f0x0ff768d3D0..30xfad01f140x9eeef3b30x68aec37a0x6b209d72

SIMD384IVA0..30x3a8f3d6f0x756a10870x5d5318aa0xbbca76f7A4..70x26a3a9590xaca1e37e0xb40c46420x904085d9B0..30xf46f6c9b0x9ab248ef0xdbbfc9cc0xcc8821faB4..70x354d3c2e0xda334fb10x68ed79ce0xa5bc107dC0..30x2da6fdc30xfbafce000x4c9a69540xb61f0fafC4..70xf56099b50xa3a5bdfb0xf83e09770x7eb15372D0..30x91195b410xfcb9404e0x214e6c840x88740b3aD4..70xba03a4b10xa82202fc0x994fddfb0xb2e1a1deSIMD512IVA0..30xb314b8060x676cf96e0xed91a4710x5f306791A4..70x4ea515ee0xde2a06cf0xc9c968510x4f49a403B0..30xf778d95b0x6e5e21da0xad5706710x4584c064B4..70xac201a0f0xd4ce2a860xc6d663f40x8ec5d766C0..30x14c1303a0xb5b890d50x82e61e950x94f47683C4..70x6ebc9ce70xf9af5b290xf41777980xf6cec3eeD0..30xd10eca9e0xea3c1b820x5061c3190x0c2a9f5cD4..70xfcfc980e0xbab373c60x1699d7c90x0822d6af

Улучшения для второго раунда конкурса SHA-3

Изменениям подверглись 2 части алгоритма: перестановки (permutations) p(i) и циклические сдвиги (rotations)Шаблон:Sfn.

При выборе новых перестановок авторы хеш-функции руководствовались следующими критериями:

  • Перестановки должны обеспечивать полное перемешивание после трех раундов (соотв. двух для SIMD-256)
  • Необходимо использовать нечетное число перестановок
  • Результат композиции любых двух перестановок не должен быть фиксированным
  • Результат четырех последовательных перестановок не должен давать исходный результат


SIMD-256. Исходные перестановки:

p(i)(x)={x+1(mod4),if i is evenx+2(mod4),if i is odd

Новые перестановки:

{p(0)(j)=j1p(1)(j)=j2p(2)(j)=j3

где p(i)=pimod3. Таким образом, количество перестановок увеличилось с 2 до 3.


SIMD-512. Исходные перестановки:

p(0)(x)={x+1(mod8),if x=0(mod2)x1(mod8),otherwise

Новые перестановки:

{p(0)(j)=j1p(1)(j)=j6p(2)(j)=j2p(3)(j)=j3p(4)(j)=j5p(5)(j)=j7p(6)(j)=j4

где p(i)=pimod7. Таким образом, количество перестановок увеличилось с 4 до 7.

Псевдокод SIMDШаблон:Sfn

1:  function MessageExpansion(M, f)   		        //f помечает финальную функцию сжатия
2:      if f = 0 then
3:          y(i) = NTT(M + X127) 			//соответственно X255 для SIMD-512
4:      else
5:          y(i) = NTT(M + X127 + X125)  		//соответственно X255 + X253 для SIMD-512
6:      end if
7:      Вычислить Z(i,j) применяя внутренние коды I(185) и I(233) к y(i).
8:      Вычислить W(i,j) применяя перестановки для Z(i,j)
9:      Вернуть W(i,j)
10: end function
11:
12: function Round(S, i, r)
13:     S = Step(S; W(8i+0); IF; r0; r1)
14:     S = Step(S; (W8i+1); IF; r1; r2)
15:     S = Step(S; W(8i+2); IF; r2; r3)
16:     S = Step(S; W(8i+3); IF; r3; r0)
17:     S = Step(S; W(8i+4);MAJ; r0; r1)
18:     S = Step(S; W(8i+5);MAJ; r1; r2)
19:     S = Step(S; W(8i+6);MAJ; r2; r3)
20:     S = Step(S; W(8i+7);MAJ; r3; r0)
21:     return S
22: end function
23:
24: function SIMD-Compress(IV, M, f)
25:     W = MessageExpansion(M; f)
26:     S = IV xor M
27:     S = Round(S; 0; [3; 20; 14; 27])
28:     S = Round(S; 1; [26; 4; 23; 11])
29:     S = Round(S; 2; [19; 28; 7; 22])
30:     S = Round(S; 3; [15; 5; 29; 9])
31:     S = Step(S; IV(0); IF; 15; 5)
32:     S = Step(S; IV(1); IF; 5; 29)
33:     S = Step(S; IV(2); IF; 29; 9)
34:     S = Step(S; IV(3); IF; 9; 15)
35:     return S
36: end function
37:
38: function SIMD(M)
39:     Разделить сообщение M на части M(i); 0 =< i < k.
40:     M(k-1) дополняется нулями.
41:     S  = IV
42:     for 0 =< i < k do
43:         S = SIMD-Compress(S; M(i); 0)
44:     end for
45:     S = SIMD-Compress(S; ||M||; 1)
46:     return Truncate(S)
47: end function

Примеры результатовШаблон:Sfn

Сообщение M SIMD-256(M)
Пустое сообщение
8029e81e7320e13ed9001dc3d8021fec695b7a25cd43ad805260181c35fcaea8
0x00; 0x01; 0x02; … 0x3f 5bebdb816cd3e6c8c2b5a42867a6f41570c4b917f1d3b15aabc17f24679e6acd
Сообщение M SIMD-512(M)
Пустое сообщение
51a5af7e243cd9a5989f7792c880c4c3168c3d60c4518725fe5757d1f7a69c63

66977eaba7905ce2da5d7cfd07773725f0935b55f3efb954996689a49b6d29e0

0x00; 0x01; 0x02; … 0x3f 8851ad0a57426b4af57af3294706c0448fa6accf24683fc239871be58ca913fb

ee53e35c1dedd88016ebd131f2eb0761e97a3048de6e696787fd5f54981d6f2c

Быстродействие

Независимые тесты производительности алгоритма SIMD, проведенные с помощью бенчмарка eBASH, показали следующие результаты (скорость указана в циклах на байт (cpb))Шаблон:SfnШаблон:Sfn:

Процессор Core i5 Core 2 (45 nm) Core 2 (65 nm)
SIMD-256 7.51 cpb 9.18 cpb 11.34 cpb
SIMD-512 8.63 cpb 10.02 cpb 12.05 cpb

При этом около половины времени работы хеш-функции уходит на операцию расширения сообщения: Number-Theoretic Transform (NTT) является самой дорогостоящей в плане производительности частью алгоритма.

Функция сжатия SIMD обладает частично параллельной архитектурой, что позволяет создавать эффективные реализации алгоритма с использованием векторных инструкций (SIMD). Данные инструкции доступны на многих широко-известных архитектурах: SSE на x86, AltiVec на PowerPC, IwMMXt на ARM.

Что касается требований, предъявляемых к RAM, хеш-функции SIMD необходима память для хранения внутреннего состояния (64 байта для SIMD-256 и 128 байт для SIMD-512) и память для выходных значений NTT (4*64 = 256 байт для SIMD-256 и 4*128 = 512 байт для SIMD-512).

Результаты конкурса SHA-3 для SIMD

Хеш-функция SIMD не была отобрана в качестве финалиста конкурса SHA-3.

Эксперты конкурса отметили, что, хотя хеш-функция SIMD во многом повторяет алгоритмы семейств MD/SHA, но улучшения, сделанные авторами, действительно позволили защитить SIMD от многих типов атак (например, коллизионная атака). Кроме того, изменения, проведённые для второго раунда, смогли защитить хеш-функцию SIMD от атаки на основе дифференциального криптоанализа, проведённую Mendel и Nad, которой была подвержена SIMD в своей изначальной реализацииШаблон:Sfn.

Однако, высокие требования к RAM и наличию SIMD инструкций для хорошей производительности делают хеш-функцию плохим кандидатом для реализации на FPGA[1]. Главным образом по этой причине хеш-функция SIMD не попала в финальную стадию конкурса.

Примечания

Шаблон:Примечания

Литература

Шаблон:Хеш-алгоритмы

  1. Реализация на FPGA кандидатов конкурса SHA-3.