Salsa20: различия между версиями
[отпатрулированная версия] | [непроверенная версия] |
Нет описания правки |
Спасено источников — 3, отмечено мёртвыми — 0. Сообщить об ошибке. См. FAQ.) #IABot (v2.0.8.7 |
||
(не показано 30 промежуточных версий 19 участников) | |||
Строка 1: | Строка 1: | ||
'''Salsa20''' — система [[Поточный шифр|поточного шифрования]] разработанная |
'''Salsa20''' — система [[Поточный шифр|поточного шифрования]], разработанная {{нп3|Бернштейн, Дэниел Джулиус|Даниэлем Бернштейном|en|Daniel J. Bernstein}}. Алгоритм был представлен на конкурсе «[[eSTREAM]]», целью которого было создание европейских стандартов для шифрования данных, передаваемых почтовыми системами. Алгоритм стал победителем конкурса в первом профиле (поточные шифры для программного применения с большой пропускной способностью). |
||
Шифр Salsa20 использует следующие операции: |
|||
⚫ | |||
* [[сложение]] 32-битных чисел; |
|||
* побитовое [[сложение по модулю 2|сложение по модулю 2 (xor)]]; |
|||
* [[Битовый сдвиг|сдвиги битов]]. |
|||
⚫ | |||
== Описание алгоритма == |
== Описание алгоритма == |
||
Строка 7: | Строка 12: | ||
=== Понятия === |
=== Понятия === |
||
'''Словом''' далее будем называть элемент множества {0,1,…,2<sup>32</sup>−1} и записывать в шестнадцатеричном виде с префиксом 0х. |
'''Словом''' далее будем называть элемент множества {0,1,…,2<sup>32</sup>−1} и записывать в шестнадцатеричном виде с префиксом 0х. |
||
<br />Операцию '''сложения''' двух слов по модулю 2<sup>32</sup> будем обозначать знаком «<math>~+</math>». |
|||
Операцию '''сложения''' двух слов по модулю 2<sup>32</sup> будем обозначать знаком «<math>+</math>». |
|||
⚫ | |||
'''Исключающее или''' (побитовое суммирование) будем обозначать символом «<math>\oplus</math>» |
|||
⚫ | |||
⚫ | |||
⚫ | |||
=== Функции, используемые в алгоритме === |
=== Функции, используемые в алгоритме === |
||
[[Файл:Salsa20 quarterround.png|frame|<math> |
[[Файл:Salsa20 quarterround.png|frame|<math>quarterround(y_0, y_1, y_2, y_3)</math>]] |
||
==== quarterround(y) ==== |
==== quarterround(y) ==== |
||
Основным блоком системы является преобразование <math> |
Основным блоком системы является преобразование <math>quarterround(y)</math> над четырьмя словами. Из него строятся далее описанные более общие преобразования. |
||
Его суть заключается в том, что для каждого слова мы складываем два предыдущих, сдвигаем сумму на |
Его суть заключается в том, что для каждого слова мы складываем два предыдущих, сдвигаем (циклично) сумму на определённое количество бит и побитово суммируем результат с выбранным словом. Последующие операции производятся с новыми значениями слов. |
||
Допустим, что <math> |
Допустим, что <math>y</math> — последовательность 4 слов <math>y = (y_0, y_1, y_2, y_3)</math> тогда функция <math>quarterround(y) = (z_0, z_1, z_2, z_3)</math> где |
||
: <math>z_1 = y_1 \oplus ((y_0 + y_3) \lll 7),</math> |
: <math>z_1 = y_1 \oplus ((y_0 + y_3) \lll 7),</math> |
||
: <math>z_2 = y_2 \oplus ((z_1 + y_0) \lll 9),</math> |
: <math>z_2 = y_2 \oplus ((z_1 + y_0) \lll 9),</math> |
||
: <math>z_3 = y_3 \oplus ((z_2 + z_1) \lll 13),</math> |
: <math>z_3 = y_3 \oplus ((z_2 + z_1) \lll 13),</math> |
||
: <math>z_0 = y_0 \oplus ((z_3 + z_2) \lll 18).</math> |
: <math>z_0 = y_0 \oplus ((z_3 + z_2) \lll 18).</math> |
||
Например: |
Например: |
||
quarterround(0x00000001; 0x00000000; 0x00000000; 0x00000000)<br |
quarterround(0x00000001; 0x00000000; 0x00000000; 0x00000000)<br> |
||
= (0x08008145; 0x00000080; 0x00010200; 0x20500000) |
= (0x08008145; 0x00000080; 0x00010200; 0x20500000) |
||
Можно рассматривать эту функцию как преобразования слов y<sub> |
Можно рассматривать эту функцию как преобразования слов y<sub>0</sub>, y<sub>1</sub>, y<sub>2</sub> и y<sub>3</sub>. Каждое из таких преобразований обратимо, как и функция в целом. |
||
==== rowround(y) ==== |
==== rowround(y) ==== |
||
Строка 35: | Строка 47: | ||
y_{8} & y_{9} & y_{10} & y_{11} \\ |
y_{8} & y_{9} & y_{10} & y_{11} \\ |
||
y_{12} & y_{13} & y_{14} & y_{15} |
y_{12} & y_{13} & y_{14} & y_{15} |
||
\end{pmatrix} </math |
\end{pmatrix} </math> |
||
В этом преобразовании мы берем 16 слов. Представим их в виде матрицы 4х4. Берем каждый ряд этой матрицы и преобразуем слова этой матрицы функцией <math>quarterround(y)</math>. Слова из строки берутся по порядку, начиная с ''i''-го для ''i''-й строки, где ''i''={0,1,2,3}. |
В этом преобразовании мы берем 16 слов. Представим их в виде матрицы 4х4. Берем каждый ряд этой матрицы и преобразуем слова этой матрицы функцией <math>quarterround(y)</math>. Слова из строки берутся по порядку, начиная с ''i''-го для ''i''-й строки, где ''i''={0,1,2,3}. |
||
Пусть <math> |
Пусть <math>y=(y_0,y_1,y_2,...,y_{15})</math> — последовательность 16 слов, тогда <math>rowround(y)=(z_0,z_1,z_2,...,z_{15})</math> — также последовательность 16 слов где |
||
⚫ | |||
: <math> |
: <math>(z_0, z_1, z_2, z_3) = quarterround(y_0, y_1, y_2, y_3),</math> |
||
: <math> |
: <math>(z_5, z_6, z_7, z_4) = quarterround(y_5, y_6, y_7, y_4),</math> |
||
: <math> |
: <math>(z_{10}, z_{11}, z_8, z_9) = quarterround(y_{10}, y_{11}, y_8, y_9),</math> |
||
⚫ | |||
==== columnround(y) ==== |
==== columnround(y) ==== |
||
Здесь мы берём столбцы такой же матрицы. Преобразуем их функцией <math>quarterround(y)</math>, по аналогии подставляя в неё значения, начиная с ''j''-го для ''j''-го столбца, где ''j''={0,1,2,3}. |
Здесь мы берём столбцы такой же матрицы. Преобразуем их функцией <math>quarterround(y)</math>, по аналогии подставляя в неё значения, начиная с ''j''-го для ''j''-го столбца, где ''j''={0,1,2,3}. |
||
Функция columnround(y)=(z) тоже оперирует последовательностью 16 |
Функция columnround(y)=(z) тоже оперирует последовательностью 16 слов так, что |
||
⚫ | |||
: <math> |
: <math>(z_0, z_4, z_8, z_{12}) = quarterround(y_0, y_4, y_8, y_{12}),</math> |
||
: <math> |
: <math>(z_5, z_9, z_{13}, z_1) = quarterround(y_5, y_9, y_{13}, y_1),</math> |
||
: <math> |
: <math>(z_{10}, z_{14}, z_2, z_6) = quarterround(y_{10}, y_{14}, y_2, y_6),</math> |
||
⚫ | |||
==== doubleround(y) ==== |
==== doubleround(y) ==== |
||
Строка 58: | Строка 73: | ||
==== Salsa20() ==== |
==== Salsa20() ==== |
||
Данный алгоритм использует запись слова [[Порядок байтов|начинающуюся с младшего байта]]. Для этого здесь введено преобразование <math> |
Данный алгоритм использует запись слова, [[Порядок байтов|начинающуюся с младшего байта]]. Для этого здесь введено преобразование <math>littleendian(b)</math> |
||
Пусть <math> |
Пусть <math>b=(b_0,b_1,b_2,b_3)</math> — 4-байтовая последовательность, тогда <math>littleendian(b)</math> — слово, такое, что |
||
: <math> |
: <math>littleendian(b) = b_0 + 2^8 b_1 + 2^{16}b_2 + 2^{24} b_3</math> |
||
Итоговое преобразование — это побитовое суммирование исходной последовательности и результата 20 раундов чередующихся преобразований столбцов и строк. |
Итоговое преобразование — это побитовое суммирование исходной последовательности и результата 20 раундов чередующихся преобразований столбцов и строк. |
||
<math> |
<math>Salsa20(x) = x \oplus doubleround^{10}(x)</math> |
||
⚫ | |||
Где <math>x=(x[0], x[1],..., x[63]), </math> |
|||
: <math> |
: <math>x_0 = littleendian(x[0], x[1], x[2], x[3]),</math> |
||
⚫ | |||
: … |
: … |
||
: <math> |
: <math>x_{15} = littleendian(x[60], x[61], x[62], x[63]).</math> |
||
x[i] — байты x, а x<sub>j</sub> — слова, используемые в описанных выше функциях. |
x[i] — байты x, а x<sub>j</sub> — слова, используемые в описанных выше функциях. |
||
Если |
Если |
||
<math> |
<math>(z_0, z_1,...,z_{15}) = doubleround^{10}(x_0, x_1,..., x_{15})</math>, |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
=== Расширение ключа для Salsa20 === |
=== Расширение ключа для Salsa20 === |
||
Расширение преобразует 32-байтный или 16-байтный ключ ''k'' и 16-байтный номер ''n'' в 64-байтную последовательность <math>Salsa20_k(n)</math>. |
Расширение преобразует 32-байтный или 16-байтный ключ ''k'' и 16-байтный номер ''n'' в 64-байтную последовательность <math>Salsa20_k(n)</math>. |
||
⚫ | |||
⚫ | |||
<math>\ |
Для расширения ''k'' используются константы <br><math>\sigma_0 = (101, 120, 112, 97),~ \sigma_1 = (110, 100, 32, 51),~ \sigma_2 = (50, 45, 98, 121),~ \sigma_3 = (116, 101, 32, 107)</math> |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
для 16-байтного ''k''. |
|||
⚫ | |||
⚫ | |||
⚫ | |||
=== Функция шифрования Salsa20 === |
=== Функция шифрования Salsa20 === |
||
Шифром <math> |
Шифром <math>l</math>-байтной последовательности <math>m</math>, для <math>l\in\{0,1,...2^{70}\}</math> будет <math>Salsa20_k(v)\oplus m </math> |
||
<math> |
<math>v</math> — уникальный 8-байтовый номер (nonce). |
||
⚫ | |||
⚫ | |||
Salsa20<sub>k</sub>(''v'') — последовательность в 2<sup>70</sup> байт. |
Salsa20<sub>k</sub>(''v'') — последовательность в 2<sup>70</sup> байт. |
||
: <math>Salsa20_k(v,\underline{1}),Salsa20_k(v,\underline{2}),...,Salsa20_k(v,\underline{2^{64}-1})</math> |
: <math>Salsa20_k(v,\underline{0}),Salsa20_k(v,\underline{1}),Salsa20_k(v,\underline{2}),...,Salsa20_k(v,\underline{2^{64}-1})</math> |
||
Где <math>\underline{i}</math> — уникальная последовательность в 8 байт <math>(i_0, i_1, ..., i_7)</math> такая что <math>i=i_0 + 2^8i_1 + ... + 2^{56}i_7</math> |
Где <math>\underline{i}</math> — уникальная последовательность в 8 байт <math>(i_0, i_1, ..., i_7)</math> такая что <math>i=i_0 + 2^8i_1 + ... + 2^{56}i_7</math> |
||
Соответственно |
Соответственно |
||
Строка 103: | Строка 129: | ||
== Производительность == |
== Производительность == |
||
Благодаря тому, что преобразования каждого столбца и каждой строки не зависят друг от друга, вычисления, необходимые для шифрования, легко [[Параллельные вычисления|распараллеливаются]]. Это даёт существенный выигрыш в скорости для большинства современных платформ. |
Благодаря тому, что преобразования каждого столбца и каждой строки не зависят друг от друга, вычисления, необходимые для шифрования, легко [[Параллельные вычисления|распараллеливаются]]. Это даёт существенный выигрыш в скорости для большинства современных платформ. |
||
Строка 109: | Строка 134: | ||
== Варианты Salsa20/8 и Salsa20/12 == |
== Варианты Salsa20/8 и Salsa20/12 == |
||
Salsa20/8 и Salsa20/12 это шифросистемы, использующие тот же механизм что и Salsa20, но с 8 |
Salsa20/8 и Salsa20/12 — это шифросистемы, использующие тот же механизм, что и Salsa20, но с 8 и 12 раундами шифрования, соответственно, вместо 20 оригинальных. |
||
Salsa20 был сделан с большим запасом стойкости. Тогда как Salsa20/8 показывает хорошие результаты в быстродействии, обгоняя в большинстве случаев многие другие шифросистемы, в том числе [[Advanced Encryption Standard|AES]] и [[RC4]]<ref>http://cr.yp.to/snuffle/812.pdf</ref> |
Salsa20 был сделан с большим запасом стойкости. Тогда как Salsa20/8 показывает хорошие результаты в быстродействии, обгоняя в большинстве случаев многие другие шифросистемы, в том числе [[Advanced Encryption Standard|AES]] и [[RC4]]<ref>{{Cite web |url=http://cr.yp.to/snuffle/812.pdf |title=Архивированная копия |access-date=2010-11-11 |archive-date=2017-12-15 |archive-url=https://web.archive.org/web/20171215110705/http://cr.yp.to/snuffle/812.pdf |deadlink=no }}</ref>. |
||
== Вариант XSalsa20 == |
|||
Существует вариант алгоритма Salsa20, также предложенный Даниэлем Бернштейном, в котором длина [[nonce]] увеличена с 64 до 192 бит. Данный вариант называется XSalsa20. Увеличенный размер nonce позволяет использовать для его генерации [[криптографически стойкий генератор псевдослучайных чисел]], в то время как для безопасного шифрования с 64-битным nonce необходимо использование счётчика из-за высокой вероятности коллизий<ref>{{Cite web |url=http://cr.yp.to/snuffle/xsalsa-20110204.pdf |title=Архивированная копия |access-date=2016-09-13 |archive-date=2018-09-18 |archive-url=https://web.archive.org/web/20180918234545/https://cr.yp.to/snuffle/xsalsa-20110204.pdf |deadlink=no }}</ref>. |
|||
== Криптоанализ == |
== Криптоанализ == |
||
В 2005 году Paul Crowley объявил об [[Криптографическая атака|атаке]] на Salsa20/5 с расчетной сложностью по времени 2<sup>165</sup>. Эта и последующие атаки основаны на усеченном [[Дифференциальный криптоанализ|дифференциальном криптоанализе]](truncated differential cryptanalysis). За этот криптоанализ он получил награду в 1000$ от автора Salsa20. |
В 2005 году Paul Crowley объявил об [[Криптографическая атака|атаке]] на Salsa20/5 с расчетной сложностью по времени 2<sup>165</sup>. Эта и последующие атаки основаны на усеченном [[Дифференциальный криптоанализ|дифференциальном криптоанализе]] (truncated differential cryptanalysis). За этот криптоанализ он получил награду в 1000$ от автора Salsa20. |
||
⚫ | |||
B 2006, Fischer, Meier, Berbain, Biasse, и Robshaw сообщили об атаке на Salsa/6 со сложностью 2<sup>117</sup>, и об атаке со [[Атака на связанных ключах|связанными ключами]] на Salsa20/7 со сложностью 2<sup>217</sup>. |
|||
⚫ | |||
Пока что не было публичных сообщений об атаках на Salsa20/12 и полную Salsa20/20. |
Пока что не было публичных сообщений об атаках на Salsa20/12 и полную Salsa20/20. |
||
Строка 122: | Строка 152: | ||
[[Файл:Salsa20 ChaCha variant.png|frame|Вариант ChaCha функции ''quarterround(a, b, c, d)'']] |
[[Файл:Salsa20 ChaCha variant.png|frame|Вариант ChaCha функции ''quarterround(a, b, c, d)'']] |
||
В 2008 году Daniel Bernstein опубликовал родственное семейство [[Поточный шифр|поточных шифров]] под названием ChaCha, целью которого было улучшение перемешивания данных за один раунд и, предположительно, улучшение [[Криптостойкость|криптостойкости]] при той же |
В 2008 году Daniel Bernstein опубликовал родственное семейство [[Поточный шифр|поточных шифров]] под названием ChaCha, целью которого было улучшение перемешивания данных за один раунд и, предположительно, улучшение [[Криптостойкость|криптостойкости]] при той же или даже немного большей скорости<ref>{{Cite web |url=http://cr.yp.to/chacha/chacha-20080128.pdf |title=Архивированная копия |access-date=2010-11-11 |archive-date=2018-05-02 |archive-url=https://web.archive.org/web/20180502171428/https://cr.yp.to/chacha/chacha-20080128.pdf |deadlink=no }}</ref>. |
||
ChaCha20 описан в RFC 7539 (май 2015). |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
: <math>a += b;~~ d \oplus= a;~~ d \lll= 16;</math> |
: <math>a += b;~~ d \oplus= a;~~ d \lll= 16;</math> |
||
: <math>c += d;~~ b \oplus= c;~~ b \lll= 12;</math> |
: <math>c += d;~~ b \oplus= c;~~ b \lll= 12;</math> |
||
: <math>a += b;~~ d \oplus= a;~~ d \lll= 8;</math> |
: <math>a += b;~~ d \oplus= a;~~ d \lll= 8;</math> |
||
: <math>c += d;~~ b \oplus= c;~~ b \lll= 7;</math> |
: <math>c += d;~~ b \oplus= c;~~ b \lll= 7;</math> |
||
Здесь используются те же самые арифметические операции, но каждое слово изменяется два раза за преобразование вместо одного. |
Здесь используются те же самые арифметические операции, но каждое слово изменяется два раза за преобразование вместо одного. |
||
Кроме того, изменено начальное состояние шифра (расширение ключа) по сравнению с Salsa: первые 128 бит занимают константы, затем следует 256 бит ключа, 32 бита счетчика и затем 96 бит уникальной последовательности nonce. |
|||
== Примечания == |
== Примечания == |
||
Строка 144: | Строка 179: | ||
* [http://cr.yp.to/snuffle/speed.pdf Salsa20 speed] |
* [http://cr.yp.to/snuffle/speed.pdf Salsa20 speed] |
||
{{симметричные криптоалгоритмы}} |
|||
⚫ | |||
⚫ |
Текущая версия от 09:17, 18 мая 2022
Salsa20 — система поточного шифрования, разработанная Даниэлем Бернштейном[англ.]. Алгоритм был представлен на конкурсе «eSTREAM», целью которого было создание европейских стандартов для шифрования данных, передаваемых почтовыми системами. Алгоритм стал победителем конкурса в первом профиле (поточные шифры для программного применения с большой пропускной способностью).
Шифр Salsa20 использует следующие операции:
- сложение 32-битных чисел;
- побитовое сложение по модулю 2 (xor);
- сдвиги битов.
Алгоритм использует хеш-функцию с 20 циклами. Основные её преобразования напоминают алгоритм AES.
Описание алгоритма
[править | править код]Понятия
[править | править код]Словом далее будем называть элемент множества {0,1,…,232−1} и записывать в шестнадцатеричном виде с префиксом 0х.
Операцию сложения двух слов по модулю 232 будем обозначать знаком «».
Исключающее или (побитовое суммирование) будем обозначать символом «»
-битовый циклический левый сдвиг слова будем обозначать . Если представить как , тогда
Функции, используемые в алгоритме
[править | править код]quarterround(y)
[править | править код]Основным блоком системы является преобразование над четырьмя словами. Из него строятся далее описанные более общие преобразования.
Его суть заключается в том, что для каждого слова мы складываем два предыдущих, сдвигаем (циклично) сумму на определённое количество бит и побитово суммируем результат с выбранным словом. Последующие операции производятся с новыми значениями слов.
Допустим, что — последовательность 4 слов тогда функция где
Например:
quarterround(0x00000001; 0x00000000; 0x00000000; 0x00000000)
= (0x08008145; 0x00000080; 0x00010200; 0x20500000)
Можно рассматривать эту функцию как преобразования слов y0, y1, y2 и y3. Каждое из таких преобразований обратимо, как и функция в целом.
rowround(y)
[править | править код]
В этом преобразовании мы берем 16 слов. Представим их в виде матрицы 4х4. Берем каждый ряд этой матрицы и преобразуем слова этой матрицы функцией . Слова из строки берутся по порядку, начиная с i-го для i-й строки, где i={0,1,2,3}.
Пусть — последовательность 16 слов, тогда — также последовательность 16 слов где
columnround(y)
[править | править код]Здесь мы берём столбцы такой же матрицы. Преобразуем их функцией , по аналогии подставляя в неё значения, начиная с j-го для j-го столбца, где j={0,1,2,3}.
Функция columnround(y)=(z) тоже оперирует последовательностью 16 слов так, что
doubleround(y)
[править | править код]Функция doubleround(y) является последовательным применением функций columnround а затем rowround: doubleround(y) = rowround(columnround(y))
Salsa20()
[править | править код]Данный алгоритм использует запись слова, начинающуюся с младшего байта. Для этого здесь введено преобразование
Пусть — 4-байтовая последовательность, тогда — слово, такое, что
Итоговое преобразование — это побитовое суммирование исходной последовательности и результата 20 раундов чередующихся преобразований столбцов и строк.
Где
- …
x[i] — байты x, а xj — слова, используемые в описанных выше функциях.
Если
,
тогда Salsa20(x) является последовательностью результатов
Расширение ключа для Salsa20
[править | править код]Расширение преобразует 32-байтный или 16-байтный ключ k и 16-байтный номер n в 64-байтную последовательность .
Для расширения k используются константы
для 32-байтного k и
для 16-байтного k.
Это записи «expand 32-byte k» и «expand 16-byte k» в ASCII-коде.
Пусть у k0,k1,n — 16-байтовые последовательности, тогда
.
Если у нас только одна 16-байтовая последовательность k то
Функция шифрования Salsa20
[править | править код]Шифром -байтной последовательности , для будет
— уникальный 8-байтовый номер (nonce).
Шифротекст будет размером в байт, так же, как и исходный текст.
Salsa20k(v) — последовательность в 270 байт.
Где — уникальная последовательность в 8 байт такая что Соответственно
Где
Производительность
[править | править код]Благодаря тому, что преобразования каждого столбца и каждой строки не зависят друг от друга, вычисления, необходимые для шифрования, легко распараллеливаются. Это даёт существенный выигрыш в скорости для большинства современных платформ.
Алгоритм практически не имеет накладных вычислений, необходимых для запуска цикла шифрования. Это так же относится к смене ключа. Многие шифросистемы рассчитывают на предварительные вычисления, результаты которых должны храниться в кэше первого уровня (L1) процессора. Так как они зависят от ключа, вычисления придётся проводить заново. В Salsa20 же достаточно просто загрузить ключ в память.
Варианты Salsa20/8 и Salsa20/12
[править | править код]Salsa20/8 и Salsa20/12 — это шифросистемы, использующие тот же механизм, что и Salsa20, но с 8 и 12 раундами шифрования, соответственно, вместо 20 оригинальных. Salsa20 был сделан с большим запасом стойкости. Тогда как Salsa20/8 показывает хорошие результаты в быстродействии, обгоняя в большинстве случаев многие другие шифросистемы, в том числе AES и RC4[1].
Вариант XSalsa20
[править | править код]Существует вариант алгоритма Salsa20, также предложенный Даниэлем Бернштейном, в котором длина nonce увеличена с 64 до 192 бит. Данный вариант называется XSalsa20. Увеличенный размер nonce позволяет использовать для его генерации криптографически стойкий генератор псевдослучайных чисел, в то время как для безопасного шифрования с 64-битным nonce необходимо использование счётчика из-за высокой вероятности коллизий[2].
Криптоанализ
[править | править код]В 2005 году Paul Crowley объявил об атаке на Salsa20/5 с расчетной сложностью по времени 2165. Эта и последующие атаки основаны на усеченном дифференциальном криптоанализе (truncated differential cryptanalysis). За этот криптоанализ он получил награду в 1000$ от автора Salsa20.
B 2006, Fischer, Meier, Berbain, Biasse, и Robshaw сообщили об атаке на Salsa/6 со сложностью 2117, и об атаке со связанными ключами на Salsa20/7 со сложностью 2217.
B 2008 году Aumasson, Fischer, Khazaei, Meier и Rechberger сообщили об атаке на Salsa20/7 со сложностью 2153 и о первой атаке на Salsa20/8 со сложностью 2251.
Пока что не было публичных сообщений об атаках на Salsa20/12 и полную Salsa20/20.
ChaCha
[править | править код]В 2008 году Daniel Bernstein опубликовал родственное семейство поточных шифров под названием ChaCha, целью которого было улучшение перемешивания данных за один раунд и, предположительно, улучшение криптостойкости при той же или даже немного большей скорости[3].
ChaCha20 описан в RFC 7539 (май 2015).
Основной блок системы здесь работает иначе. Теперь каждая операция изменяет одно из слов. Изменения происходят циклически «в обратную сторону», начиная с 0-го слова. Чередуются операции сложения и побитовой суммы вместе со сдвигом, складывается слово с предыдущим.
Функция quarterround(a, b, c, d), где a, b, c, d-слова, в ChaCha выглядит следующим образом:
Здесь используются те же самые арифметические операции, но каждое слово изменяется два раза за преобразование вместо одного.
Кроме того, изменено начальное состояние шифра (расширение ключа) по сравнению с Salsa: первые 128 бит занимают константы, затем следует 256 бит ключа, 32 бита счетчика и затем 96 бит уникальной последовательности nonce.
Примечания
[править | править код]- ↑ Архивированная копия . Дата обращения: 11 ноября 2010. Архивировано 15 декабря 2017 года.
- ↑ Архивированная копия . Дата обращения: 13 сентября 2016. Архивировано 18 сентября 2018 года.
- ↑ Архивированная копия . Дата обращения: 11 ноября 2010. Архивировано 2 мая 2018 года.