Interested Article - Blowfish

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

История

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

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

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

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

Параметры

  • секретный ключ K {\displaystyle K} (от 32 до 448 бит)
  • 32-битные ключи шифрования P 1 P 18 {\displaystyle P_{1}-P_{18}}
  • 32-битные таблицы замен S 1 S 4 {\displaystyle S_{1}-S_{4}} :
    S 1 [ 0 ] , S 1 [ 1 ] , . . . , S 1 [ 255 ] {\displaystyle S_{1}[0],\ S_{1}[1],\ ...,\ S_{1}[255]}
    S 2 [ 0 ] , S 2 [ 1 ] , . . . , S 2 [ 255 ] {\displaystyle S_{2}[0],\ S_{2}[1],\ ...,\ S_{2}[255]}
    S 3 [ 0 ] , S 3 [ 1 ] , . . . , S 3 [ 255 ] {\displaystyle S_{3}[0],\ S_{3}[1],\ ...,\ S_{3}[255]}
    S 4 [ 0 ] , S 4 [ 1 ] , . . . , S 4 [ 255 ] {\displaystyle S_{4}[0],\ S_{4}[1],\ ...,\ S_{4}[255]}

Функция F(x)

Функция F(x) в Blowfish

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

  1. 32-битный блок делится на четыре 8-битных блока ( X 1 , X 2 , X 3 , X 4 ) {\displaystyle (X_{1},X_{2},X_{3},X_{4})} , каждый из которых является индексом массива таблицы замен S 1 S 4 {\displaystyle S_{1}-S_{4}}
  2. значения S 1 [ X 1 ] {\displaystyle S_{1}[X_{1}]} и S 2 [ X 2 ] {\displaystyle S_{2}[X_{2}]} складываются по модулю 2 32 {\displaystyle 2^{32}} , после складываются по модулю 2 {\displaystyle 2} с S 3 [ X 3 ] {\displaystyle S_{3}[X_{3}]} и, наконец, складываются с S 4 [ X 4 ] {\displaystyle S_{4}[X_{4}]} по модулю 2 32 {\displaystyle 2^{32}} .
  3. Результат этих операций — значение F ( x ) {\displaystyle F(x)} .
    F (  X  1   ,  X  2   ,  X  3   ,  X  4   ) = ( ( ( (  S  1   [  X  1   ]   +    S  2   [  X  2   ] )  mod    2  32   )     S  3   [  X  3   ] )   +    S  4   [  X  4   ] )  mod    2  32     {\displaystyle 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}}   

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

Сеть Фейстеля при зашифровании

Blowfish представляет собой Сеть Фейстеля , состоящую из 16 раундов. Алгоритм шифрования блока X {\displaystyle X} размером 64 бит выглядит следующим образом :

  1. Разделение входного блока X {\displaystyle X} на 2 32-битных блока L 0 , R 0 {\displaystyle L_{0},R_{0}}
  2. Для i = 1 . . . 16 : {\displaystyle i=1\ ...\ 16:}
    L i = L i 1 P i {\displaystyle L_{i}\ =\ L_{i-1}\oplus P_{i}}
    R i = R i 1 F ( L i ) {\displaystyle R_{i}\ =\ R_{i-1}\oplus F(L_{i})}
  3. После 16 раунда L 16 , R 16 {\displaystyle L_{16}\ ,\ R_{16}} меняются местами:
    R 16 L 16 {\displaystyle R_{16}\ \leftleftarrows \ L_{16}\ }
    L 16 R 16 {\displaystyle \ L_{16}\ \leftleftarrows \ R_{16}}
  4. К получившимся блокам прибавляются P 17 {\displaystyle P_{17}} и P 18 {\displaystyle P_{18}}
    L 17 = L 16 P 18 {\displaystyle L_{17}=L_{16}\oplus P_{18}}
    R 17 = R 16 P 17 {\displaystyle R_{17}=R_{16}\oplus P_{17}}
  5. Выходной блок Y {\displaystyle Y} равен конкатенации (объединению) L 17 {\displaystyle L_{17}} и R 17 {\displaystyle R_{17}} .

Алгоритм Blowfish

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

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

Дешифрование происходит аналогично , только P 1 P 18 {\displaystyle P_{1}-P_{18}} применяются в обратном порядке.

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

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

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

S-блоки называются слабыми , если существуют такие i , j , N = 1 , 2 , 3 , 4 : S N [ i ] = S N [ j ] {\displaystyle i,j,N={1,2,3,4}:S_{N}[i]=S_{N}[j]} . Ключ, генерирующий слабые S-блоки , тоже называется слабым . указал на наличие небольшого класса слабых ключей (генерирующих слабые S-блоки). Вероятность появления слабого S-блока равна 2 15 {\displaystyle 2^{-15}} . Он также рассмотрел упрощенный вариант Blowfish, с известной функцией F(x) и слабым ключом. Для этого варианта требуется 3 2 2 + 7 [ ( t 2 ) / 2 ] 2 3 + 7 [ ( t 2 ) / 2 ] {\displaystyle 3*2^{2+7*[(t-2)/2]}\approx 2^{3+7*[(t-2)/2]}} выбранных открытых текстов (t — число раундов, а символы [] означают операцию получения целой части числа). Эта атака может быть использована только для алгоритма с t 7 {\displaystyle t\leq 7} . Для t = 7 {\displaystyle t=7} требуется 2 24 {\displaystyle 2^{24}} открытых текстов, причём для варианта с известным F(x) и случайным ключом требуется 2 48 {\displaystyle 2^{48}} открытых текстов. Но данная атака неэффективна для Blowfish с 16 раундами ( t = 16 {\displaystyle t=16} ).

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

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

Модификация F(x): на вход подается 64-битный блок, который делится на восемь 8-битных блоков (X1-X8). Результат вычисляется по формуле F ( X 1 , . . , X 8 ) = ( ( ( S 1 [ X 1 ] S 2 [ X 2 ] ) ( S 3 [ X 3 ] S 4 [ X 4 ] ) ) ( ( S 5 [ X 5 ] S 6 [ X 6 ] ) ( S 7 [ X 7 ] S 8 [ X 8 ] ) ) ) {\displaystyle 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])\)\)} , где {\displaystyle \boxplus } — это операция сложения по модулю 2 32 {\displaystyle 2^{32}}

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

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

Применения

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

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

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

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

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

Примечания

  1. ↑ .
  2. ↑ .
  3. ↑ .
  4. .
  5. Karthikeyan Bhargavan. (неопр.) . ACM CCS 2016 (август 2016). 9 октября 2016 года.
  6. (неопр.) . — «Blowfish should not be used to encrypt files larger than 4Gb in size, but Twofish has no such restrictions.» Дата обращения: 26 января 2018. 21 декабря 2017 года.
  7. (неопр.) . — «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. (неопр.) . Journal of LATEX Class Files (январь 2007). 18 ноября 2015 года.
  9. Orhun Kara. (неопр.) . FSE 2007 (март 2007). 5 октября 2016 года.
  10. Dahna, McConnachie (неопр.) . 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. .
  12. .

Литература

Ссылки

Same as Blowfish