Salsa20 — система поточного шифрования разработанная Daniel J. Bernstein. Алгоритм был представлен на конкурсе eSTREAM, целью которого было создание европейских стандартов для поточных систем шифрования. Алгоритм стал победителем конкурса в первом профиле (поточные шифры для программного применения с большой пропускной способностью).
Salsa20 основана на операциях 32-битного суммирования, побитового сложения(XOR) и операции сдвига. Алгоритм использует хеш-функцию с 20-ю циклами. Основные ее преобразования напоминают алгоритм AES.
Описание алгоритма
Понятия
Словом далее будем называть элемент множества {0,1,…,232−1} и записывать в шестнадцатеричном виде с префиксом 0х.
Операцию суммы двух слов по модулю 232 будем обозначать знаком «+».
Исключающее или (побитовое суммирование) будем обозначать символом «⊕»
c-битовый левый сдвиг слова u будем обозначать u<<<c. если u представить как u=Σi2iui
u<<<c=Σi2i+c mod 32ui
Функции, используемые в алгоритме
quarterround(y)
Допустим, что y — последовательность 4-х слов тогда функция где
Например:
quarterround(0x00000001; 0x00000000; 0x00000000; 0x00000000)
= (0x08008145; 0x00000080; 0x00010200; 0x20500000)
Можно рассматривать эту функцию как преобразование слов y1, y2, y3 и y4. Каждое преобразование обратимо, как и функция в целом.
rowround(y)
Пусть теперь — последовательность 16 слов, тогда — также последовательность 16 слов где
y можно представить как матрицу 4х4, тогда функция rowround(y) — это функции quaterrouund(y) над ее переставленными рядами.
columnround(y)
Функция columnround(y)=(z) тоже оперирует последовательностью 16-и слов так, что
В матричном представлении y, columnround(y) производит операции quarterround(y) над ее переставленными столбцами.
doubleround(y)
Функция doubleround(y) является последовательным применением функций columnround а затем rowround: doubleround(y) =
rowround(columnround(y))
Salsa20()
Пусть — 4-байтовая последовательность, тогда littleendian(b) — слово, такое что
Что является записью 4-х байт начиная с младшего.
Где
- …
x[i] — байты x, а x_j — слова, используемые в описанных выше функциях.
Если , тогда Salsa20(x) является последовательностью результатов littleendian^{-1}(z_0 + x_0),…,littleendian^{-1}(z_15 + x_15)
Расширение для Salsa20
Расширение преобразует 32-байтный или 16-байтный k и 16-байтный n в 64-байтную последовательность Salsa20_k(n).
Для расширения k используются константы
для 32-битного k и
для 16-битного k.
Это записи «expand 32-byte k» и «expand 16-byte k» ASCII-коде.
Пусть у k_0,k_1,n — 16-байтовые последовательности, тогда
.
Если у нас только одна 16-байтовая последовательность k то
Функция шифрования Salsa20
Шифром l-байтной последовательности m, для будет
v — уникальный 8-байтовый номер(nonce).
Шифротекст будет будет размером в 70 байт, так же как и исходный текст.
Salsa20k(v) — последовательность в 270 байт.
Где — уникальная последовательность в 8 байт такая что
Соответственно
Где
Варианты Salsa20/8 и Salsa20/12
Salsa20/8 и Salsa20/12 это шифросистемы, использующие тот же механизм что и Salsa20, но с 8-ю и 12-ю раундами шифрования соответственно вместо 20 оригинальных.
Salsa20 был сделан с большим запасом стойкости. Тогда как Salsa20/8 показывает хорошие результаты в быстродействии, обгоняя в большинстве случаев многие другие шифросистемы, в том числе AES и RC4[1]
Криптоанализ
В 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, целью которого было улучшение перемешивания данных за один раунд и, предположительно, улучшение криптостойкости при той же, или даже немного большей скорости.[2]
Функция quarterround(a, b,c, d), где a, b,c, d-слова, в ChaCha выглядит следующим образом
Здесь используются те же самые арифметические операции, но каждое слово изменяется два раза вместо одного.
Примечания
Ссылки