Русская Википедия:Q (шифр)

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:Стиль Q — блочный шифр с прямой структурой SP-сети c S-блоками. Q-шифр основывается на шифрах Rijndael и Serpent. Шифр был представлен Лесли МакБрайд (Шаблон:Lang-en) на конкурс, проводившийся проектом NESSIE. Алгоритм использует 128-битный блок данных в виде байтового массива <math>4\times4</math>, над которым и проводятся операции[1].

Теоретически алгоритм не имеет ограничения на размер используемых ключей шифрования. В рамках же конкурса NESSIE рассматривалось только три фиксированных размера: 128, 192 и 256 битов[2].

Алгоритм подвержен как дифференциальному, так и линейному криптоанализу[3].

Общие сведения

Q использует три различных s-блока. Первый <math>8\times8</math> s-блок, называющийся S, и два блока <math>4\times4</math> A и B (A взят из алгоритма Serpent, B — «Serpent-подобный»). Каждая стадия подстановки использует многократные копии s-блоков параллельно для обработки 128-битного входа (16 копий S и 32 копии A и B).[1]

В шифре используются три линейные трансформации. Перестановка <math>P</math> работает на 128-битном блоке, представленном в виде четырёх 32-битных слов <math>W_0, W_1, W_2, W_3</math> следующим образом: <math>W_0</math> не изменяется; <math>W_1, W_2, W_3</math> поворачиваются на один байт, два байта и три байта соответственно. Другие две линейные трансформации назовём <math>PreSerpent()</math> и <math>PostSerpent()</math>, так как они применяются до и после блоков A и B. <math>PreSerpent()</math> отправляет биты <math>W_0</math> в первые биты 32-битных идентичных копий s-блока <math>4\times4</math>, биты <math>W_1</math> — во вторые биты s-блоков и т. д. <math>PostSerpent()</math> — просто инверсия <math>PreSerpent().</math>[1]

Алгоритм

Q-шифр может иметь различные размеры ключей. Рассмотрим шифр с 128-битным ключом и с 8 полными раундами. Для усиленной защиты применяются 9 раундов. Алгоритм «key-scheduling algorithm» или «KSA» генерирует 12 128-битных подключа <math>KW_1, KA, KB, K_0, K_1, . . . , K_7, KW_2.</math> Каждый раунд <math>r </math> (<math>0 \leq r \leq 7</math>) состоит из:

  1. <math>\oplus KA</math> — первое наложение ключа <math>KA</math>. Выполняется побитовое исключающее «или» (XOR), применяющееся к каждому биту обрабатываемого блока и соответствующему биту расширенного ключа.
  2. Подстановка S (<math>Substitution(S)</math>) — взята из алгоритма Rijndael.
  3. <math>\oplus KB</math> — второе наложение ключа <math>KB</math>.
  4. <math>PreSerpent(), A, PostSerpent()</math> — операция унаследована от алгоритма Serpent.
  5. <math>\oplus K_r</math> — третье наложение ключа <math>K_r.</math> Подключ <math>K_r</math> уникален для каждого раунда.
  6. Перестановка <math>P</math>.
  7. <math>PreSerpent(), B, PostSerpent()</math>.

Полный алгоритм состоит из <math>\oplus KW_1, Round_0, ..., Round_7, \oplus KA, Substitution(S), \oplus KB, \oplus KW_2</math>.

Расшифровывание происходит аналогично шифрованию с небольшими изменениями[2]:

  1. Меняются местами операции 5 и 6 в каждом раунде.
  2. Для 2, 4 и 6 — используются инверсные операции.
  3. Ключи <math>K_r</math> используются в обратной последовательности.

Криптоанализ

В работе[1] показано, что шифр не устойчив к линейному криптоанализу, с вероятностью 98,4 % 128-битный ключ будет восстановлен из <math>2^{97}</math> известных пар открытого текста — шифротекста.

Примечания

Шаблон:Примечания

Ссылки

Шаблон:Изолированная статья