[Перевод] ChaCha, модификация Salsa20

Представленная статья является первым моим пробным переводом «научно-технической» статьи, а именно работы Даниэля Бернштейна «ChaCha, a variant of Salsa20». Ввиду этого я ожидаю комментарии, связанные с конструктивной критикой неточностей перевода и предложениями по их исправлению.

Аннотация

ChaCha8 это 256-битный поточный шифр, основанный на 8-раунодовом шифре Salsa20/8. Новшества, привнесенные при работе от Salsa20/8 до ChaCha8, позволили улучшить перемежение бит за раунд, тем самым повысив стойкость к криптоанализу при сохранении, а иногда и уменьшении, времени требуемого на вычисления одного раунда. ChaCha12 и ChaCha20 являются аналогичными модификациями 12-раундового и 20-раундового шифров Salsa20/12 и Salsa20/20. В данной статье описывается семейство шифров ChaCha и объясняется разница между Salsa20 и ChaCha.

1 Введение

1.1 Справка

Поточный шифр Salsa20/20 преобразует 256-битный ключ в 264 потоков со случайным доступом, каждый из которых содержит 264 блока объемом 64 байт со случайным доступом. Конструкция Salsa20/20 проще чем у AES. Поэтому общественность решила, что шифр не является безопасным.

Salsa20/20 значительно быстрее AES. Salsa20/20 рекомендуется использовать для шифрования в обычных криптографических приложениях. Семейство шифров Salsa20 также включает в себя сокращенные по количеству раундов шифры — 12-раундовый шифр Salsa20/12 и 8-раундовый шифр Salsa20/8, нацеленные на пользователей, которым производительность важнее безопасности.

1.2 Значение статьи

В данной статье представлено семейство поточных шифров ChaCha, модифицированного семейства шифров Salsa20. Конструкция ChaCha20 основана на тех же принципах, что и Salsa20, но с изменениями, которые позволяют улучшить перемежение бит за раунд. Считается, что наименьшее количество раундов ChaCha, требуемое для обеспечения требуемого уровня безопасности меньше, чем у Salsa20.

Но улучшенное перемежение не требует дополнительных операций. За один ChaCha-раунд происходит 16 сложений, 16 побитных сложений по модулю 2 и 16 циклических сдвигов 32-битных слов, как и в Salsa20. Кроме этого, в ChaCha такой же уровень параллелизма и векторизации, как и в Salsa20, с осуществлением сохранения одного из 17 регистров, которые используется для реализации «исходных» механизмов Salsa20. Поэтому не сложно догадаться, что ChaCha-раунд может достигать ту же программную скорость, что Salsa20-раунд, а иногда и большую, в зависимости от платформы. От сюда получается, что если ChaCha обладает таким же безопасным минимальным количеством раундов, что и Salsa20, то ChaCha работает с большой скоростью, чем Salsa20, при этом обеспечивая такой же уровень безопасности.

Конечно, теоретические высказывания обязаны подкрепляться практическими вычислениями. Поэтому далее будет приведено сравнение, которое производилось между новейшей публикацией ChaCha и наиболее оптимизированной публикацией Salsa20, на нескольких компьютерах, с использованием бенчмарка eSTREAM. Результаты приведены в таблице 1.

Таблица 1 — Сравнение Salsa20 и ChaCha

Компьютер

Циклов/Байт

8 раундов

12 раундов

20 раундов

Архитектура

МГц

Процессор

Salsa20

ChaCha

Salsa20

ChaCha

Salsa20

ChaCha

ppc32

533

PowerPC G4

1.99

1.86

2.74

2.61

4.24

4.13

amd64

2137

Core 2 Duo

1.87

1.87

2.53

2.54

3.90

3.95

ppc64

2000

PowerPC G5

3.24

3.06

4.74

4.57

7.81

7.58

amd64

2000

Athlon 64×2

3.47

3.29

4.86

4.61

7.64

7.23

amd64

3000

Pentium D

5.39

3.87

7.16

5.27

10.65

8.23

x86

1300

Pentium M

5.30

4.88

7.44

7.06

11.70

11.08

x86

900

Athlon

4.62

5.36

6.44

7.58

10.04

12.21

sparc

1050

UltraSPARC

6.65

6.60

9.17

9.17

14.34

14.29

x86

3200

Pentium D

7.13

6.75

9.77

9.33

14.33

14.27

x86

1900

Pentium 4

5.41

7.08

8.21

9.72

11.74

15.03

Таким образом, были получены следующие результаты измерений:

·    одинаковая скорость на 64-битной amd64-архитектуре Core 2.

·    одинаковая скорость на 64-битной sparc-архитектуре UltraSPARC.

·    на 5% быстрее на 64-битной amd64-архитектуре Athlon 64.

·    на 5% быстрее на 32-битной x86-архитектуре Pentium D.

·    на 5% быстрее на 64-битной ppc64-архитектуре Core 2.

·    на 6% быстрее на 32-битной ppc32-архитектуре Core 2.

·    на 8% быстрее на 32-битной x86-архитектуре Core 2.

·    на 28% быстрее на 64-битной amd64-архитектуре Core 2.

Данная статья предполагается для тех читателей, которые знакомы с Salsa20 и нацелены на изучение изменений произошедших от Salsa20 до ChaCha. В главе 2 содержится сравнение «четверть-раунда» Salsa20 и «четверть-раунда» ChaCha. В главе 3 содержится сравнение матриц Salsa20 и ChaCha.

2 «Четверть-раунд»

2.1 Разбор «четверть-раунда» Salsa20

В Salsa20 происходит преобразование 4 32-битных слов a, b, c и d:

0e67ac144aa350cfca553bb432a20fd3.png

Операции представлены в виде кода на языке программирования С:

    — побитное сложение по модулю 2.

     — сложение по модулю 232.

 — циклическое смещение на определенное количество бит.

Всего в Salsa20 16 слов, но в «четверть-раунде» происходит работа только с четырьмя. Вопрос с доступом и связи всех 16 слов является проблематичным на некоторых платформах; Salsa20 снижает частоту
доступа путем выполнения нескольких операций с четырьмя словами, прежде чем переходить к следующим четырем словам.

2.2 «Четверть-раунд» ChaCha

ChaCha, как и Salsa20, использует 4 операции сложения, 4 операции побитного сложения по модулю 2 и 4 циклических сдвига для преобразования четырех 32-битных слов. Однако, ChaCha использует эти операции в другом порядке, тем самым изменяя каждое слова не один, а два раза. Таким образом, в ChaCha используются следующие операции:

6ec6a71b0b6f30054af69b991e3d99ca.png

Очевидно то, что в «четверть-раунде» ChaCha, в отличие от «четверть-раунда» Salsa20, каждое входное слово влияет на каждое выходное слово. Менее очевидно, то, что «четверть-раунд» ChaCha распространяет изменения через биты быстрее чем «четверть-раунд» Salsa20. Это можно заметить при наблюдении всевозможных однобитных входных изменений: в отсутствии переносов, «четверть-раунд» ChaCha изменяет (в среднем) выходных 12,5 бит, в то время как «четверть-раунд» Salsa20 только 8 выходных бит.

Почти двукратный прирост в скорости является важнейшим отличием ChaCha от Salsa20. После публикации этого достижения, Аумассон, Фишер, Хазаи, Майер и Рехбергер при работе с шифром ChaCha, опираясь на исследования Salsa20, пришли к заключению, что с помощью их классических атак им удастся сломать ChaCha, в котором используется на один раунд меньше, чем при такой же атаке на Salsa20. Но в действительности, ChaCha обладает такой же устойчивостью к криптоанализу.

Код, представленный выше, демонстрирует не менее важное изменение: произошло изменение расстояния циклического сдвига от 7, 9, 13, 18 до 16, 12, 8 и 7 соответственно. Это не дает большого прироста в безопасности, но зато повышает производительность.

3 Матрица

3.1 Обзор матрицы Salsa20

Salsa20 оперирует с 16 словами: четырьмя входными словами, которые наиболее интересны атакующим (одноразовое число и блочный счетчик), 8 слов ключа и 4 константы, которые представлены в матрице размерностью 4×4:

cc3c250d6f5e233568505b997177af74.png

Матрица Salsa20/r инверсивно преобразуется на протяжении r раундов. После этого результат складывается с исходной матрицей для получения 16-словного (64-байтного) выходного блока.

В некоторые программных реализациях Salsa20 предусмотрены собственные изменения матрицы, в результате которых матрица приобретает следующий вид:

ebb83fb34d037279376de6871a27dfbc.png

Видно, что из-за преобразований в первом раунде Salsa20 «четверть-раунды» для каждого столбца распараллеливаются, изменяя сначала вторую строку, затем третью, четвертой и в итоге первую строку. Если строки матрицы собраны в векторы, тогда все эти 4 «четверть-раунда» могут выполняться с помощью SIMD-операций.

Второй раунд Salsa20 применяет «четверть-раундовые» операции для диагоналей, изменяя четвертую строку, затем третью, вторую и в итоге первую строку. Эти операции над входными словами в каждой строке преобразуют диагонали в столбцы, тем самым позволяя выполнять SIMD-операции без затрачивания больших ресурсов.

Третий раунд повторяет первый; четвертый раунд повторяет второй; и так далее.

3.2 Матрица ChaCha

В ChaChar, как и в Salsa20/r, строится матрица 4×4, претерпевающая инверсивные преобразования на протяжении r раундов, после чего результат складывается с исходной матрицей для получения 16-словного (64-байтного) блока на выходе.

Только здесь имеется три отличия. Во-первых, в ChaCha изменен порядок слов в блоке на выходе, чтобы выполнялись правила, описанные выше. Это никак не отражается на безопасности; это сделано для сохранения производительности на SIMD-платформах; на другие платформы это не влияет.

Во-вторых, в ChaCha исходная матрица строится таким образом, что все значимые для злоумышленника слова находятся внизу матрицы:

2b2c0d7a36fd44c328983eada108b8fe.png

Слова ключа расположены на второй и третьей строчке; первое входное слово выделено под значение счетчика, за ним следует одноразовое число; константы такие как в Salsa20. В первом раунде ChaCha значение ключа складывается со значениями констант, затем происходит сложение по модулю 2 с входными словами, циклический сдвиг, сложение результата с ключом и так далее.

Расположение входных данных в Salsa20 было выбрано таким образом, чтобы лучше были заметны все изменения. Считалось, что мировым «широким» аналитикам потребовалось бы больше времени для работы с ChaCha, чем с Salsa20 из-за измененного порядка операций и измененного расположения слов в матрице. С другой стороны, расположение переменных в Salsa20 дает ненужную гибкость для злоумышленников, и нет никаких доказательств того, что это действительно улучшает безопасность. В этом плане более интересен анализ на уровне бит.

В-третьих, операции в ChaCha происходят в одинаковом порядке в каждом раунде. В первом раунде обрабатываются следующие «четверть-раунды»: (0, 4, 8, 12), (1, 5, 9, 13), (2, 6, 10, 14), (3, 7, 11, 15), (0, 5, 10, 15), (1, 6, 11, 12), (2, 7, 8, 13), (3, 4, 9, 14), в скобках указаны позиции слов в матрице. 4 «четверть-раундовых-слова» всегда расположены в порядке снизу-вверх. Такой порядок улучшает рассеивание.

© Habrahabr.ru