Blowfish (шифр)

редактировать
Blowfish
General
ДизайнерыБрюс Шнайер
Впервые опубликовано1993
ПреемникиTwofish
Детали шифра
Размеры ключей 32–448 бит
Размеры блоков 64 биты
СтруктураСеть Фейстеля
Раунды16
Лучший публичный криптоанализ
Четыре раунда Blowfish восприимчивы к дифференциальной атаке второго порядка (Rijmen, 1997) ; для класса слабых ключей, 14 раундов Blowfish можно отличить от псевдослучайной перестановки (Vaudenay, 1996).

Blowfish является симметричным ключ блочный шифр, разработанный в 1993 г. Брюсом Шнайером и включенный во многие комплекты шифров и продукты для шифрования. Blowfish обеспечивает хорошую скорость шифрования в программном обеспечении, и на сегодняшний день не было обнаружено эффективного криптоанализа. Однако Advanced Encryption Standard (AES) теперь привлекает больше внимания, и Шнайер рекомендует Twofish для современных приложений.

Шнайер разработал Blowfish как алгоритм общего назначения, предназначена как альтернатива устаревшему DES и свободна от проблем и ограничений, связанных с другими алгоритмами. На момент выпуска Blowfish многие другие разработки были собственностью, защищены патентами или являлись коммерческой или государственной тайной. Шнайер заявил, что «Blowfish не запатентован и останется таковым во всех странах. Таким образом, алгоритм помещен в общественное достояние и может быть свободно использован кем угодно».

Примечательно Особенности конструкции включают зависящие от ключа S-блоки и очень сложное ключевое расписание.

Содержание
  • 1 Алгоритм
  • 2 Blowfish в псевдокоде
  • 3 Blowfish на практике
  • 4 Слабые стороны и преемники
  • 5 См. Также
  • 6 Ссылки
  • 7 Внешние ссылки
Алгоритм

Blowfish имеет 64-битный размер блока и переменная длина ключа от 32 бит до 448 бит. Это 16-этапный шифр Фейстеля, в котором используются большие зависимые от ключа S-блоки. По структуре он напоминает CAST-128, в котором используются фиксированные S-блоки.

Структура Фейстеля в Blowfish

На соседней диаграмме показана процедура шифрования Blowfish. Каждая строка представляет 32 бита. Существует пять массивов подключей: один P-массив из 18 элементов (обозначен на схеме как K, чтобы избежать путаницы с открытым текстом) и четыре S-блока из 256 элементов (S0, S1, S2 и S3).

Каждый раунд r состоит из 4 действий:

Действие 1XOR левой половины (L) данных с r-й записью P-массива
Действие 2Используйте Данные, объединенные XOR в качестве входных данных для F-функции Blowfish
Действие 3XOR выходных данных F-функции с правой половиной (R) данных
Действие 4Поменять местами L и R

F -функция разбивает 32-битный ввод на четыре восьмибитных четверти и использует четверти как ввод для S-блоков. S-блоки принимают 8-битный ввод и производят 32-битный вывод. Выходы складываются по модулю 2 и подвергаются операции XOR для получения окончательного 32-битного вывода (см. Изображение в правом верхнем углу).

После 16-го раунда отмените последний обмен и выполните XOR L с K18 и R с K17 (выходное отбеливание).

Расшифровка точно такая же, как и шифрование, за исключением того, что P1, P2,..., P18 используются в обратном порядке. Это не так очевидно, потому что xor коммутативен и ассоциативен. Распространенным заблуждением является использование обратного порядка шифрования в качестве алгоритма дешифрования (то есть сначала XORing P17 и P18 для блока зашифрованного текста, а затем использование P-записей в обратном порядке).

Расписание клавиш Blowfish начинается с инициализации P-массива и S-блоков значениями, полученными из шестнадцатеричных цифр pi, которые содержат нет очевидного рисунка (см. ничего в моем рукаве номер ). Затем секретный ключ побайтово, циклически повторяя ключ, если необходимо, подвергается операции XOR со всеми P-записями по порядку. Затем 64-битный нулевой блок шифруется алгоритмом в его нынешнем виде. Полученный зашифрованный текст заменяет P 1 и P 2. Затем тот же зашифрованный текст снова зашифровывается с новыми подключами, и новый зашифрованный текст заменяет P 3 и P 4. Это продолжается, заменяя весь P-массив и все записи S-блока. В целом алгоритм шифрования Blowfish будет запускаться 521 раз для генерации всех подключей - обрабатывается около 4 КБ данных.

Поскольку длина P-массива составляет 576 бит, а байты ключа подвергаются операции XOR через все эти 576 бит во время инициализации, многие реализации поддерживают размеры ключей до 576 бит. Причина этого - несоответствие между исходным описанием Blowfish, в котором используются 448-битные ключи, и его эталонной реализацией, в которой используются 576-битные ключи. Тестовые векторы для проверки сторонних реализаций также были созданы с 576-битными ключами. На вопрос, какая версия Blowfish является правильной, Брюс Шнайер ответил: «Тестовые векторы должны использоваться для определения единственной истинной Blowfish».

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

Blowfish в псевдокоде
uint32_t P [18]; uint32_t S [4] [256]; uint32_t f (uint32_t x) {uint32_t h = S [0] [x>>24] + S [1] [x>>16 0xff]; return (h ^ S [2] [x>>8 0xff]) + S [3] [x 0xff]; } void encrypt (uint32_t L, uint32_t R) {для (int i = 0; i <16 ; i += 2) { L ^= P[i]; R ^= f(L); R ^= P[i+1]; L ^= f(R); } L ^= P[16]; R ^= P[17]; swap (L, R); } void decrypt (uint32_t L, uint32_t R) { for (int i=16 ; i>0; i - = 2) {L ^ = P [i + 1]; R ^ = f (L); R ^ = P [i]; L ^ = f (R); } L ^ = P [1]; R ^ = P [0]; своп (L, R); } //... // инициализируем P-массив и S-блоки значениями, полученными из pi; опущено в примере //... {for (int i = 0; i <18 ; ++i) P[i] ^= key[i % keylen]; uint32_t L = 0, R = 0; for (int i=0 ; i<18 ; i+=2) { encrypt (L, R); P[i] = L; P[i+1] = R; } for (int i=0 ; i<4 ; ++i) for (int j=0 ; j<256; j+=2) { encrypt (L, R); S[i][j] = L; S[i][j+1] = R; } }
Blowfish на практике

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

В одном приложении медленная смена клавиш Blowfish на самом деле является преимуществом: метод хеширования пароля (crypt $ 2, т.е. bcrypt), используемый в OpenBSD, использует алгоритм, производный от Blowfish, который делает использование расписания медленных ключей; идея состоит в том, что требуемые дополнительные вычислительные усилия обеспечивают защиту от атак по словарю. См. растяжение ключа.

Blowfish занимает объем памяти чуть более 4 килобайт из RAM. Это ограничение не является проблемой даже для старых настольных и портативных компьютеров, хотя оно не позволяет использовать в самых маленьких встроенных системах такие как ранние смарт-карты.

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

bcrypt - это функция хеширования паролей, которая в сочетании с переменным числом итераций («стоимость» работы) использует дорогостоящую фазу настройки ключей Blowfish для увеличения рабочей нагрузки и продолжительности хеширования. расчеты, что еще больше снижает угрозы от атак грубой силы.

bcrypt - это также название кроссплатформенной утилиты для шифрования файлов, разработанной в 2002 году и реализующей Blowfish.

Слабые стороны и преемники

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

Известно, что вариант Blowfish с уменьшенным числом раундов подвержен Атака с известным открытым текстом на слабые ключи. Реализации Blowfish используют 16 раундов шифрования и не подвержены этой атаке. Тем не менее Брюс Шнайер рекомендовал перейти на своего преемника Blowfish, Twofish.

См. Также
Ссылки
Внешние ссылки
Викискладе есть медиафайлы, связанные с Blowfish (шифр).
Последняя правка сделана 2021-05-12 11:07:38
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте