Movatterモバイル変換


[0]ホーム

URL:


Перейти до вмісту
Вікіпедія
Пошук

Salsa20

Неперевірена версія(що робити?)
Матеріал з Вікіпедії — вільної енциклопедії.

Статус версії сторінки

Сторінка не перевірена

Немаєперевірених версій цієї сторінки; ймовірно, її щене перевіряли на відповідність правилам проєкту.

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} — послідовність слів 4y=(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 криптоаналіз). За цей криптоаналіз він отримав нагороду в 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 році Даніель Берштейн опублікував споріднене сімействопотокових шифрів під назвою 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;}

Тут використовуються ті ж самі арифметичні операції, але кожне слово змінюється два рази за перетворення замість одного.

Примітки

[ред. |ред. код]
  1. Daniel J. Bernstein.Salsa20/8 and Salsa20/12(PDF).cr.yp.to(англ.). Архіворигіналу(PDF) за 15 грудня 2017. Процитовано 10 квітня 2018.
  2. Daniel J. Bernstein (4 лютого 2011).Extending the Salsa20 nonce(PDF).cr.yp.to(англ.). Архіворигіналу(PDF) за 18 вересня 2018. Процитовано 10 квітня 2018.
  3. Daniel J. Bernstein ? (28 січня 2008).ChaCha, a variant of Salsa20(PDF).cr.yp.to(англ.). Архіворигіналу(PDF) за 2 травня 2018. Процитовано 10 квітня 2018.

Посилання

[ред. |ред. код]
Отримано зhttps://uk.wikipedia.org/wiki/Salsa20
Категорія:
Приховані категорії:

[8]ページ先頭

©2009-2025 Movatter.jp