Salsa20

Материал из Википедии — свободной энциклопедии
Текущая версия страницы покане проверялась опытными участниками и может значительно отличаться отверсии, проверенной 26 июня 2025 года; проверки требуют26 правок.
Перейти к навигацииПерейти к поиску

Salsa20 — системапоточного шифрования, разработаннаяДаниэлем Бернштейном. Алгоритм был представлен на конкурсе «eSTREAM», целью которого было создание европейских стандартов для шифрования данных, передаваемых почтовыми системами. Алгоритм стал победителем конкурса в первом профиле (поточные шифры для программного применения с большой пропускной способностью).

Шифр Salsa20 использует следующие операции:

Алгоритм используетхеш-функцию с 20циклами. Основные её преобразования напоминают алгоритмAES.

Содержание

Описание алгоритма

[править |править код]

Понятия

[править |править код]

Словом далее будем называть элемент множества {0,1,…,232−1} и записывать в шестнадцатеричном виде с префиксом 0х.

Операциюсложения двух слов по модулю 232 будем обозначать знаком «+{\displaystyle +}».

Исключающее или (побитовое суммирование) будем обозначать символом «{\displaystyle \oplus }»

c{\displaystyle c}-битовый циклический левый сдвиг словаu{\displaystyle u} будем обозначатьuc{\displaystyle u\lll c}. Еслиu{\displaystyle u} представить какu=i=02iui{\displaystyle u=\sum _{i=0}2^{i}u_{i}}, тогда

uc=i=02i+cmod32ui{\displaystyle u\lll c=\sum _{i=0}2^{i+c\mod 32}u_{i}}

Функции, используемые в алгоритме

[править |править код]
quarterround(y0,y1,y2,y3){\displaystyle quarterround(y_{0},y_{1},y_{2},y_{3})}

quarterround(y)

[править |править код]

Основным блоком системы является преобразованиеquarterround(y){\displaystyle quarterround(y)} над четырьмя словами. Из него строятся далее описанные более общие преобразования.

Его суть заключается в том, что для каждого слова мы складываем два предыдущих, сдвигаем (циклично) сумму на определённое количество бит и побитово суммируем результат с выбранным словом. Последующие операции производятся с новыми значениями слов.

Допустим, чтоy{\displaystyle y} — последовательность 4 словy=(y0,y1,y2,y3){\displaystyle y=(y_{0},y_{1},y_{2},y_{3})} тогда функцияquarterround(y)=(z0,z1,z2,z3){\displaystyle quarterround(y)=(z_{0},z_{1},z_{2},z_{3})} где

z1=y1((y0+y3)7),{\displaystyle z_{1}=y_{1}\oplus ((y_{0}+y_{3})\lll 7),}
z2=y2((z1+y0)9),{\displaystyle z_{2}=y_{2}\oplus ((z_{1}+y_{0})\lll 9),}
z3=y3((z2+z1)13),{\displaystyle z_{3}=y_{3}\oplus ((z_{2}+z_{1})\lll 13),}
z0=y0((z3+z2)18).{\displaystyle z_{0}=y_{0}\oplus ((z_{3}+z_{2})\lll 18).}

Например:

quarterround(0x00000001; 0x00000000; 0x00000000; 0x00000000)
= (0x08008145; 0x00000080; 0x00010200; 0x20500000)

Можно рассматривать эту функцию как преобразования слов y0, y1, y2 и y3. Каждое из таких преобразований обратимо, как и функция в целом.

rowround(y)

[править |править код]

y=(y0y1y2y3y4y5y6y7y8y9y10y11y12y13y14y15){\displaystyle y={\begin{pmatrix}y_{0}&y_{1}&y_{2}&y_{3}\\y_{4}&y_{5}&y_{6}&y_{7}\\y_{8}&y_{9}&y_{10}&y_{11}\\y_{12}&y_{13}&y_{14}&y_{15}\end{pmatrix}}}

В этом преобразовании мы берем 16 слов. Представим их в виде матрицы 4х4. Берем каждый ряд этой матрицы и преобразуем слова этой матрицы функциейquarterround(y){\displaystyle quarterround(y)}. Слова из строки берутся по порядку, начиная сi-го дляi-й строки, гдеi={0,1,2,3}.

Пустьy=(y0,y1,y2,...,y15){\displaystyle y=(y_{0},y_{1},y_{2},...,y_{15})} — последовательность 16 слов, тогдаrowround(y)=(z0,z1,z2,...,z15){\displaystyle rowround(y)=(z_{0},z_{1},z_{2},...,z_{15})} — также последовательность 16 слов где

(z0,z1,z2,z3)=quarterround(y0,y1,y2,y3),{\displaystyle (z_{0},z_{1},z_{2},z_{3})=quarterround(y_{0},y_{1},y_{2},y_{3}),}
(z5,z6,z7,z4)=quarterround(y5,y6,y7,y4),{\displaystyle (z_{5},z_{6},z_{7},z_{4})=quarterround(y_{5},y_{6},y_{7},y_{4}),}
(z10,z11,z8,z9)=quarterround(y10,y11,y8,y9),{\displaystyle (z_{10},z_{11},z_{8},z_{9})=quarterround(y_{10},y_{11},y_{8},y_{9}),}
(z15,z12,z13,z14)=quarterround(y15,y12,y13,y14).{\displaystyle (z_{15},z_{12},z_{13},z_{14})=quarterround(y_{15},y_{12},y_{13},y_{14}).}

columnround(y)

[править |править код]

Здесь мы берём столбцы такой же матрицы. Преобразуем их функциейquarterround(y){\displaystyle quarterround(y)}, по аналогии подставляя в неё значения, начиная сj-го дляj-го столбца, гдеj={0,1,2,3}.

Функция columnround(y)=(z) тоже оперирует последовательностью 16 слов так, что

(z0,z4,z8,z12)=quarterround(y0,y4,y8,y12),{\displaystyle (z_{0},z_{4},z_{8},z_{12})=quarterround(y_{0},y_{4},y_{8},y_{12}),}
(z5,z9,z13,z1)=quarterround(y5,y9,y13,y1),{\displaystyle (z_{5},z_{9},z_{13},z_{1})=quarterround(y_{5},y_{9},y_{13},y_{1}),}
(z10,z14,z2,z6)=quarterround(y10,y14,y2,y6),{\displaystyle (z_{10},z_{14},z_{2},z_{6})=quarterround(y_{10},y_{14},y_{2},y_{6}),}
(z15,z3,z7,z11)=quarterround(y15,y3,y7,y11).{\displaystyle (z_{15},z_{3},z_{7},z_{11})=quarterround(y_{15},y_{3},y_{7},y_{11}).}

doubleround(y)

[править |править код]

Функцияdoubleround(y) является последовательным применением функцийcolumnround а затемrowround:doubleround(y) =rowround(columnround(y))

Salsa20()

[править |править код]

Данный алгоритм использует запись слова,начинающуюся с младшего байта. Для этого здесь введено преобразованиеlittleendian(b){\displaystyle littleendian(b)}

Пустьb=(b0,b1,b2,b3){\displaystyle b=(b_{0},b_{1},b_{2},b_{3})} — 4-байтовая последовательность, тогдаlittleendian(b){\displaystyle littleendian(b)} — слово, такое, что

littleendian(b)=b0+28b1+216b2+224b3{\displaystyle littleendian(b)=b_{0}+2^{8}b_{1}+2^{16}b_{2}+2^{24}b_{3}}

Итоговое преобразование — это побитовое суммирование исходной последовательности и результата 20 раундов чередующихся преобразований столбцов и строк.

Salsa20(x)=xdoubleround10(x){\displaystyle Salsa20(x)=x\oplus doubleround^{10}(x)}

Гдеx=(x[0],x[1],...,x[63]),{\displaystyle x=(x[0],x[1],...,x[63]),}

x0=littleendian(x[0],x[1],x[2],x[3]),{\displaystyle x_{0}=littleendian(x[0],x[1],x[2],x[3]),}
x1=littleendian(x[4],x[5],x[6],x[7]),{\displaystyle x_{1}=littleendian(x[4],x[5],x[6],x[7]),}
x15=littleendian(x[60],x[61],x[62],x[63]).{\displaystyle x_{15}=littleendian(x[60],x[61],x[62],x[63]).}

x[i] — байты x, а xj — слова, используемые в описанных выше функциях.

Если

(z0,z1,...,z15)=doubleround10(x0,x1,...,x15){\displaystyle (z_{0},z_{1},...,z_{15})=doubleround^{10}(x_{0},x_{1},...,x_{15})},

тогда Salsa20(x) является последовательностью результатов

littleendian1(z0+x0),...,littleendian1(z15+x15){\displaystyle littleendian^{-1}(z_{0}+x_{0}),...,littleendian^{-1}(z_{15}+x_{15})}

Расширение ключа для Salsa20

[править |править код]

Расширение преобразует 32-байтный или 16-байтный ключk и 16-байтный номерn в 64-байтную последовательностьSalsa20k(n){\displaystyle Salsa20_{k}(n)}.

Для расширенияk используются константы
σ0=(101,120,112,97), σ1=(110,100,32,51), σ2=(50,45,98,121), σ3=(116,101,32,107){\displaystyle \sigma _{0}=(101,120,112,97),~\sigma _{1}=(110,100,32,51),~\sigma _{2}=(50,45,98,121),~\sigma _{3}=(116,101,32,107)}

для 32-байтногоk и

τ0=(101;120;112;97), τ1=(110;100;32;49), τ2=(54;45;98;121), τ3=(116;101;32;107){\displaystyle \tau _{0}=(101;120;112;97),~\tau _{1}=(110;100;32;49),~\tau _{2}=(54;45;98;121),~\tau _{3}=(116;101;32;107)}

для 16-байтногоk.

Это записи «expand 32-byte k» и «expand 16-byte k» вASCII-коде.

Пусть у k0,k1,n — 16-байтовые последовательности, тогда
Salsa20k0,k1(n)=Salsa20(σ0,k0,σ1,n,σ2,k1,σ3){\displaystyle Salsa20_{k_{0},k_{1}}(n)=Salsa20(\sigma _{0},k_{0},\sigma _{1},n,\sigma _{2},k_{1},\sigma _{3})}.

Если у нас только одна 16-байтовая последовательностьk то
Salsa20k(n)=Salsa20(τ0,k,τ1,n,τ2,k,τ3){\displaystyle Salsa20_{k}(n)=Salsa20(\tau _{0},k,\tau _{1},n,\tau _{2},k,\tau _{3})}

Функция шифрования Salsa20

[править |править код]

Шифромl{\displaystyle l}-байтной последовательностиm{\displaystyle m}, дляl{0,1,...270}{\displaystyle l\in \{0,1,...2^{70}\}} будетSalsa20k(v)m{\displaystyle Salsa20_{k}(v)\oplus m}

v{\displaystyle v} — уникальный 8-байтовый номер (nonce).

Шифротекст будет размером вl{\displaystyle l} байт, так же, как и исходный текст.

Salsa20k(v) — последовательность в 270 байт.

Salsa20k(v,0_),Salsa20k(v,1_),Salsa20k(v,2_),...,Salsa20k(v,2641_){\displaystyle Salsa20_{k}(v,{\underline {0}}),Salsa20_{k}(v,{\underline {1}}),Salsa20_{k}(v,{\underline {2}}),...,Salsa20_{k}(v,{\underline {2^{64}-1}})}

Гдеi_{\displaystyle {\underline {i}}} — уникальная последовательность в 8 байт(i0,i1,...,i7){\displaystyle (i_{0},i_{1},...,i_{7})} такая чтоi=i0+28i1+...+256i7{\displaystyle i=i_{0}+2^{8}i_{1}+...+2^{56}i_{7}}Соответственно

Salsa20k(v)(m[0],m[1],..,m[l1])=(c[0],c[1],...,c[l1]){\displaystyle Salsa20_{k}(v)\oplus (m[0],m[1],..,m[l-1])=(c[0],c[1],...,c[l-1])}

Гдеc[i]=m[i]Salsa20k(v,bi/64_c)[imod64]{\displaystyle c[i]=m[i]\oplus Salsa20_{k}(v,{\mathcal {b}}{\underline {i/64}}{\mathcal {c}})[i\mod 64]}

Производительность

[править |править код]

Благодаря тому, что преобразования каждого столбца и каждой строки не зависят друг от друга, вычисления, необходимые для шифрования, легкораспараллеливаются. Это даёт существенный выигрыш в скорости для большинства современных платформ.

Алгоритм практически не имеет накладных вычислений, необходимых для запуска цикла шифрования. Это так же относится к смене ключа. Многие шифросистемы рассчитывают на предварительные вычисления, результаты которых должны храниться вкэше первого уровня (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

[править |править код]
Вариант ChaCha функцииquarterround(a, b, c, d)

В 2008 году Daniel Bernstein опубликовал родственное семействопоточных шифров под названием ChaCha, целью которого было улучшение перемешивания данных за один раунд и, предположительно, улучшениекриптостойкости при той же или даже немного большей скорости[3].

ChaCha20 описан вRFC 7539 (май 2015).

Основной блок системы здесь работает иначе. Теперькаждая операция изменяет одно из слов. Изменения происходят циклически «в обратную сторону», начиная с 0-го слова. Чередуются операции сложения и побитовой суммы вместе со сдвигом, складывается слово с предыдущим.

Функция quarterround(a, b, c, d), где a, b, c, d-слова, в ChaCha выглядит следующим образом:

a+=b;  d=a;  d⋘=16;{\displaystyle a+=b;~~d\oplus =a;~~d\lll =16;}
c+=d;  b=c;  b⋘=12;{\displaystyle c+=d;~~b\oplus =c;~~b\lll =12;}
a+=b;  d=a;  d⋘=8;{\displaystyle a+=b;~~d\oplus =a;~~d\lll =8;}
c+=d;  b=c;  b⋘=7;{\displaystyle c+=d;~~b\oplus =c;~~b\lll =7;}

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

Кроме того, изменено начальное состояние шифра (расширение ключа) по сравнению с Salsa: первые 128 бит занимают константы, затем следует 256 бит ключа, 32 бита счетчика и затем 96 бит уникальной последовательности nonce.

Примечания

[править |править код]
  1. Архивированная копия . Дата обращения: 11 ноября 2010. Архивировано 15 декабря 2017 года.
  2. Архивированная копия . Дата обращения: 13 сентября 2016. Архивировано 18 сентября 2018 года.
  3. Архивированная копия . Дата обращения: 11 ноября 2010. Архивировано 2 мая 2018 года.

Ссылки

[править |править код]
Перейти к шаблону «Симметричные криптосистемы»
Потоковые шифры
Сеть Фейстеля
SP-сеть
Другие
Источник —https://ru.wikipedia.org/w/index.php?title=Salsa20&oldid=150464813
Категория:
Скрытая категория: