Русская Википедия:SQUARE
Шаблон:Карточка блочного шифра SQUARE — в криптографии симметричный блочный криптоалгоритм, разработанный в 1997 году Винсентом Рэйменом, Йоаном Дайменом и Ларсом Кнудсеном.
Считается предшественником алгоритма AES. Структура алгоритма была подобрана авторами для возможности получения эффективной реализации на широком спектре процессоров, а также для криптостойкости к дифференциальному и линейному криптоанализу.
Описание алгоритма
Алгоритм SQUARE использует ключ длиной 128 бит, данные шифруются 128-битными блоками, однако модульный подход к построению шифра позволяет легко расширить до больших размеров длину ключа и длину блока данных. Один раунд SQUARE состоит из четырёх отдельных преобразований. Данные представляются байтовым квадратом размера 4x4. Основные составляющие этого шифра — это пять различных обратимых преобразований, которые воздействуют на массив байтов размера <math>4 \times 4</math>.Шаблон:Sfn
Преобразования в раунде шифрования
Линейное преобразование <math>\theta</math>
Линейное преобразование <math>\theta</math> воздействует на каждую строку в квадрате данных. Оно представляется формулой <math>{b_{i,j} = c_ja_{i,0} \oplus c_{j-1}a_{i,1} \oplus c_{j-2}a_{i,2} \oplus c_{j-3}a_{i,3} }</math>, где:
- <math>{a_{i,j}}</math> — значение байта, находящегося в <math>i</math>-й строке и <math>j</math>-м столбце в квадрате данных;
- <math>{b_{i,j}}</math> — новое значение байта в квадрате;
- <math>{c_n}</math> — набор констант;
- умножения выполняются в поле Галуа <math>{GF(2^8)}</math>;
Важно, что поле <math>{GF(2^8)}</math> имеет характеристику 2, то есть операция сложения соответствует побитовому <math>\mathrm{xor}</math>. Каждая <math>i</math>-ая строка в квадрате может быть представлена в виде полинома <math>a_i(x) = a_{i,0} \oplus a_{i,1}x \oplus a_{i,2}x^2 \oplus a_{i,3}x^3 </math>. Тогда, определяя коэффициенты <math>{c_n}</math> как полином <math>{c(x) = \oplus _j c_jx^j}</math>, преобразование <math>\theta</math> можно представить в виде произведения полиномов: <math>b_i(x) = c(x)a_i(x) \mod 1 \oplus x^4</math>, здесь <math>b_i(x)</math> — новое значение строки квадрата, представленное в виде полинома, и <math> c(x) = 2\oplus 1\cdot x\oplus 1\cdot x^2\oplus 3\cdot x^3 </math> . Обратному преобразованию <math>\theta^{-1}</math> соответствует полином <math>d(x)</math>, определённый по формуле <math>c(x)d(x)= 1 \pmod 1 \oplus x^4</math>.Шаблон:Sfn
Нелинейное преобразование <math>\gamma</math>
Данное преобразование является табличной заменой <math>\gamma</math>. Таблица, по которой осуществляется замена:
B1 | CE | C3 | 95 | 5A | AD | E7 | 02 | 4D | 44 | FB | 91 | 0C | 87 | A1 | 50 |
CB | 67 | 54 | DD | 46 | 8F | E1 | 4E | F0 | FD | FC | EB | F9 | C4 | 1A | 6E |
5E | F5 | CC | 8D | 1C | 56 | 43 | FE | 07 | 61 | F8 | 75 | 59 | FF | 03 | 22 |
8A | D1 | 13 | EE | 88 | 00 | 0E | 34 | 15 | 80 | 94 | E3 | ED | B5 | 53 | 23 |
4B | 47 | 17 | A7 | 90 | 35 | AB | D8 | B8 | DF | 4F | 57 | 9A | 92 | DB | 1B |
3C | C8 | 99 | 04 | 8E | E0 | D7 | 7D | 85 | BB | 40 | 2C | 3A | 45 | F1 | 42 |
65 | 20 | 41 | 18 | 72 | 25 | 93 | 70 | 36 | 05 | F2 | 0B | A3 | 79 | EC | 08 |
27 | 31 | 32 | B6 | 7C | B0 | 0A | 73 | 5B | 7B | B7 | 81 | D2 | 0D | 6A | 26 |
9E | 58 | 9C | 83 | 74 | B3 | AC | 30 | 7A | 69 | 77 | 0F | AE | 21 | DE | D0 |
2E | 97 | 10 | A4 | 98 | A8 | D4 | 68 | 2D | 62 | 29 | 6D | 16 | 49 | 76 | C7 |
E8 | C1 | 96 | 37 | E5 | CA | F4 | E9 | 63 | 12 | C2 | A6 | 14 | BC | D3 | 28 |
AF | 2F | E6 | 24 | 52 | C6 | A0 | 09 | BD | 8C | CF | 5D | 11 | 5F | 01 | C5 |
9F | 3D | A2 | 9B | C9 | 3B | BE | 51 | 19 | 1F | 3F | 5C | B2 | EF | 4A | CD |
BF | BA | 6F | 64 | D9 | F3 | 3E | B4 | AA | DC | D5 | 06 | C0 | 7E | F6 | 66 |
6C | 84 | 71 | 38 | B9 | 1D | 7F | 9D | 48 | 8B | 2A | DA | A5 | 33 | 82 | 39 |
D6 | 78 | 86 | FA | E4 | 2B | A9 | 1E | 89 | 60 | 6B | EA | 55 | 4C | F7 | E2 |
то есть 0 заменится на B1, 1 — на CE, и так далее.Шаблон:Sfn
Байтовая перестановка <math>\pi</math>
Байтовая перестановка осуществляет транспонирование байтового квадрата, то есть <math>{a_{i,j}=a_{j,i}}</math>.
Сложение с ключом раунда <math>\sigma[K_i]</math>
Эта операция — побитовое сложение 128 бит данных с ключом раунда, <math>{b=a\oplus K_i}</math>, где:
- <math>{a}</math> и <math>{b}</math> — значение 128 бит данных перед преобразованием и после;
- <math>{K_i}</math> — ключ раунда <math>{i}</math>.Шаблон:Sfn
Процедура получения ключей
Для шифрования необходимо получить 8 128-битных ключей раундов, а также ключ для предварительного раунда из ключа шифрования алгоритма.
Процедура получения ключа описывается преобразованием <math>\psi: K_{i+1} = \psi(K_{i})</math>, выполняющимся над ключом, представленным, как и блок данных, байтовым квадратом 4x4. Преобразование <math>\psi</math> описывается следующими операциями:
- <math>{k_{0,i+1} = k_{0,i}\oplus rotl(k_{3,i})\oplus C_i}</math>;
- <math>{k_{1,i+1} = k_{1,i}\oplus k_{0,i+1}}</math>;
- <math>{k_{2,i+1} = k_{2,i}\oplus k_{1,i+1}}</math>;
- <math>{k_{3,i+1} = k_{3,i}\oplus k_{2,i+1}}</math>;
где:
- <math>{k_{n,i}}</math> — <math>n</math>-я строка байтового квадрата ключа <math>i</math>-го раунда;
- <math>C_i</math> — константа для <math>i</math>-го раунда, вычисляемая по формуле <math>{C_{i+1} = 2\cdot C_{i}}</math>, <math>C_0 = 1</math>;
- <math>{rotl()}</math> — операция циклического сдвига байтовой строки на один байт влево: <math>rotl[a_{i,0},a_{i,1},a_{i,2},a_{i,3}] = [a_{i,1},a_{i,2},a_{i,3},a_{i,0}]</math>;
Исходный ключ алгоритма шифрования используется как ключ для предварительного раунда.Шаблон:Sfn
Шифрование
Обозначим один раунд шифрования как <math>\rho[k^t] = \sigma[k^t] \circ \pi \circ \gamma \circ \theta</math>. Также, восьми раундам преобразования предшествует сложение с ключом <math>\sigma[K_0]</math> и <math>\theta^{-1}</math>:<math> \mathrm{Square}[k] = \rho[k^8] \circ \rho[k^7] \circ \rho[k^6] \circ \rho[k^5] \circ \rho[k^4] \circ \rho[k^3] \circ \rho[k^2] \circ \rho[k^1] \circ \sigma[k^0] \circ \theta^{-1} </math>.Шаблон:Sfn
Расшифрование
Алгоритм расшифрования аналогичен алгоритму шифрования, но вместо преобразований <math>\gamma</math> и <math>\theta</math> используются обратные преобразования <math>\gamma^{-1}</math> и <math>\theta^{-1}</math>, при этом <math>\gamma^{-1}</math> — это обратная табличная замена, а <math>\theta^{-1}</math> — это умножение строки на полином <math>d(x)</math> такой, что <math>d(x)c(x) = 1\pmod {1 \oplus x^4}</math>, также в предварительном раунде используется преобразование <math>\theta</math> вместо <math>\theta^{-1}</math>. Из формулы для шифрования видно, что
- <math> \mathrm{Square^{-1}}[k] = \theta \circ \sigma^{-1}[k^0] \circ \rho^{-1}[k^1] \circ \rho^{-1}[k^2] \circ \rho^{-1}[k^3] \circ \rho^{-1}[k^4] \circ \rho^{-1}[k^5] \circ \rho^{-1}[k^6] \circ \rho^{-1}[k^7] \circ \rho^{-1}[k^8] </math>,
где <math> \rho^{-1}[k^t] = \theta^{-1} \circ \gamma^{-1} \circ \pi^{-1} \circ \sigma^{-1}[k^t] = \theta^{-1} \circ \gamma^{-1} \circ \pi \circ \sigma[k^t] </math>. Так как <math> \gamma^{-1} \circ \pi = \pi \circ \gamma^{-1} </math>, и, более того, так как <math> \theta^{-1}(a) \oplus k^t = \theta^{-1}(a + \theta(k^t)) </math>, получаем <math> \sigma[k^t] \circ \theta^{-1} = \theta^{-1}\circ\sigma[\theta(k^t)] </math>. Теперь один раунд для расшифрования можно определить как <math> \rho'[k^t] = \sigma[k^t]\circ\pi\circ\gamma^{-1}\circ\theta^{-1} </math>, и полная формула для расшифрования записывается как :
- <math> \mathrm{Square}^{-1} = \rho'[k^8] \circ \rho'[k^7] \circ \rho'[k^6] \circ \rho'[k^5] \circ \rho'[k^4] \circ \rho'[k^3] \circ \rho'[k^2] \circ \rho'[k^1] \circ \sigma[k^0] \circ \theta </math>.Шаблон:Sfn
Безопасность
Исследование криптостойкости создателями алгоритма
Алгоритм обладает высокой стойкостью против линейного и дифференциального криптоанализа, благодаря преобразованиям <math>\theta</math> и <math>\gamma</math>, которые понижают максимальную вероятность появления дифференциальных следов и максимальную корреляцию линейных следов за 4 раунда преобразований. Первый криптоанализ SQUARE был проведён его авторами с использованием интегрального криптоанализа, который позже стал известен как Square-атака.Шаблон:Sfn
Описание Square-атаки
Прежде всего, введем несколько определений:
Определение 1: Пусть <math>\Lambda</math>-множество — набор из 256 16-байтовых состояний, каждое из которых отличается от других в некоторых байтах, которые назовём активными, и совпадают в некоторых байтах, которые будем называть пассивными. Далее, <math>\lambda</math> — это набор индексов активных байтов.Шаблон:Sfn Имеем:
- <math>\forall x, y \in \Lambda : \begin{cases}
x_{i,j}\ne y_{i,j}, for (i,j)\in \lambda \\ x_{i,j} = y_{i,j}, for (i,j)\notin \lambda
\end{cases}</math>.
Определение 2: Если применение операции исключающего «или» ко всем байтам на одной позиции в <math>\Lambda</math>-множестве даёт 0, то эта позиция называется уравновешенной по <math>\Lambda</math>-множеству.Шаблон:Sfn
Применение преобразований <math>\gamma</math> и <math>\sigma[k^t]</math> к <math>\Lambda</math>-множеству даёт <math>\Lambda</math>-множество с тем же <math>\lambda</math>. Применение преобразования <math>\pi</math> даёт <math>\Lambda</math>-множество, в котором активные байты транспонированы (относительно активных байтов в исходном <math>\Lambda</math>-множестве). Также, применение <math>\theta</math> к <math>\Lambda</math>-множеству необязательно вернёт <math>\Lambda</math>-множество, однако, так как каждый выходной байт <math>\theta</math> является линейной комбинацией четырёх входных байт в той же строке, то, подавая строку с всего одним активным байтом, на выходе получим строку состоящую только из активных байт. Шаблон:Sfn Рассмотрим <math>\Lambda</math>-множество, в котором только один байт является активным и проследим, как изменяется позиция активного байта в течение трех раундов (здесь предварительный раунд объединён с первым: <math> \rho[k^1] \circ \sigma[k^0] \circ \theta^{-1}</math>, который в итоге записывается как <math>\sigma[k^1]\circ\pi\circ\gamma\circ\theta\circ\sigma[k^0]\circ\theta^{-1} = \sigma[k^1]\circ\pi\circ\gamma\circ\sigma[\theta(k^0)]</math>). Так как первый раунд не содержит <math>\theta</math>, то к началу второго раунда остается один активный байт. Во втором раунде <math> \theta </math> преобразует в строку активных байтов, которые <math>\pi</math> преобразует в столбец активных байт. <math>\theta</math> в третьем раунде переводит результат в <math>\Lambda</math>-множество, состоящее только из активных байт. Значения байт на выходе третьего раунда пробегают все возможные значения, следовательно, уравновешены по множеству <math> \Lambda </math>, имеем
- <math> \underset{b=\theta(a), a\in\Lambda}{\bigoplus} b_{i,j} = \underset{a\in\Lambda}{\bigoplus} \underset{k}{\bigoplus} c_{j-k}a_{i,k} = \underset{l}{\bigoplus}c_l \underset{a\in\Lambda}{\bigoplus} a_{i,l+j} = \underset{l}{\bigoplus}c_l 0 = 0,</math>
значит байты на выходе <math>\theta</math> в четвёртом раунде уравновешены по <math>\Lambda</math>-множеству. Эта уравновещенность нарушается последующим применением <math>\gamma</math>. Выходные байты четвёртого раунда могут быть выражены с помощью функции от промежуточного состояния <math>b</math>: <math> a_{i,j} = S_\gamma[b_{j, i}]\oplus k^4 _{i,j} </math>. Предполагая значение <math> k^4 _{i,j}</math>, значение <math> b_{j,i} </math> для всех элементов <math>\Lambda</math>-множества могут быть вычислены из шифротекстов. Если значение этого байта оказалось неуравновешенным по <math>\Lambda</math>, то предположенное значение ключа <math> k^4 _{i,j}</math> является ложным. Этот метод криптоанализа позволил взломать 6-раундовый вариант шифра с использованием <math>2^{32}</math> блоков открытого текста и соответствующих им блоков шифротекста и выполнением <math>2^{72}</math> операций шифрования.Шаблон:Sfn
В 2010 году была представлена атака на связанных ключах методом бумеранга. Ранее подобная атака применялась к шифрам KASUMI, COCONUT98, IDEA и AES-192/256. Это была первая атака на полнораундовый SQUARE.Шаблон:Sfn В 2011 году был проведён криптоанализ полнораундового варианта SQUARE с помощью полного двудольного графа. Данный тип атаки позволил взломать шифр с использованием одного ключа, <math>2^{48}</math> открытых текстов и проведения <math>2^{126}</math> операций шифрования.Шаблон:Sfn
Особенности шифра
Шифр SQUARE создавался, соответствуя стратегии широкого следа — каждый раунд шифра состоит из нескольких преобразований, нелинейной перестановки и композиции линейных преобразований — что дало шифру высокую криптостойкость против линейного и дифференциального криптоанализа. Составляющие блоки алгоритма и их взаимодействие подбирались также исходя из возможности быстрой реализации на широком спектре процессоров.[1] Реализация алгорима на языке Си имела скорость шифрования 2.63 Мбайт/с, запускаемая на процессоре Pentium с частотой 100 МГц, а реализация на языке Ассемблер увеличивала скорость шифрования вдвое. Данный алгоритм получил развитие и стал основой нового американского стандарта — шифра Rijndael, который был разработан группой авторов SQUARE. Кстати, на конкурсе AES, эксперты отметили, что «в основе алгоритма Rijndael лежит нетрадиционная парадигма, поэтому он может содержать скрытые уязвимости»Шаблон:Sfn. Именно по этой причине сам SQUARE сейчас используется редко, уступая в популярности своему потомку — Rijndael. Также потомком шифра является южнокорейский алгоритм CRYPTON, участник конкурса AES.
См. также
Примечания
Литература
Ссылки
- The Block Cipher Square Algorithm, Joan Daemen, Lars R. Knudsen and and Vincent Rijmen, Dr. Dobb’s Journal, October 01, 1997.
Шаблон:Симметричные криптоалгоритмы