Эта статья входит в число добротных статей

Blowfish: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Автор написал умножение по модулю (которым тут и не пахнет) вместо сложения (см. рис. и спец литературу)
 
(не показаны 84 промежуточные версии 27 участников)
Строка 9: Строка 9:
|тип = [[Сеть Фейстеля]]
|тип = [[Сеть Фейстеля]]
}}
}}
'''Blowfish''' (произносится [бло́уфиш]) — криптографический [[алгоритм]], реализующий [[Блочный шифр|блочное]] [[симметричное шифрование]].
'''Blowfish''' (произносится [бло́уфиш]) — криптографический [[алгоритм]], реализующий [[Блочный шифр|блочное]] [[симметричное шифрование]] с переменной длиной ключа. Разработан [[Шнайер, Брюс|Брюсом Шнайером]] в [[1993 год]]у. Представляет собой [[сеть Фейстеля]]{{sfn|Schneier|1996}}{{sfn|Yuen|2005}}. Выполнен на простых и быстрых операциях: [[XOR]], подстановка, сложение{{sfn|Yuen|2005}}. Является незапатентованным и свободно распространяемым.

Разработан [[Шнайер, Брюс|Брюсом Шнайером]] в [[1993 год]]у. Представляет собой [[сеть Фейстеля]]. Выполнен на простых и быстрых операциях: [[XOR]], подстановка, сложение. Является незапатентованным и свободно распространяемым.


== История ==
== История ==
До появления Blowfish существовавшие алгоритмы были либо запатентованными, либо ненадёжными, а некоторые и вовсе держались в секрете (например, [[Skipjack]]). Алгоритм был разработан в 1993 году Брюсом Шнайером в качестве быстрой и свободной альтернативы устаревшему [[DES]] и запатентованному [[IDEA]].
До появления Blowfish существовавшие алгоритмы были либо запатентованными, либо ненадёжными, а некоторые и вовсе держались в секрете (например, [[Skipjack]]). Алгоритм был разработан в 1993 году Брюсом Шнайером в качестве быстрой и свободной альтернативы устаревшему [[DES]] и запатентованному [[IDEA]].
По заявлению автора, критерии проектирования Blowfish были:
По заявлению автора, критериями проектирования Blowfish были{{sfn|Schneier|1996}}{{sfn|Yuen|2005}}:
* скорость (шифрование на 32-битных процессорах происходит за 26 тактов);
* скорость (шифрование на 32-битных процессорах происходит за 26 тактов);
* простота (за счёт использования простых операций, уменьшающих вероятность ошибки реализации алгоритма);
* простота (за счёт использования простых операций, уменьшающих вероятность ошибки реализации алгоритма);
* компактность;
* компактность (возможность работать в менее, чем 5 Кбайт памяти);
* настраиваемая стойкость.
* настраиваемая безопасность (изменяемая длина ключа).


== Описание алгоритма ==
== Описание алгоритма ==
Алгоритм состоит из двух частей: расширение ключа и шифрование данных. На этапе расширения ключа исходный ключ (длиной до 448 бит) преобразуется в 18 32-битовых подключей и в 4 32-битных S-блока, содержащих 256 элементов. Общий объём полученных ключей равен <math>(18+256*4)*32 = 33344</math> бит или <math>4168</math> байт{{sfn|Schneier|1996}}{{sfn|Yuen|2005}}.

=== Параметры ===
=== Параметры ===
* секретный ключ K (от 32 до 448 бит)
* секретный ключ <math>K</math> (от 32 до 448 бит)
* 32-битные ключи шифрования P1-P18
* 32-битные ключи шифрования <math>P_{1} - P_{18}</math>
* 32-битные таблицы замен S1-S4:
* 32-битные таблицы замен <math>S_{1} - S_{4}</math>:
*: S1[0] S1[1] .. S1[255]
*: <math>S_{1}[0],\ S_{1}[1],\ ...,\ S_{1}[255]</math>
*: S2[0] S2[1] .. S2[255]
*: <math>S_{2}[0],\ S_{2}[1],\ ...,\ S_{2}[255]</math>
*: S3[0] S3[1] .. S3[255]
*: <math>S_{3}[0],\ S_{3}[1],\ ...,\ S_{3}[255]</math>
*: S4[0] S4[1] .. S4[255]
*: <math>S_{4}[0],\ S_{4}[1],\ ...,\ S_{4}[255]</math>


=== Функция F(x) ===
=== Функция F(x) ===
[[Файл:BlowfishFFunction.svg|right|thumbnail|215px| Функция F(x) в Blowfish]]
[[Файл:BlowfishFFunction.svg|right|thumbnail|215px| Функция F(x) в Blowfish]]Функция F(x) принимает на вход блок размером в 32 бита и проделывает с ним следующие операции{{sfn|Yuen|2005}}:
# 32-битный блок делится на четыре 8-битных блока (X1, X2, X3, X4), каждый из которых является индексом массива таблицы замен S1-S4
# 32-битный блок делится на четыре 8-битных блока <math>(X_{1}, X_{2}, X_{3}, X_{4})</math>, каждый из которых является индексом массива таблицы замен <math>S_{1}-S_{4}</math>
# значения S1[X1] и S2[X2] складываются по модулю <math>2^{32}</math>, после "XOR"ятся с S3[X3] и, наконец, складываются с S4[X4] по модулю <math>2^{32}</math>.
# значения <math>S_{1}[X_{1}]</math> и <math>S_{2}[X_{2}]</math> складываются по модулю <math>2^{32}</math>, после складываются по модулю <math>2</math> с <math>S_{3}[X_{3}]</math> и, наконец, складываются с <math>S_{4}[X_{4}]</math> по модулю <math>2^{32}</math>.
# Результат этих операций — значение F(x).
# Результат этих операций — значение <math>F(x)</math>.


<math>F(X1,X2,X3,X4)=(((S1[X1]\ +\ S2[X2]) \mod 2^{32}\ \oplus\ S3[X3])\ +\ S4[X4]) \mod 2^{32}</math>
<math>F(X_{1},X_{2},X_{3},X_{4})=((((S_{1}[X_{1}]\ +\ S_{2}[X_{2}]) \mod 2^{32}) \oplus\ S_{3}[X_{3}])\ +\ S_{4}[X_{4}]) \mod 2^{32}</math>


=== Алгоритм шифрования 64-битного блока с известным массивом P и F(x) ===
=== Алгоритм шифрования 64-битного блока с известным массивом P и F(x) ===
[[Файл:BlowfishDiagram.png|right|thumbnail|216px|Сеть Фейстеля при зашифровании]]
[[Файл:BlowfishDiagram.png|right|thumbnail|216px|Сеть Фейстеля при зашифровании]]Blowfish представляет собой [[Сеть Фейстеля]], состоящую из 16 раундов. Алгоритм шифрования блока <math>X</math> размером 64 бит выглядит следующим образом{{sfn|Schneier|1996}}{{sfn|Yuen|2005}}:
* разделение на 32-битные блоки :<math>L_{0}\ ,\ R_{0}</math>
# Разделение входного блока <math>X</math> на 2 32-битных блока <math>L_{0}, R_{0}</math>
# Для <math>i = 1\ ...\ 16: </math>
* <math>L_{0}\ </math> и <math>R_{0}\ </math> «XOR»-ся c ключами <math>P_{0}\ </math>, <math>P_{1}\ </math>
#: <math>L_i\ =\ L_{i-1} \oplus P_{i}</math>
* вычисления в i-том раунде:
*: <math>R_i\ =\ L_{i-1} \oplus P_{i+1}</math>
#: <math>R_i\ =\ R_{i-1} \oplus F(L_i)</math>
*: <math>L_i\ =\ R_{i-1} \oplus F(R_i)</math>
# После 16 раунда <math>L_{16}\ ,\ R_{16}</math> меняются местами:
* после 16 раунда <math>L_{16}\ ,\ R_{16}</math> меняются местами:
#: <math>R_{16}\ \leftleftarrows\ L_{16}\ </math>
*: <math>R_{16}\ \leftleftarrows\ L_{16}\ </math>
#: <math>\ L_{16}\ \leftleftarrows\ R_{16}</math>
# К получившимся блокам прибавляются <math>P_{17}</math> и <math>P_{18}</math>
*: <math>\ L_{16}\ \leftleftarrows\ R_{16}</math>
#: <math>L_{17} = L_{16} \oplus P_{18} </math>
#: <math>R_{17} = R_{16} \oplus P_{17} </math>
# Выходной блок <math>Y</math> равен [[Конкатенация|конкатенации]] (объединению) <math>L_{17}</math> и <math>R_{17}</math>.


=== Алгоритм Blowfish ===
=== Алгоритм Blowfish ===
Разделён на 2 этапа:
Разделён на 2 этапа{{sfn|Schneier|1996}}{{sfn|Yuen|2005}}:
# Подготовительный — формирование ключей шифрования по секретному ключу.
# Подготовительный — формирование ключей шифрования по секретному ключу.
#* Инициализация массивов P и S при помощи секретного ключа K
#* Инициализация массивов P и S при помощи секретного ключа K
#*# Инициализация P1-P18 фиксированной строкой, состоящей из шестнадцатеричных цифр мантиссы [http://www.schneier.com/code/constants.txt числа пи].
#*# Инициализация <math>P_1-P_{18}</math> фиксированной строкой, состоящей из шестнадцатеричных цифр мантиссы [http://www.schneier.com/code/constants.txt числа пи] {{Wayback|url=http://www.schneier.com/code/constants.txt |date=20080903120910 }}.
#*# Производится операция XOR над P1 с первыми 32 битами ключа K, над P2 со вторыми 32-битами и так далее.<br />Если ключ K короче, то он накладывается циклически.
#*# Производится операция XOR над <math>P_1</math> с первыми 32 битами ключа <math>K</math>, над <math>P_2</math> со вторыми 32-битами и так далее.<br />Если ключ <math>K</math> короче, то он накладывается циклически.
#* Шифрование ключей и таблиц замен
#* Шифрование ключей и таблиц замен
#*# Алгоритм шифрования 64-битного блока, используя инициализированные ключи P1-P18 и таблицу замен S1-S4, шифрует 64 битную нулевую (0x0000000000000000) строку. Результат записывается в P1, P2.
#*# Алгоритм шифрования 64-битного блока, используя инициализированные ключи <math>P_1-P_{18}</math> и таблицу замен <math>S_1-S_4</math>, шифрует 64 битную нулевую (0x0000000000000000) строку. Результат записывается в <math>P_1</math>, <math>P_2</math>.
#*# P1 и P2 шифруются изменёнными значениями ключей и таблиц замен. Результат записывается в P3 и P4.
#*# <math>P_1</math> и <math>P_2</math> шифруются изменёнными значениями ключей и таблиц замен. Результат записывается в <math>P_3</math> и <math>P_4</math>.
#*# Шифрование продолжается до изменения всех ключей P1-P18 и таблиц замен S1-S4.
#*# Шифрование продолжается до изменения всех ключей <math>P_1-P_{18}</math> и таблиц замен <math>S_1-S_4</math>.
# Шифрование текста полученными ключами и F(x), с предварительным разбиением на блоки по 64 бита. Если невозможно разбить начальный текст точно на блоки по 64 бита, используются различные [[режим шифрования|режимы шифрования]] для построения сообщения, состоящего из целого числа блоков. Cуммарная требуемая память 4168 байт: P1-P18:18 переменных по 32 бита; S1-S4: 4x256 переменных по 32 бита.
# Шифрование текста полученными ключами и F(x), с предварительным разбиением на блоки по 64 бита. Если невозможно разбить начальный текст точно на блоки по 64 бита, используются различные [[режим шифрования|режимы шифрования]] для построения сообщения, состоящего из целого числа блоков. Суммарная требуемая память 4168 байт.


Дешифрование происходит аналогично, только P1-P18 применяются в обратном порядке.
Дешифрование происходит аналогично{{sfn|Schneier|1996}}{{sfn|Yuen|2005}}, только <math>P_1-P_{18}</math> применяются в обратном порядке.


=== Выбор начального значения P-массива и таблицы замен ===
=== Выбор начального значения P-массива и таблицы замен ===
Нет ничего особенного в цифрах числа пи. Данный выбор заключается в инициализации последовательности, не связанной с алгоритмом, которая могла бы быть сохранена как часть алгоритма или получена при необходимости ([[Пи (число)]]). Как указывает [[Шнайер]]: «Подойдёт любая строка из случайных битов цифр числа e, RAND-таблицы, или случайные сгенерированные цифры
Нет ничего особенного в цифрах числа пи{{sfn|Yuen|2005}}{{sfn|Schneier|1993}}. Данный выбор заключается в инициализации последовательности, не связанной с алгоритмом, которая могла бы быть сохранена как часть алгоритма или получена при необходимости ([[Пи (число)]]). Как указывает{{sfn|Schneier|1993}} [[Шнайер]]: «Подойдёт любая строка из случайных битов — цифры числа e, RAND-таблицы или биты с выхода генератора случайных чисел


== Криптостойкость ==
== Криптостойкость ==
[[S-блоки]] называются '''слабыми''', если существуют такие <math>i, j, N = {1,2,3,4} : S_N[i] = S_N[j]</math>. Ключ, генерирующий '''слабые''' [[S-блоки]], тоже называется '''слабым'''. {{iw|Воденэ, Серж|Серж Воденэ|en|Serge Vaudenay}} указал{{sfn|Vaudenay|1996}} на наличие небольшого класса слабых ключей (генерирующих слабые S-блоки). Вероятность появления слабого S-блока равна <math>2^{-15}</math>. Он также рассмотрел упрощенный вариант Blowfish, с известной функцией F(x) и слабым ключом. Для этого варианта требуется <math>3*2^{2+7*[(t-2)/2]}\approx2^{3+7*[(t-2)/2]}</math> выбранных открытых текстов (t — число раундов, а символы [] означают операцию получения целой части числа). Эта атака может быть использована только для алгоритма с <math>t \le 7</math>. Для <math>t = 7</math> требуется <math>2^{24}</math> открытых текстов, причём для варианта с известным F(x) и случайным ключом требуется <math>2^{48}</math> открытых текстов. Но данная атака неэффективна для Blowfish с 16 раундами (<math>t = 16</math>).
* слабый S-box (и порождающий его слабый ключ) означает, что существует такие i, j, N={1,2,3,4} : SN[i]==SN[j]
Криптостойкость главным образом зависит от F(x). На это указал Serge Vaudenay, говоря о наличии небольшого класса слабых ключей (генерирующих слабые S-box): вероятность появления слабого S-box равна <math>2^{-15}</math>. Он также рассмотрел упрощенный вариант Blowfish, с известной функцией F(x) и слабым ключом. Для этого варианта требуется <math>3*2^{2+7*[(t-2)/2]}\approx2^{3+7*[(t-2)/2]}</math> выбранных открытых текстов (t — число раундов, а символы [] означают операцию получения целой части числа). Эта атака может быть использована только для алгоритма с <math>t \le 7</math>. Для <math>t = 7</math> требуется <math>2^{24}</math> открытых текстов, причём для варианта с известным F(x) и случайным ключом требуется <math>2^{48}</math> открытых текстов. Но данная атака не эффективна для Blowfish с 16 раундами.


Невозможно заранее определить, является ли ключ слабым. Проводить проверку можно только после генерации ключа.
John Kelsey разработал атаку, которая позволяла взломать 3-итерационный Blowfish. Она опирается на факт, что операции сложения по модулю <math>2^{32}</math> и XOR не коммутативны.


Криптостойкость можно настраивать за счёт изменения количества раундов шифрования (увеличивая длину массива P) и количества используемых [[S-блоки|S-блоков]]. При уменьшении используемых [[S-блоки|S-блоков]] возрастает вероятность появления слабых ключей, но уменьшается используемая память. Адаптируя Blowfish для 64-битной архитектуры, можно увеличить количество и размер [[S-блоки|S-блоков]] (а следовательно и память для массивов P и S), а также усложнить F(x), причём для алгоритма с такой функцией F(x) невозможны вышеуказанные атаки.
Невозможно заранее определить является ли ключ слабым. Проводить проверку можно только после генерации ключа.


Модификация F(x): на вход подается 64-битный блок, который делится на восемь 8-битных блоков (X1-X8). Результат вычисляется по формуле
Криптостойкость можно настраивать за счёт изменения количества раундов шифрования (увеличивая длину массива P) и количества используемых S-box. При уменьшении используемых S-box возрастает вероятность появления слабых ключей, но уменьшается используемая память. Адаптируя Blowfish на 64-битной архитектуру, можно увеличить количество и размер S-box (а следовательно и память для массивов P и S), а также усложнить F(x), причём для алгоритма с такой функцией F(x) невозможны вышеуказанные атаки.
<math>F(X1,..,X8)=(\ (\ (S1[X1]\ \boxplus\ S2[X2])\ \oplus\ (S3[X3]\ \boxplus\ S4[X4])\ )\ \boxplus\ (\ (S5[X5]\ \boxplus\ S6[X6])\ \oplus(S7[X7]\ \boxplus\ S8[X8])\ )\ )</math>, где <math>\boxplus</math> — это операция сложения по модулю <math>2^{32}</math><br />


Использование Blowfish 64-битного блока (в отличие, например, от 128-битного блока AES) делает его уязвимым для [[Атака «дней рождения»|атаки дней рождения]], в частности, в контекстах типа [[HTTPS]]. В 2016 году атака SWEET32 продемонстрировала, как использовать атаку дней рождения для восстановления открытого текста (то есть расшифровки) из 64-битных блоков.<ref>{{cite web
Модификация F(x): на вход подается 64-битный блок который делится на восемь 8-битных блоков (X1-X8). Результат вычисляется по формуле
|url = https://sweet32.info/
<math>F(X1,..,X8)=(\ (\ (S1[X1]\ \boxplus\ S2[X2])\ \oplus\ (S3[X3]\ \boxplus\ S4[X4])\ )\ \boxplus\ (\ (S5[X5]\ \boxplus\ S6[X6])\ \oplus(S7[X7]\ \boxplus\ S8[X8])\ )\ )</math>, где <math>\boxplus\ \equiv mod 2^{32}</math><br />
|title = On the Practical (In-)Security of 64-bit Block Ciphers — Collision Attacks on HTTP over TLS and OpenVPN
На сегодняшний день (ноябрь 2008) не существует атак, выполняемых за разумное время. Успешные атаки возможны только из-за ошибок реализации.
|author = Karthikeyan Bhargavan
|author2 = Gaëtan Leurent
|date = 2016-08
|publisher = ACM CCS 2016
|deadurl = no
|archiveurl = https://web.archive.org/web/20161009174028/https://sweet32.info/
|archivedate = 2016-10-09
|df =
}}</ref> Проект [[GnuPG]] рекомендует не использовать Blowfish для файлов с размером, превышащим 4 ГБ<ref>{{cite web |url=https://gnupg.org/faq/gnupg-faq.html#define_fish |title=GnuPG Frequently Asked Questions |quote=Blowfish should not be used to encrypt files larger than 4Gb in size, but Twofish has no such restrictions. |access-date=2018-01-26 |archive-url=https://web.archive.org/web/20171221180749/https://gnupg.org/faq/gnupg-faq.html#define_fish |archive-date=2017-12-21 |dead-url=no}}</ref> из-за малого размера блока<ref>{{cite web |url=https://gnupg.org/faq/gnupg-faq.html#recommended_ciphers |title=GnuPG Frequently Asked Questions |quote=For a cipher with an eight-byte block size, you’ll probably repeat a block after about 32 gigabytes of data. This means if you encrypt a single message larger than 32 gigabytes, it’s pretty much a statistical guarantee you’ll have a repeated block. That’s bad. For this reason, we recommend you not use ciphers with eight-byte data blocks if you’re going to be doing bulk encryption. It’s very unlikely you’ll have any problems if you keep your messages under 4 gigabytes in size. |access-date=2018-01-27 |archive-url=https://web.archive.org/web/20171221180749/https://gnupg.org/faq/gnupg-faq.html#recommended_ciphers |archive-date=2017-12-21 |dead-url=no}}</ref>.


Известно, что вариант Blowfish с уменьшенным количеством раундов является уязвимым для [[Атака на основе открытых текстов|атак на основе открытых текстов]] на сравнительно слабых ключах. Реализации Blowfish с 16 раундами шифрования не подвержены подобным атакам.<ref>{{cite web
== Пример работы алгоритма ==
|url = http://karbalus.free.fr/sat/docsat/PaperGonzalezTom.pdf
Пример работы [http://www.schneier.com/blowfish-download.html свободно распространяемой версии алгоритма Blowfish].
|title = A Reflection Attack on Blowfish
<br />
|author = Tom Gonzalez
'''Параметры:'''
|date = 2007-01
Размер ключа: ''448 бит''
|publisher = Journal of LATEX Class Files
Размер блока: ''64 бит''
|volume = 6
Число раундов: ''16''
|issue = 1
режим: ''ECB ''
|deadurl = no
<gallery>
|archiveurl = https://web.archive.org/web/20151118102822/http://karbalus.free.fr/sat/docsat/PaperGonzalezTom.pdf
Файл:OriginalImgForBlowfish2000.png|Исходное изображение
|archivedate = 2015-11-18
Файл:EncryptImgForBlowfish2000.png|Зашифрованное изображение
|df =
</gallery>
}}
</ref><ref>
{{cite web
|url = https://www.iacr.org/archive/fse2007/45930168/45930168.pdf
|title = A New Class of Weak Keys for Blowfish
|author = Orhun Kara
|author2 = Cevat Manap
|last-author-amp = yes
|date = 2007-03
|publisher = FSE 2007
|deadurl = no
|archiveurl = https://web.archive.org/web/20161005063215/https://www.iacr.org/archive/fse2007/45930168/45930168.pdf
|archivedate = 2016-10-05
|df =
}}</ref> Тем не менее, Брюс Шнайер рекомендовал переход на последователя Blowfish - [[Twofish]].<ref name="schneier-interview-dec-2007">
{{cite web
| url = https://www.computerworld.com.au/article/46254/bruce_almighty_schneier_preaches_security_linux_faithful/?pp=3
| title = Bruce Almighty: Schneier preaches security to Linux faithful
| last = Dahna
| first = McConnachie
| date = 2007-12-27
| accessdate = 2018-01-26
| work = [[Computerworld]]
| page = 3
| archiveurl = https://web.archive.org/web/20161202063854/https://www.computerworld.com.au/article/46254/bruce_almighty_schneier_preaches_security_linux_faithful/?pp=3
| archivedate = 2016-12-02
| quote = At this point, though, I'm amazed it's still being used. If people ask, I recommend Twofish instead.
| deadurl = no
}}
</ref>


== Применения ==
== Применения ==
Blowfish зарекомендовал себя, как надёжный алгоритм, поэтому реализован во многих программах, где не требуется частая смена ключа и необходима высокая скорость шифрования/расшифрования.
Blowfish зарекомендовал себя как надёжный алгоритм, поэтому реализован во многих программах, где не требуется частая смена ключа и необходима высокая скорость шифрования/расшифровывания.{{sfn|Schneier|1993}}
* хэширование паролей
* хеширование паролей
* защита электронной почты и файлов
* защита электронной почты и файлов
** [[GnuPG]] (безопасное хранение и передача)
** [[GnuPG]] (безопасное хранение и передача){{sfn|Nguyen|2004}}
* в линиях связи: связка [[Схема Эль-Гамаля|ElGamal]] (не запатентован) или [[RSA]] (действие патента закончилось в 2000 году) и Blowfish вместо [[IDEA]]
* в линиях связи: связка [[Схема Эль-Гамаля|ElGamal]] (не запатентован) или [[RSA]] (действие патента закончилось в 2000 году) и Blowfish вместо [[IDEA]]
** в [[маршрутизатор]]е [[Intel Express 8100]] с ключом длиной 144 бита
** в [[маршрутизатор]]е [[Intel Express 8100]] с ключом длиной 144 бита
Строка 106: Строка 148:


== Сравнение с симметричными криптосистемами ==
== Сравнение с симметричными криптосистемами ==
Скорость шифрования алгоритма во многом зависит от используемой техники и системы команд. На различных архитектурах один алгоритм может значительно опережать по скорости его конкурентов, а на другом ситуация может сравняться или даже измениться прямо в противоположную сторону. Более того, программная реализация значительно зависит от используемого компилятора. Использование ассемблерного кода может повысить скорость шифрования. На скорость шифрования влияет время выполнения операций mov, add, xor, причём время выполнения операций увеличивается при обращении к оперативной памяти (для процессоров серии [[Pentium]] примерно в 5 раз). Blowfish показывает более высокие результаты при использовании кэша для хранения всех подключей. В этом случае он опережает алгоритмы [[DES]], [[IDEA]]. На отставание [[IDEA]] влияет операция сложения по модулю <math>2^{32}+1</math>. Скорость [[Twofish]] может быть близка по значению с Blowfish за счёт большего шифруемого блока.
Скорость шифрования алгоритма во многом зависит от используемой техники и системы команд. На различных архитектурах один алгоритм может значительно опережать по скорости своих конкурентов, а на другом ситуация может сравняться или даже измениться в прямо противоположную сторону. Более того, программная реализация значительно зависит от используемого компилятора. Использование ассемблерного кода может повысить скорость шифрования. На скорость шифрования влияет время выполнения операций mov, add, xor, причём время выполнения операций увеличивается при обращении к оперативной памяти (для процессоров серии [[Pentium]] примерно в 5 раз). Blowfish показывает более высокие результаты при использовании кэша для хранения всех подключей. В этом случае он опережает алгоритмы [[DES]], [[IDEA]].{{sfn|Nie, Song, Zhi|2010}} На отставание [[IDEA]] влияет операция умножения по модулю <math>2^{32}+1</math>. Скорость [[Twofish]] может быть близка по значению к Blowfish за счёт большего шифруемого блока.


Хотя Blowfish по скорости опережает его аналоги, но при увеличении частоты смены ключа основное время его работы будет уходить на подготовительный этап, что в сотни раз уменьшает его эффективность.
Хотя Blowfish по скорости опережает некоторые свои аналоги, но при увеличении частоты смены ключа основное время его работы будет уходить на подготовительный этап, что в сотни раз уменьшает его эффективность.


== См. также ==
== Примечания ==
{{примечания|3}}
* [[Блочный шифр]]

* [[Криптосистема с открытым ключом]]
== Литература ==
* {{source|Q21897970|ref=Schneier|ref-year=1993}} <!-- Description of a New Variable-Length Key, 64-Bit Block Cipher (Blowfish) // Fast Software Encryption -->
* {{source|Q21898100|ref=Schneier|ref-year=1996}} <!-- Applied Cryptography: Protocols, Algorithms, and Source Code in C -->
* {{source|Q21898105|ref=Vaudenay|ref-year=1996}} <!-- On the Weak Keys of Blowfish // Fast Software Encryption -->
* {{source|Q21683981|ref=Nguyen}} <!-- Nguyen P. Q. Can We Trust Cryptographic Software? Cryptographic Flaws in GNU Privacy Guard v1.2.3 // Advances in Cryptology — EUROCRYPT 2004 -->
* {{source|Q21684084|part=6.1. A flexible and adabtive block cipher: Blowfish|pages=390|ref=Yuen}} <!-- Yuen P. K. Practical Cryptology and Web Security — Pearson Education Canada, 2005 -->
* {{source|Q21684042|ref=Meyers, Desoky}} <!-- Meyers R. K., Desoky A. H. An Implementation of the Blowfish Cryptosystem // Signal Processing and Information Technology, 2008 -->
* {{source|Q21684051|ref=Nie, Song, Zhi}} <!-- Nie T., Song C., Zhi X. Performance Evaluation of DES and Blowfish Algorithms // Biomedical Engineering and Computer Science (ICBECS), 2010 -->


== Ссылки ==
== Ссылки ==
* [http://www.schneier.com/blowfish.html Официальный веб-сайт Blowfish] {{Wayback|url=http://www.schneier.com/blowfish.html |date=20070710192332 }}
* [http://aam.ugpl.de/?q=node/1062 Blowfish в качестве JavaScript-модуля]
* [http://www.schneier.com/blowfish-products.html Список продуктов, использующих Blowfish] {{Wayback|url=http://www.schneier.com/blowfish-products.html |date=20070714032154 }}
* [http://habrahabr.ru/post/140394/ Andrey Breeze, На пути к Skein: просто и понятно про Blowfish]
* [http://eprint.iacr.org/2005/144.pdf Dieter Schmidt. Kaweichel, an Extension of Blowfish for 64-Bit Architectures] {{Wayback|url=http://eprint.iacr.org/2005/144.pdf |date=20100627032717 }}{{ref-en}}
* [http://www.javable.com/columns/crypto/algorythms/01/ Максим Парыгин, Алгоритм Blowfish]

* [http://www.schneier.com/blowfish.html Официальный веб-сайт Blowfish]
{{^}}
* [http://www.schneier.com/blowfish-products.html Список продуктов, использующих Blowfish]
* [http://bybin.narod.ru/shneier_self/src/On_the_Weak_Keys_in_Blowfish.pdf Serge Vaudenay.On the weak Keys of Blowfish]{{ref-en}}
* [http://eprint.iacr.org/2005/144.pdf Dieter Schmidt.Kaweichel, an Extension of Blowfish for 64-Bit Architectures]{{ref-en}}
{{симметричные криптоалгоритмы}}
{{симметричные криптоалгоритмы}}


[[Категория:Сеть Фейстеля]]
[[Категория:Сеть Фейстеля]]
[[Категория:Блочные шифры]]
[[Категория:Блочные шифры]]
{{Добротная статья|Теория информации и криптография}}

Текущая версия от 06:10, 10 ноября 2023

Blowfish
Создатель Брюс Шнайер
Создан 1993 г.
Опубликован 1993 г.
Размер ключа от 32 до 448 бит
Размер блока 64 бит
Число раундов 16
Тип Сеть Фейстеля
Логотип Викисклада Медиафайлы на Викискладе

Blowfish (произносится [бло́уфиш]) — криптографический алгоритм, реализующий блочное симметричное шифрование с переменной длиной ключа. Разработан Брюсом Шнайером в 1993 году. Представляет собой сеть Фейстеля[1][2]. Выполнен на простых и быстрых операциях: XOR, подстановка, сложение[2]. Является незапатентованным и свободно распространяемым.

До появления Blowfish существовавшие алгоритмы были либо запатентованными, либо ненадёжными, а некоторые и вовсе держались в секрете (например, Skipjack). Алгоритм был разработан в 1993 году Брюсом Шнайером в качестве быстрой и свободной альтернативы устаревшему DES и запатентованному IDEA. По заявлению автора, критериями проектирования Blowfish были[1][2]:

  • скорость (шифрование на 32-битных процессорах происходит за 26 тактов);
  • простота (за счёт использования простых операций, уменьшающих вероятность ошибки реализации алгоритма);
  • компактность (возможность работать в менее, чем 5 Кбайт памяти);
  • настраиваемая безопасность (изменяемая длина ключа).

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

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

Алгоритм состоит из двух частей: расширение ключа и шифрование данных. На этапе расширения ключа исходный ключ (длиной до 448 бит) преобразуется в 18 32-битовых подключей и в 4 32-битных S-блока, содержащих 256 элементов. Общий объём полученных ключей равен бит или байт[1][2].

  • секретный ключ (от 32 до 448 бит)
  • 32-битные ключи шифрования
  • 32-битные таблицы замен :

Функция F(x)

[править | править код]
Функция F(x) в Blowfish

Функция F(x) принимает на вход блок размером в 32 бита и проделывает с ним следующие операции[2]:

  1. 32-битный блок делится на четыре 8-битных блока , каждый из которых является индексом массива таблицы замен
  2. значения и складываются по модулю , после складываются по модулю с и, наконец, складываются с по модулю .
  3. Результат этих операций — значение .

Алгоритм шифрования 64-битного блока с известным массивом P и F(x)

[править | править код]
Сеть Фейстеля при зашифровании

Blowfish представляет собой Сеть Фейстеля, состоящую из 16 раундов. Алгоритм шифрования блока размером 64 бит выглядит следующим образом[1][2]:

  1. Разделение входного блока на 2 32-битных блока
  2. Для
  3. После 16 раунда меняются местами:
  4. К получившимся блокам прибавляются и
  5. Выходной блок равен конкатенации (объединению) и .

Алгоритм Blowfish

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

Разделён на 2 этапа[1][2]:

  1. Подготовительный — формирование ключей шифрования по секретному ключу.
    • Инициализация массивов P и S при помощи секретного ключа K
      1. Инициализация фиксированной строкой, состоящей из шестнадцатеричных цифр мантиссы числа пи Архивная копия от 3 сентября 2008 на Wayback Machine.
      2. Производится операция XOR над с первыми 32 битами ключа , над со вторыми 32-битами и так далее.
        Если ключ короче, то он накладывается циклически.
    • Шифрование ключей и таблиц замен
      1. Алгоритм шифрования 64-битного блока, используя инициализированные ключи и таблицу замен , шифрует 64 битную нулевую (0x0000000000000000) строку. Результат записывается в , .
      2. и шифруются изменёнными значениями ключей и таблиц замен. Результат записывается в и .
      3. Шифрование продолжается до изменения всех ключей и таблиц замен .
  2. Шифрование текста полученными ключами и F(x), с предварительным разбиением на блоки по 64 бита. Если невозможно разбить начальный текст точно на блоки по 64 бита, используются различные режимы шифрования для построения сообщения, состоящего из целого числа блоков. Суммарная требуемая память 4168 байт.

Дешифрование происходит аналогично[1][2], только применяются в обратном порядке.

Выбор начального значения P-массива и таблицы замен

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

Нет ничего особенного в цифрах числа пи[2][3]. Данный выбор заключается в инициализации последовательности, не связанной с алгоритмом, которая могла бы быть сохранена как часть алгоритма или получена при необходимости (Пи (число)). Как указывает[3] Шнайер: «Подойдёт любая строка из случайных битов — цифры числа e, RAND-таблицы или биты с выхода генератора случайных чисел.»

Криптостойкость

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

S-блоки называются слабыми, если существуют такие . Ключ, генерирующий слабые S-блоки, тоже называется слабым. Серж Воденэ[англ.] указал[4] на наличие небольшого класса слабых ключей (генерирующих слабые S-блоки). Вероятность появления слабого S-блока равна . Он также рассмотрел упрощенный вариант Blowfish, с известной функцией F(x) и слабым ключом. Для этого варианта требуется выбранных открытых текстов (t — число раундов, а символы [] означают операцию получения целой части числа). Эта атака может быть использована только для алгоритма с . Для требуется открытых текстов, причём для варианта с известным F(x) и случайным ключом требуется открытых текстов. Но данная атака неэффективна для Blowfish с 16 раундами ().

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

Криптостойкость можно настраивать за счёт изменения количества раундов шифрования (увеличивая длину массива P) и количества используемых S-блоков. При уменьшении используемых S-блоков возрастает вероятность появления слабых ключей, но уменьшается используемая память. Адаптируя Blowfish для 64-битной архитектуры, можно увеличить количество и размер S-блоков (а следовательно и память для массивов P и S), а также усложнить F(x), причём для алгоритма с такой функцией F(x) невозможны вышеуказанные атаки.

Модификация F(x): на вход подается 64-битный блок, который делится на восемь 8-битных блоков (X1-X8). Результат вычисляется по формуле , где  — это операция сложения по модулю

Использование Blowfish 64-битного блока (в отличие, например, от 128-битного блока AES) делает его уязвимым для атаки дней рождения, в частности, в контекстах типа HTTPS. В 2016 году атака SWEET32 продемонстрировала, как использовать атаку дней рождения для восстановления открытого текста (то есть расшифровки) из 64-битных блоков.[5] Проект GnuPG рекомендует не использовать Blowfish для файлов с размером, превышащим 4 ГБ[6] из-за малого размера блока[7].

Известно, что вариант Blowfish с уменьшенным количеством раундов является уязвимым для атак на основе открытых текстов на сравнительно слабых ключах. Реализации Blowfish с 16 раундами шифрования не подвержены подобным атакам.[8][9] Тем не менее, Брюс Шнайер рекомендовал переход на последователя Blowfish - Twofish.[10]

Применения

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

Blowfish зарекомендовал себя как надёжный алгоритм, поэтому реализован во многих программах, где не требуется частая смена ключа и необходима высокая скорость шифрования/расшифровывания.[3]

  • хеширование паролей
  • защита электронной почты и файлов
    • GnuPG (безопасное хранение и передача)[11]
  • в линиях связи: связка ElGamal (не запатентован) или RSA (действие патента закончилось в 2000 году) и Blowfish вместо IDEA
  • обеспечение безопасности в протоколах сетевого и транспортного уровня
    • SSH (транспортный уровень)
    • OpenVPN (создание зашифрованных каналов)

Сравнение с симметричными криптосистемами

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

Скорость шифрования алгоритма во многом зависит от используемой техники и системы команд. На различных архитектурах один алгоритм может значительно опережать по скорости своих конкурентов, а на другом ситуация может сравняться или даже измениться в прямо противоположную сторону. Более того, программная реализация значительно зависит от используемого компилятора. Использование ассемблерного кода может повысить скорость шифрования. На скорость шифрования влияет время выполнения операций mov, add, xor, причём время выполнения операций увеличивается при обращении к оперативной памяти (для процессоров серии Pentium примерно в 5 раз). Blowfish показывает более высокие результаты при использовании кэша для хранения всех подключей. В этом случае он опережает алгоритмы DES, IDEA.[12] На отставание IDEA влияет операция умножения по модулю . Скорость Twofish может быть близка по значению к Blowfish за счёт большего шифруемого блока.

Хотя Blowfish по скорости опережает некоторые свои аналоги, но при увеличении частоты смены ключа основное время его работы будет уходить на подготовительный этап, что в сотни раз уменьшает его эффективность.

Примечания

[править | править код]
  1. 1 2 3 4 5 6 Schneier, 1996.
  2. 1 2 3 4 5 6 7 8 9 Yuen, 2005.
  3. 1 2 3 Schneier, 1993.
  4. Vaudenay, 1996.
  5. Karthikeyan Bhargavan. On the Practical (In-)Security of 64-bit Block Ciphers — Collision Attacks on HTTP over TLS and OpenVPN. ACM CCS 2016 (август 2016). Архивировано 9 октября 2016 года.
  6. GnuPG Frequently Asked Questions. — «Blowfish should not be used to encrypt files larger than 4Gb in size, but Twofish has no such restrictions.» Дата обращения: 26 января 2018. Архивировано 21 декабря 2017 года.
  7. GnuPG Frequently Asked Questions. — «For a cipher with an eight-byte block size, you’ll probably repeat a block after about 32 gigabytes of data. This means if you encrypt a single message larger than 32 gigabytes, it’s pretty much a statistical guarantee you’ll have a repeated block. That’s bad. For this reason, we recommend you not use ciphers with eight-byte data blocks if you’re going to be doing bulk encryption. It’s very unlikely you’ll have any problems if you keep your messages under 4 gigabytes in size.» Дата обращения: 27 января 2018. Архивировано 21 декабря 2017 года.
  8. Tom Gonzalez. A Reflection Attack on Blowfish. Journal of LATEX Class Files (январь 2007). Архивировано 18 ноября 2015 года.
  9. Orhun Kara. A New Class of Weak Keys for Blowfish. FSE 2007 (март 2007). Архивировано 5 октября 2016 года.
  10. Dahna, McConnachie Bruce Almighty: Schneier preaches security to Linux faithful. Computerworld 3 (27 декабря 2007). — «At this point, though, I'm amazed it's still being used. If people ask, I recommend Twofish instead.» Дата обращения: 26 января 2018. Архивировано 2 декабря 2016 года.
  11. Nguyen, 2004.
  12. Nie, Song, Zhi, 2010.

Литература

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