CRYPTON

Создатель |  Че Хун Лим (Future Systems, Inc.)
Создан |  1998 г.
Опубликован |  1998 \- 1999
Размер ключа |  128, 192, 256 бит
Размер блока |  128 бит
Число раундов |  12
Тип |  Подстановочно-перестановочная сеть

CRYPTON — алгоритм симметричного блочного шифрования (размер блока 128 бит, ключ длиной до 256 бит), разработанный южнокорейским криптологом Че Хун Лим (англ. Chae Hoon Lim) из южнокорейской компании Future Systems, с конца 1980-х годов работающая на рынке сетевого обеспечения и защиты информации. Алгоритм был разработан в 1998 году в качестве шифра — участника конкурса AES. Как признавался автор, конструкция алгоритма опирается на алгоритм SQUARE.

В алгоритме Crypton нет традиционных для блочных шифров сети Фейстеля. Основу данного шифра составляет так называемая SP-сеть (повторяющаяся циклическая функция из замен-перестановок, ориентированная на распараллеленную нелинейную обработку[1] всего блока данных). Кроме высокой скорости, преимуществами таких алгоритмов является облегчение исследования стойкости шифра к методам дифференциального и линейного криптоанализа, являющимся на сегодня основными инструментами вскрытия блочных шифров.

На конкурс AES была изначально представлена версия алгоритма Crypton v0.5. Однако, как говорил Че Хун Лим, ему не хватало времени для разработки полной версии. И уже в первом этапе конкурса AES в ходе анализа алгоритмов, версия Crypton v0.5 была заменена на версию Crypton v1.0. Отличие новой версии от первоначальной заключались в изменении таблиц замен, в модификации процесса расширения ключа.

## Содержание

* 1 Структура алгоритма. Основные характеристики
* 1.1 Шифрование
* 1.1.1 Табличная замена '"`UNIQ--postMath-00000005-QINU`"'
* 1.1.2 Линейное преобразование '"`UNIQ--postMath-0000001A-QINU`"'
* 1.1.3 Байтовая перестановка '"`UNIQ--postMath-00000032-QINU`"'
* 1.1.4 Операция '"`UNIQ--postMath-00000034-QINU`"'
* 1.2 Расшифрование
* 2 Процедура расширения ключа
* 2.1 Формирование расширенных ключей
* 2.2 Вычисление ключей раундов
* 3 Безопасность
* 3.1 Недостатки алгоритма Crypton
* 3.2 Достоинства алгоритма Crypton
* 3.3 Интегральная атака на шифр Crypton (4-х раундовый)
* 3.3.1 Краткое описание шифра
* 3.3.2 Алгоритм реализации интегральной атаки
* 4 Конкурс AES
* 5 Версии алгоритма Crypton
* 6 Примечания
* 7 Литература
* 8 Ссылки

## Структура алгоритма. Основные характеристики

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

Как и другие участники конкурса AES, Crypton предназначен для шифрования 128-битовых блоков данных. При шифровании используются ключи шифрования нескольких фиксированных размеров — от 0 до 256 бит с кратностью 8 битов.

Структура алгоритма Crypton — структура «Квадрата» — во многом похожа на структуру алгоритма Square, созданного в 1997 году. Криптографические преобразования для алгоритмов с данной структурой могут быть выполнены как над целыми строками и столбцами массива, так и над отдельными его байтами. (Стоит отметить, что алгоритм Square был разработан авторами будущего победителя конкурса AES — авторами алгоритма Rijndael — Винсентом Рэйменом и Йоаном Дайменом.)

### Шифрование

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

Алгоритм Crypton представляет 128-битовый блок шифруемых данных в виде байтового массива 4×4, над которыми в процессе шифрования производится несколько раундов преобразований. В каждом раунде предполагается последовательное выполнение следующих операций:

* Табличная замена γ {\displaystyle \gamma } ;
* Линейное преобразование π {\displaystyle \pi } ;
* Байтовая перестановка τ {\displaystyle \tau } ;
* Операция σ {\displaystyle \sigma } .

#### Табличная замена  γ {\displaystyle \gamma }

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

Табличная замена  γ {\displaystyle \gamma }

Алгоритм Crypton использует 4 таблицы замен. Каждая из которых замещает 8-битовое входное значение на выходное такого же размера.

Вычисление производных таблиц замен (<<n - есть циклический сдвиг влево значения обрабатываемого байта на n битов)

Все таблицы  S 0 . . . S 3 {\displaystyle S_{0}...S_{3}} являются производными от основной таблицы  S {\displaystyle S} (см. рисунок - вычисление производных таблиц замен).

Ниже представлен пример таблиц:

Таблица  S 0 {\displaystyle S_{0}} :  63 | ec | 59 | aa | db | 8e | 66 | c0 | 37 | 3c | 14 | ff | 13 | 44 | a9 | 91

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

3b | 78 | 8d | ef | c2 | 2a | f0 | d7 | 61 | 9e | a5 | bc | 48 | 15 | 12 | 47
ed | 42 | 1a | 33 | 38 | c8 | 17 | 90 | a6 | d5 | 5d | 65 | 6a | fe | 8f | a1
93 | c2 | 2f | 0c | 68 | 58 | df | f4 | 45 | 11 | a0 | a7 | 22 | 96 | fb | 7d
1d | b4 | 84 | e0 | bf | 57 | e9 | 0a | 4e | 83 | cc | 7a | 71 | 39 | c7 | 32
74 | 3d | de | 50 | 85 | 06 | 6f | 53 | e8 | ad | 82 | 19 | e1 | ba | 36 | cb
0e | 28 | f3 | 9b | 4a | 62 | 94 | 1f | bd | f6 | 67 | 41 | d8 | d1 | 2d | a4
86 | b7 | 01 | c5 | b0 | 75 | 02 | f9 | 2c | 29 | 6e | d2 | f5 | 8b | fc | 5a
e4 | 7f | dd | 07 | 55 | b1 | 2b | 89 | 72 | 18 | 3a | 4c | b6 | e3 | 80 | ce
49 | cf | 6b | b9 | f2 | 0d | dc | 64 | 95 | 46 | f7 | 10 | 9a | 20 | a2 | 3f
d6 | 87 | 70 | 3e | 21 | fd | 4d | 7b | 3c | ae | 09 | 8a | 04 | b3 | 54 | f8
30 | 00 | 56 | d4 | e7 | 25 | bb | ac | 98 | 73 | ea | c9 | 9d | 4f | 7e | 03
ab | 92 | a8 | 43 | 0f | fa | 24 | 5c | 1e | 60 | 31 | 97 | cd | c6 | 79 | f5
5e | e5 | 34 | 76 | 1c | 81 | b2 | af | 0b | 5d | d9 | e2 | 27 | 6d | d0 | 88
c1 | 51 | e6 | 9c | 77 | be | 99 | 23 | da | eb | 52 | 2e | b5 | 08 | 05 | 6c
b8 | 1b | a3 | 69 | 8c | d3 | 40 | 26 | f1 | c4 | 9f | 35 | ee | 7c | 4b | 16
Таблица  S 1 {\displaystyle S_{1}} 8d | b3 | 65 | aa | 6f | 3a | 99 | 03 | dc | f0 | 50 | ff | 4c | 11 | a6 | 46

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

ec | e1 | 36 | bf | 0b | a8 | c3 | 5f | 85 | 7a | 96 | f2 | 21 | 54 | 48 | 1d
b7 | 09 | 68 | cc | e0 | 23 | 5c | 42 | 9a | 57 | 75 | 95 | a9 | fb | 3e | 86
4e | 2b | bc | 30 | a1 | 61 | 7f | d3 | 15 | 44 | 82 | 9e | 88 | 5a | Ef | f5
74 | d2 | 12 | 83 | fe | 5d | a7 | 28 | 39 | 0e | 33 | e9 | c5 | e4 | 1f | c8
d1 | f4 | 7b | 41 | 16 | 18 | bd | 4d | a3 | b6 | 0a | 64 | 87 | ea | d8 | 2f
38 | a0 | cf | 6e | 29 | 89 | 52 | 7c | f6 | db | 9d | 05 | 63 | 47 | b4 | 92
1a | de | 04 | 17 | c2 | d5 | 08 | e7 | b0 | a4 | b9 | 4b | 7d | 2e | f3 | 69
93 | fd | 77 | 1c | 55 | c6 | ac | 26 | c9 | 60 | e8 | 31 | da | 8f | 02 | 3b
25 | 3f | ad | e6 | cb | 34 | 73 | 91 | 56 | 19 | df | 40 | 6a | 80 | 8a | fc
5b | 1e | c1 | f8 | 84 | f7 | 35 | ed | 0f | ba | 24 | 2a | 10 | ce | 51 | e3
c0 | 00 | 59 | 53 | 9f | 94 | ee | b2 | 62 | cd | ab | 27 | 76 | 3d | f9 | 0c
ae | 4a | a2 | 0d | 3c | eb | 90 | 71 | 78 | 81 | c4 | 5e | 37 | 1b | e5 | d7
79 | 97 | d0 | d9 | 70 | 06 | ca | be | 2c | 6d | 67 | 8b | 9c | b5 | 43 | 22
07 | 45 | 9b | 72 | dd | fa | 66 | 8c | 6b | af | 49 | b8 | d6 | 20 | 14 | b1
e2 | 6c | 8e | a5 | 32 | 4f | 01 | 98 | c7 | 13 | 7e | d4 | bb | f1 | 2d | 58
Таблица  S 2 {\displaystyle S_{2}} b1 | 72 | 76 | bf | ac | ee | 55 | 83 | ed | aa | 47 | d8 | 33 | 95 | 60 | c4

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

9b | 39 | 1e | 0c | 0a | 1d | ff | 26 | 89 | 5b | 22 | f1 | d4 | 40 | c8 | 67
9d | a4 | 3c | e7 | c6 | b5 | f7 | dc | 61 | 79 | 15 | 86 | 78 | 6e | eb | 32
b0 | ca | 4f | 23 | d2 | fb | 5e | 08 | 24 | 4d | 8a | 10 | 09 | 51 | a3 | 9f
f6 | 6b | 21 | c3 | 0d | 38 | 99 | 1f | 1c | 90 | 64 | fe | 8b | a6 | 48 | bd
53 | e1 | ea | 57 | ae | 84 | b2 | 45 | 35 | 02 | 7f | d9 | c7 | 2a | d0 | 7c
c9 | 18 | 65 | 00 | 97 | 2b | 06 | 6a | 34 | f3 | 2c | 92 | ef | dd | 7a | 56
a2 | c4 | 88 | b9 | 50 | 75 | d3 | e4 | 11 | ce | 4b | a7 | fd | 3f | be | 81
8e | d5 | 5a | 49 | 42 | 54 | 70 | a1 | df | 87 | ab | 7d | f4 | 12 | 05 | 2e
27 | 0f | c1 | 30 | 66 | 98 | 3d | cb | b8 | e6 | 9c | 63 | e3 | bc | 19 | fa
3a | 2f | 9e | f2 | 6f | 1a | 28 | 3b | c2 | 0e | 03 | c0 | b7 | 59 | a9 | d7
74 | 85 | d6 | ad | 41 | ec | 8c | 71 | f0 | 93 | 5d | b6 | 1b | 68 | e5 | 44
07 | e0 | 14 | 8a | f9 | 73 | cd | 4e | 25 | bb | 31 | 5f | 4a | cc | 8f | 91
de | 6d | 7b | f5 | b3 | 29 | a0 | 17 | 6c | da | e8 | 04 | 96 | 82 | 52 | 36
43 | 5c | db | 8d | 80 | d1 | e2 | b4 | 58 | 46 | ba | e9 | 01 | 20 | fc | 13
16 | f8 | 94 | 62 | 37 | cf | 69 | 9a | af | 77 | c5 | 3e | 7e | a5 | 2d | 0b
Таблица  S 3 {\displaystyle S_{3}} :  b1 | f6 | 8e | 07 | 72 | 6b | d5 | e0 | 76 | 21 | 5a | 14 | bf | c3 | 49 | a8

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

ac | 0d | 42 | f9 | ee | 38 | 54 | 73 | 55 | 99 | 70 | cd | 83 | 1f | a1 | 4e
ed | 1c | df | 25 | aa | 90 | 87 | bb | 47 | 64 | ab | 31 | d8 | fe | 7d | 5f
33 | 8b | f4 | 4a | 95 | a6 | 12 | cc | 60 | 48 | 05 | 8f | c4 | bd | 2e | 91
9b | 53 | 27 | de | 39 | e1 | 0f | 6d | 1e | ea | c1 | 7b | 0c | 57 | 30 | f5
0a | ae | 66 | b3 | 1d | 84 | 98 | 29 | ff | b2 | 3d | a0 | 26 | 45 | cb | 17
89 | 35 | b8 | 6c | 5b | 02 | e6 | da | 22 | 7f | 9c | e8 | f1 | d9 | 63 | 04
d4 | c7 | e3 | 96 | 40 | 2a | bc | 82 | c8 | d0 | 19 | 52 | 67 | 7c | fa | 36
9d | c9 | 3a | 43 | a4 | 18 | 2f | 5c | 3c | 65 | 9e | db | e7 | 00 | f2 | 8d
c6 | 97 | 6f | 80 | b5 | 2b | 1a | d1 | f7 | 06 | 28 | e2 | dc | 6a | 3b | b4
61 | 34 | c2 | 58 | 79 | f3 | 0e | 46 | 15 | 2c | 03 | ba | 86 | 92 | c0 | e9
78 | ef | b7 | 01 | 6e | dd | 59 | 20 | eb | 7a | a9 | fc | 32 | 56 | d7 | 13
b0 | a2 | 74 | 16 | ca | 4c | 85 | f8 | 4f | 88 | d6 | 94 | 23 | b9 | ad | 62
d2 | 50 | 41 | 37 | fb | 75 | ec | cf | 5e | d3 | 8c | 69 | 08 | e4 | 71 | 9a
24 | 11 | f0 | af | 4d | ce | 93 | 77 | 8a | 4b | 5d | c5 | 10 | a7 | b6 | 3e
09 | fd | 1b | 7e | 51 | 3f | 68 | a5 | a3 | be | e5 | 2d | 9f | 81 | 44 | 0b

В четных раундах используется операция  γ e {\displaystyle \gamma _{e}} , в нечетных -  γ o {\displaystyle \gamma _{o}} . Эти операции и таблицы замен обладают рядом свойств, которые важны, особенно для унификации операций шифрования и расшифрования. Свойства таблиц и операций:

γ e ( γ o ( A ) ) = γ o ( γ e ( A ) ) = A ; {\displaystyle \gamma _{e}(\gamma _{o}(A))=\gamma _{o}(\gamma _{e}(A))=A;}
S − 1 = S ; {\displaystyle S^{-1}=S;}
S 2 = S 0 − 1 ; {\displaystyle S_{2}=S_{0}^{-1};}
S 3 = S 1 − 1 ; {\displaystyle S_{3}=S_{1}^{-1};}

где  A {\displaystyle A} — текущее значение блока шифруемых данных. Операции  γ e {\displaystyle \gamma _{e}} и  γ o {\displaystyle \gamma _{o}} можно определить следующим образом:

γ e : b i j = S ( j + 2 + i m o d 4 ) ( a i j ) ; {\displaystyle \gamma _{e}:b_{ij}=S_{(j+2+imod4)}(a_{ij});}
γ o : b i j = S ( j + i m o d 4 ) ( a i j ) . {\displaystyle \gamma _{o}:b_{ij}=S_{(j+imod4)}(a_{ij}).}

где:

* a i j {\displaystyle a_{ij}} — текущее значение конкретного байта данных;
* b i j {\displaystyle b_{ij}} — значение байта данных после выполнения операции;

#### Линейное преобразование  π {\displaystyle \pi }

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

Линейное преобразование

Здесь используется 4 специальных константы, шестнадцатеричные значения которых указаны ниже:

m 0 = F C ; {\displaystyle m_{0}=FC;}

m 1 = F 3 ; {\displaystyle m_{1}=F3;}

m 2 = C F ; {\displaystyle m_{2}=CF;}

m 3 = 3 F ; {\displaystyle m_{3}=3F;}

Эти константы объединены в маскирующие последовательности, перечисленные ниже:

M 0 = m 3 ∙ m 2 ∙ m 1 ∙ m 0 ; {\displaystyle M_{0}=m_{3}\bullet m_{2}\bullet m_{1}\bullet m_{0};}

M 1 = m 0 ∙ m 3 ∙ m 2 ∙ m 1 ; {\displaystyle M_{1}=m_{0}\bullet m_{3}\bullet m_{2}\bullet m_{1};}

M 2 = m 1 ∙ m 0 ∙ m 3 ∙ m 2 ; {\displaystyle M_{2}=m_{1}\bullet m_{0}\bullet m_{3}\bullet m_{2};}

M 3 = m 2 ∙ m 1 ∙ m 0 ∙ m 3 ; {\displaystyle M_{3}=m_{2}\bullet m_{1}\bullet m_{0}\bullet m_{3};}

где  ∙ {\displaystyle \bullet } — операция конкатенации.

Сама же операция  π {\displaystyle \pi } — представляет собой битовую перестановку. В нечетных раундах используется операция  π o {\displaystyle \pi _{o}} :

B [ 0 ] = ( A [ 3 ] & M 3 ) ⊕ ( A [ 2 ] & M 2 ) ⊕ ( A [ 1 ] & M 1 ) ⊕ ( A [ 0 ] & M 0 ) ; {\displaystyle B[0]=(A[3]\&M_{3})\oplus (A[2]\&M_{2})\oplus (A[1]\&M_{1})\oplus (A[0]\&M_{0});}

B [ 1 ] = ( A [ 3 ] & M 0 ) ⊕ ( A [ 2 ] & M 3 ) ⊕ ( A [ 1 ] & M 2 ) ⊕ ( A [ 0 ] & M 1 ) ; {\displaystyle B[1]=(A[3]\&M_{0})\oplus (A[2]\&M_{3})\oplus (A[1]\&M_{2})\oplus (A[0]\&M_{1});}

B [ 2 ] = ( A [ 3 ] & M 1 ) ⊕ ( A [ 2 ] & M 0 ) ⊕ ( A [ 1 ] & M 3 ) ⊕ ( A [ 0 ] & M 2 ) ; {\displaystyle B[2]=(A[3]\&M_{1})\oplus (A[2]\&M_{0})\oplus (A[1]\&M_{3})\oplus (A[0]\&M_{2});}

B [ 3 ] = ( A [ 3 ] & M 2 ) ⊕ ( A [ 2 ] & M 1 ) ⊕ ( A [ 1 ] & M 0 ) ⊕ ( A [ 0 ] & M 3 ) ; {\displaystyle B[3]=(A[3]\&M_{2})\oplus (A[2]\&M_{1})\oplus (A[1]\&M_{0})\oplus (A[0]\&M_{3});}

где:

* & {\displaystyle \&} — логическая побитовая операция «и»;
* A [ i ] {\displaystyle A[i]} и  B [ i ] {\displaystyle B[i]} — значение i-ой строки обрабатываемых данных до и после выполнения операции соответственно.

В четных раундах используется операция  π e {\displaystyle \pi _{e}} :

B [ 0 ] = ( A [ 3 ] & M 1 ) ⊕ ( A [ 2 ] & M 0 ) ⊕ ( A [ 1 ] & M 3 ) ⊕ ( A [ 0 ] & M 2 ) ; {\displaystyle B[0]=(A[3]\&M_{1})\oplus (A[2]\&M_{0})\oplus (A[1]\&M_{3})\oplus (A[0]\&M_{2});}

B [ 1 ] = ( A [ 3 ] & M 2 ) ⊕ ( A [ 2 ] & M 1 ) ⊕ ( A [ 1 ] & M 0 ) ⊕ ( A [ 0 ] & M 3 ) ; {\displaystyle B[1]=(A[3]\&M_{2})\oplus (A[2]\&M_{1})\oplus (A[1]\&M_{0})\oplus (A[0]\&M_{3});}

B [ 2 ] = ( A [ 3 ] & M 3 ) ⊕ ( A [ 2 ] & M 2 ) ⊕ ( A [ 1 ] & M 1 ) ⊕ ( A [ 0 ] & M 0 ) ; {\displaystyle B[2]=(A[3]\&M_{3})\oplus (A[2]\&M_{2})\oplus (A[1]\&M_{1})\oplus (A[0]\&M_{0});}

B [ 3 ] = ( A [ 3 ] & M 0 ) ⊕ ( A [ 2 ] & M 3 ) ⊕ ( A [ 1 ] & M 2 ) ⊕ ( A [ 0 ] & M 1 ) ; {\displaystyle B[3]=(A[3]\&M_{0})\oplus (A[2]\&M_{3})\oplus (A[1]\&M_{2})\oplus (A[0]\&M_{1});}

Фактически эта операция обеспечивает наличие в каждом результирующем байте каждого столбца двух битов каждого исходного байта того же столбца.

#### Байтовая перестановка  τ {\displaystyle \tau }

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

Байтовая перестановка

Данная перестановка преобразует простейшим образом строку данных в столбец:

τ : b i j = a j i {\displaystyle \tau :b_{ij}=a_{ji}}

#### Операция  σ {\displaystyle \sigma }

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

Побитовое сложение всего массива данных с ключом раунда

Данная операция является побитовым сложением всего массива данных с ключом раунда:

σ : B = A ⊕ K r {\displaystyle \sigma :B=A\oplus K_{r}}

где:  B {\displaystyle B} — новое значение блока шифруемых данных;  K r {\displaystyle K_{r}} — ключ текущего раунда  r {\displaystyle r} .

Заметим, именно 12 раундов шифрования рекомендуется автором алгоритма Че Хун Лимой, однако строгое количество раундов не установлено. Кроме 12 раундов шифрования, перед первым раундом алгоритма выполняется предварительная операция  σ {\displaystyle \sigma } , а по завершении 12 раундов выполняется выходное преобразование  ϕ e {\displaystyle \phi _{e}} , состоящее из последовательно выполняемых операций  τ {\displaystyle \tau } ,  π e {\displaystyle \pi _{e}} и  τ {\displaystyle \tau } .

### Расшифрование

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

Расшифрование выполняется применением обратных операций в обратной последовательности. Все операции, кроме  γ e {\displaystyle \gamma _{e}} и  γ o {\displaystyle \gamma _{o}} являются обратными самим себе, а сами  γ e {\displaystyle \gamma _{e}} и  γ o {\displaystyle \gamma _{o}} связаны следующими соотношениями:

γ e − 1 = γ o ; {\displaystyle \gamma _{e}^{-1}=\gamma _{o};}

γ o − 1 = γ e , {\displaystyle \gamma _{o}^{-1}=\gamma _{e},}

поэтому при расшифровывании  γ o {\displaystyle \gamma _{o}} — используется в четных раундах, а  γ e {\displaystyle \gamma _{e}} — в нечетных.

Стоит отметить ещё одну особенность: каждый этап может быть выполняется параллельно, что важно при реализации на современных многоядерных и многопоточных системах. Алгоритм имеет структуру SP-сети, как и Rijndael (который является победителем конкурса AES) Также особенностью шифра является то, что для зашифрования и расшифрования может использоваться одна и та же процедура, но с разными подключами. Алгоритм эффективен как при программной, так и при аппаратной реализации. Шифр достаточно быстр — на конкурсе AES при использовании компилятора Borland C показал наилучшие результаты среди всех участников.

## Процедура расширения ключа

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

Алгоритм Crypton требует наличие 128 — битового ключа для каждого раунда, а также 128 битового ключа для предварительной операции σ. Расширение ключа происходит в два этапа:

1. на первом этапе происходит формирование восьми расширенных ключей;
2. на втором этапе происходит вычисление ключей раундов из расширенных ключей.

### Формирование расширенных ключей

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

Формирование расширенных ключей происходит так:

* Если ключ шифрования имеет размер, меньший 256 бит, он дополняется битовыми нулями, пока не достигнет 32-байтового исходного ключа  K {\displaystyle K} :

K = k 31 ∙ . . . ∙ k 1 ∙ k 0 {\displaystyle K=k_{31}\bullet ...\bullet k_{1}\bullet k_{0}}

* Ключ K разбирается на последовательности  U {\displaystyle U} и  V {\displaystyle V} , первая из которых содержит только четные байты ключа, вторая — только нечетные:

U = U 3 ∙ U 2 ∙ U 1 ∙ U 0 ; {\displaystyle U=U_{3}\bullet U_{2}\bullet U_{1}\bullet U_{0};}
V = V 3 ∙ V 2 ∙ V 1 ∙ V 0 ; {\displaystyle V=V_{3}\bullet V_{2}\bullet V_{1}\bullet V_{0};}
U = k 8 i + 6 ∙ k 8 i + 4 ∙ k 8 i + 2 ∙ k 8 i ; {\displaystyle U=k_{8i+6}\bullet k_{8i+4}\bullet k_{8i+2}\bullet k_{8i};}
V = k 8 i + 7 ∙ k 8 i + 5 ∙ k 8 i + 3 ∙ k 8 i + 1 ; {\displaystyle V=k_{8i+7}\bullet k_{8i+5}\bullet k_{8i+3}\bullet k_{8i+1};}

* Над последовательностями  U {\displaystyle U} и  V {\displaystyle V} выполняется один раунд шифрования алгоритма Crypton с использованием ключа раунда, состоящего из нулевых битов. Соответственно для  U {\displaystyle U} выполняются преобразования нечетного раунда, для  V {\displaystyle V} происходит преобразование четного раунда. Результирующие последовательности обозначаются как  U ′ {\displaystyle U'} и  V ′ {\displaystyle V'} .
* Происходит вычисление 8 расширенных ключей:

K e i = U i ′ ⊕ T 1 ; {\displaystyle Ke_{i}=U'_{i}\oplus T_{1};}
K e i + 4 = V i ′ ⊕ T 0 ; {\displaystyle Ke_{i+4}=V'_{i}\oplus T_{0};}

для  i = 0 , 1 , 2 , 3 , {\displaystyle i=0,1,2,3,} где  T 1 {\displaystyle T_{1}} и  T 0 {\displaystyle T_{0}} — последовательности, которые определяются следующими формулами:

T 0 = U 0 ′ ⊕ U 1 ′ ⊕ U 2 ′ ⊕ U 3 ′ ; {\displaystyle T_{0}=U'_{0}\oplus U'_{1}\oplus U'_{2}\oplus U'_{3};}
T 1 = V 0 ′ ⊕ V 1 ′ ⊕ V 2 ′ ⊕ V 3 ′ . {\displaystyle T_{1}=V'_{0}\oplus V'_{1}\oplus V'_{2}\oplus V'_{3}.}

### Вычисление ключей раундов

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

Для вычисления из расширенных ключей — ключей раундов, используются следующие константы:

C 0 = A 54 F F 53 A ; {\displaystyle C_{0}=A54FF53A;}
C i = C i − 1 + 3 C 6 E F 372 m o d 2 32 ; {\displaystyle C_{i}=C_{i-1}+3C6EF372mod2^{32};}
M c 0 = A C A C A C A C ; {\displaystyle Mc_{0}=ACACACAC;}

Заметим, что псевдослучайные константы A54FF53A и 3C6EF372 получаются из дробных частей от чисел  7 {\displaystyle {\sqrt {7}}} и  5 {\displaystyle {\sqrt {5}}} соответственно.

Сначала вычисляются ключи для предварительной операции σ и первого раунда:

K 0 [ i ] = K e i ⊕ C 0 ⊕ M c i ; {\displaystyle K_{0}[i]=Ke_{i}\oplus C_{0}\oplus Mc_{i};}
K 1 [ i ] = K e i + 4 ⊕ C 1 ⊕ M c i ; {\displaystyle K_{1}[i]=Ke_{i+4}\oplus C_{1}\oplus Mc_{i};}

где  K r [ i ] {\displaystyle K_{r}[i]} — i-ая строка ключа раунда  r {\displaystyle r} . Как и для шифруемых данных, ключ предоставляется в виде таблицы..

Представление ключа в виде таблице аналогично шифруемым данным

Константы  M c i [ i ] {\displaystyle Mc_{i}[i]} вычисляются путём побитового циклического сдвига каждого байта константы  M c i − 1 {\displaystyle Mc_{i-1}} на 1 бит влево.

Для второго и каждого последующего четного раунда ключ вычисляется следующим образом:

* Выполняется модификация первых четырёх расширенных ключей:

{ K e 3 , K e 2 , K e 1 , K e 0 } <- { K e 0 <<< 6 , K e 3 <<< 6 , K e 2 << 16 , K e 1 << 24 } ; {\displaystyle \\{Ke_{3},Ke_{2},Ke_{1},Ke_{0}\\}\leftarrow \\{Ke_{0}<<<6,Ke_{3}<<<6,Ke_{2}<<16,Ke_{1}<<24\\};}

где знаком <<< обозначена операция побитового циклического сдвига каждого байта (раздельно) расширенного ключа на указанное число битов влево, а << — побитового циклического сдвига всего ключа на указанное число битов влево.

* Вычисление ключа раунда с помощью модифицированных расширенных ключей:

K r [ i ] = K e i ⊕ C r ⊕ M c i ; {\displaystyle K_{r}[i]=Ke_{i}\oplus C_{r}\oplus Mc_{i};}

Аналогично происходит вычисление ключей для нечетных раундов:

{ K e 7 , K e 6 , K e 5 , K e 4 } <- { K e 6 << 16 , K e 5 << 8 , K e 4 <<< 2 , K e 7 <<< 2 } ; {\displaystyle \\{Ke_{7},Ke_{6},Ke_{5},Ke_{4}\\}\leftarrow \\{Ke_{6}<<16,Ke_{5}<<8,Ke_{4}<<<2,Ke_{7}<<<2\\};}
K r [ i ] = K e i + 4 ⊕ C r ⊕ M c i ; {\displaystyle K_{r}[i]=Ke_{i+4}\oplus C_{r}\oplus Mc_{i};}

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

## Безопасность

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

### Недостатки алгоритма Crypton

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

При анализе исходной версии алгоритма, Crypton v0.5, сразу двое экспертов независимо обнаружили класс слабых ключей: таковых оказалось 2 в степени 32 256-битовых ключей. Также, была обнаружена атака на шестираундовую версию алгоритма Crypton, похожая на атаку на алгоритм Square. Это было одной из причин появления новой версии алгоритма — Crypton v1.0.

### Достоинства алгоритма Crypton

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

Однако по мнению экспертов института NIST, вышеперечисленные недостатки не являются грубыми. Кроме того, плюсов у алгоритма было вполне достаточно:

1. алгоритм эффективен на программном и аппаратном уровне благодаря высокой степени параллельности и использованию очень простых логических операций ANDS/XORS;
2. алгоритм не подвержен атакам по времени выполнения и потребляемой мощности;
3. хорошая стойкость к существующим атакам;
4. возможность распараллеливания операций в процессе шифрования;
5. быстрое расширение ключа, быстрое формирование ключей: шифрование со списоком ключей идет намного быстрее чем шифрование с одним блоком, так что это очень эффективно в приложениях, требующих частые замены ключей (например, в хеш-режиме).
6. достаточно высока скорость на всех целевых платформах;
7. небольшие требования к оперативной памяти и возможность расширения ключа «на лету» позволяют использовать алгоритм Crypton в смарткартах с минимальными ресурсами;
8. алгоритм поддерживает дополнительные размеры ключей, помимо тех, что были установлены конкурсом (128, 192, 256 битов).

Разработчиком была заявлена гарантированная устойчивость к линейному и дифференциальному криптоанализу и, в целом, всем существующим на момент разработки атакам. Переработанное ключевое расписание и новые таблицы S-Box исключили все обнаруженные недостатки и уязвимости.

### Интегральная атака на шифр Crypton (4-х раундовый)

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

Анализ безопасности блочно-симметричного шифра (БСШ) Crypton показывает, что 12-раундовый самозаменяемый шифр (с одинаковыми процессами для кодирования и расшифровывания) с длиной блока 128 битов и длиной ключа до 128 битов обладает хорошей стойкостью к существующим атакам. Интегральная атака на 4-х раундовый БСШ Crypton намного эффективнее, чем полный перебор по всему ключевому пространству.

#### Краткое описание шифра

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

Crypton представляет собой блочный шифр. Длина ключа и длина блока 128 бит. Четыре преобразования работают с промежуточным результатом, называемым Состоянием (State). Состояние можно представить в виде прямоугольного массива из 16 байт:

( A i , j ) {\displaystyle (A_{i,j})} где  A ∈ { 0 , . . . , 3 } {\displaystyle A\in \\{0,...,3\\}}

Обозначим столбец из 4 байт как  A j = ( A 0 j , A 1 j , A 2 j , A 3 j ) {\displaystyle A_{j}=(A_{0j},A_{1j},A_{2j},A_{3j})}

Так же представим ключ шифрования:

( K i , j ) {\displaystyle (K_{i,j})} где  K ∈ { 0 , . . . , 3 } {\displaystyle K\in \\{0,...,3\\}} и  K j = ( K 0 j , K 1 j , K 2 j , K 3 j ) {\displaystyle K_{j}=(K_{0j},K_{1j},K_{2j},K_{3j})} .

В шифре определено поле Галуа  G F ( 2 8 ) {\displaystyle GF(2^{8})} , элементами которого являются байты. Байты рассматриваются как многочлены над  Z 2 {\displaystyle Z_{2}}

b ↔ b 7 x 7 + b 6 x 6 + b 5 x 5 + b 4 x 4 + b 3 x 3 + b 2 x 2 + b 1 x 1 + b 0 {\displaystyle b\leftrightarrow b_{7}x^{7}+b_{6}x^{6}+b_{5}x^{5}+b_{4}x^{4}+b_{3}x^{3}+b_{2}x^{2}+b_{1}x^{1}+b_{0}}

Операция сложения  ⊕ {\displaystyle \oplus } — при сложении байт соответствующие им многочлены складываются над  Z 2 {\displaystyle Z_{2}} .

Операция умножения — при умножении соответствующие им многочлены перемножаются над  Z 2 {\displaystyle Z_{2}} и результирующий многочлен берется по модулю от простого многочлена

m ( x ) = x 8 + x 4 + x 3 + x 1 + 1 {\displaystyle m(x)=x^{8}+x^{4}+x^{3}+x^{1}+1}

В процессе работы алгоритма, ключ  ( K i , j ) {\displaystyle (K_{i,j})} расширяется (Key Schedule, Key Expansion). Первые 4 столбца (по 4 байта) являются исходным ключом  K 0 {\displaystyle K^{0}} . Каждый последующий  r {\displaystyle r} -й набор из 4 столбцов вычисляется из предыдущего набора и используется для  r {\displaystyle r} -го раунда, обозначим его  K r = ( K i , j r ) {\displaystyle K^{r}=(K_{i,j}^{r})} . Раунд состоит из четырёх различных элементарных преобразований, которые преобразуют состояние  A = ( A i , j ) {\displaystyle A=(A_{i,j})} в состояние  B = ( B i , j ) {\displaystyle B=(B_{i,j})} :

* Замена байт — BS (Byte Substitution): применение перестановки  S {\displaystyle S} или  B i , j = S ( A i , j ) {\displaystyle B_{i,j}=S(A_{i,j})}
* Сдвиг строк — SR (Shift Rows): циклический сдвиг байт по правилу:  B i , j = A i , ( j + 1 ) m o d 4 {\displaystyle B_{i,j}=A_{i,(j+1)mod4}}
* Замешивание столбцов — MC (Mix Columns: каждый столбец состояния изменяется линейным преобразованием  μ : ( 0 , 1 ) 32 -> ( 0 , 1 ) 32 {\displaystyle \mu :(0,1)^{32}\rightarrow (0,1)^{32}}

Иначе говоря, это есть ничто иное, как умножение столбцов на матрицу слева:  B = μ ( A ) = E = ( 2 3 1 1 1 2 3 1 1 1 2 3 3 1 1 2 ) {\displaystyle B=\mu (A)=E={\begin{pmatrix}2&3&1&1\\\1&2&3&1\\\1&1&2&3\\\3&1&1&2\end{pmatrix}}}

Операция  μ {\displaystyle \mu } обратима :  A j = μ − 1 ( B j ) {\displaystyle A_{j}=\mu ^{-1}(B_{j})}

* Добавление раундового ключа — KA (Key Addition): к текущему состоянию прибавляется раундовый ключ.

Финальный раунд не содержит операции MC. Формулы, связывающие состояния  A r {\displaystyle A^{r}} и  A r − 1 {\displaystyle A^{r-1}} :

A r = M C ( S R ( S ( A r − 1 ) ) ) ⊕ K r − 1 {\displaystyle A^{r}=MC(SR(S(A^{r-1})))\oplus K^{r-1}} ;
A r − 1 = S − 1 ( S R − 1 ( M C − 1 ( A r ⊕ K r − 1 ) ) ) {\displaystyle A^{r-1}=S^{-1}(SR^{-1}(MC^{-1}(A^{r}\oplus K^{r-1})))} ;

#### Алгоритм реализации интегральной атаки

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

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

Введем определения.

Λ {\displaystyle \Lambda } — набор из 256 входных блоков (массивов State), каждый из которых имеет байты (назовем их активными), значения которых различны для всех 256 блоков. Остальные байты (пассивные) остаются одинаковыми для всех 256 блоков из  Λ {\displaystyle \Lambda } -набора. То есть для любых  A , B ∈ Λ {\displaystyle A,B\in \Lambda } то  A i j ≠ B i j {\displaystyle A_{ij}\neq B_{ij}} если байт с индексом (i, j) активный и иначе  A i j = B i j {\displaystyle A_{ij}=B_{ij}} .

Λ r {\displaystyle \Lambda ^{r}} —  Λ {\displaystyle \Lambda } c k активными байтами.
P r {\displaystyle P_{r}} — множество состояний в конце раунда r.

Λ {\displaystyle \Lambda } -набор. После элементарных преобразований BS и KA блоки  Λ {\displaystyle \Lambda } -набора дадут в результате другой  Λ {\displaystyle \Lambda } -набор с активными байтами в тех же позициях, что и у исходного. Преобразование SR сместит эти байты соответственно заданным в ней смещениям. После преобразования MC  Λ {\displaystyle \Lambda } -набора в общем случае необязательно останется  Λ {\displaystyle \Lambda } -набором (результат операции может перестать удовлетворять определению  Λ {\displaystyle \Lambda } -набора). Так как каждый байт  B i j {\displaystyle B_{ij}} результата MC является линейной комбинацией (с обратимыми коэффициентами) четырёх входных байт того же столбца  B i j = 2 A i j ⊕ 3 A i + 1 m o d 4 j ⊕ A i + 2 m o d 4 j ⊕ A i + 3 m o d 4 j {\displaystyle B_{ij}=2A_{ij}\oplus 3A_{i+1mod4j}\oplus A_{i+2mod4j}\oplus A_{i+3mod4j}} , то столбец с единственным активным байтом на входе даст в результате на выходе столбец со всеми четырьмя активными байтами.

Рассмотрим шифрование  Λ 1 {\displaystyle \Lambda ^{1}} -набора. Во всех блоках будет активен только один байт. Значение этого байта различно во всех 256 блоках, а остальные байты одинаковы. В первом раунде преобразование MC преобразует один активный байт в столбец из 4 активных байт, то есть  P 1 {\displaystyle P_{1}} является  Λ 4 {\displaystyle \Lambda ^{4}} . Во втором раунде эти 4 байта разойдутся по 4 различным столбцам в результате преобразования SR,  P 2 {\displaystyle P_{2}} является  Λ 16 {\displaystyle \Lambda ^{16}} -набором. Преобразование MC следующего, третьего раунда преобразует эти байты в 4 столбца, содержащие активные байты. Этот набор все ещё остается  Λ {\displaystyle \Lambda } -набором до того момента, когда он поступает на вход MC третьего раунда.

Основное свойство  Λ {\displaystyle \Lambda } -набора — поразрядная сумма по модулю 2 ( ⊕ {\displaystyle \oplus } ) всех байтов, находящихся на одних и тех же местах, по всему набору равна нулю (поразрядная сумма неактивных (с одинаковыми значениями) байт равна нулю по определению операции « ⊕ {\displaystyle \oplus } », а активные байты, пробегая все 256 значений, также при поразрядном суммировании дадут нуль)

Результат преобразования MC в третьем раунде байтов входного массива данных  A {\displaystyle A} в байты выходного массива данных  B {\displaystyle B} — поразрядная сумма всех блоков выходного набора будет равна нулю:

⊕ B = M C ( A ) , A ∈ Λ 1 6 B i j = ⊕ A ∈ Λ 1 6 ( 2 A i j ⊕ 3 A i + 1 m o d 4 j ⊕ A i + 2 m o d 4 j ⊕ A i + 3 m o d 4 j ) = 0 {\displaystyle \oplus _{B=MC(A),A\in \Lambda ^{1}6}B_{ij}=\oplus _{A\in \Lambda ^{1}6}(2A_{ij}\oplus 3A_{i+1mod4j}\oplus A_{i+2mod4j}\oplus A_{i+3mod4j})=0}

Таким образом  P 3 {\displaystyle P_{3}} есть  Λ 16 {\displaystyle \Lambda ^{16}} . Полная сумма данных на входе равна нулю. Это равнество нарушается последующим преобразованием BS.

Ключ  K r {\displaystyle K^{r}} однозначно задается в R представлении:

L r = S R − 1 ( M C − 1 ( K r ) ) {\displaystyle L^{r}=SR^{-1}(MC^{-1}(K^{r}))}
K r = M C ( S R ( L r ) ) {\displaystyle K^{r}=MC(SR(L^{r}))}

Для проведения атаки потребуется множество  Q 4 {\displaystyle Q_{4}} , состоящее из 256 состояний.  Q r = S R − 1 ( M C − 1 ( A ) ) , A ∈ P r {\displaystyle Q_{r}=SR^{-1}(MC^{-1}(A)),A\in P_{r}} Множество  Q 4 {\displaystyle Q_{4}} можно получить применением 2 обратных преобразований SR и MC из входных данных шифра  P 4 {\displaystyle P_{4}} .

Схема базовой интегральной атаки на 4-раундовый Crypton:

Для всех  i , j ∈ 0 , 1 , 2 , 3 {\displaystyle i,j\in {0,1,2,3}}

для  k i n G F ( 2 8 ) {\displaystyle k\ inGF(2^{8})}

если  ⊕ Z ∈ Q S − 1 ( Z i j ⊕ k ) ≠ 0 {\displaystyle \oplus _{Z\in Q}S^{-1}(Z_{ij}\oplus k)\neq 0} ,

то  L i j 4 ≠ k {\displaystyle L_{ij}^{4}\neq k}

В этой схеме инвертируется 4-й раунд шаг за шагом, чтобы получить байты  P 3 {\displaystyle P_{3}} , полная сумма которых равна 0. При  L i j 4 = k {\displaystyle L_{ij}^{4}=k} сумма  ⊕ Z ∈ Q S − 1 ( Z i j ⊕ k ) = 0 {\displaystyle \oplus _{Z\in Q}S^{-1}(Z_{ij}\oplus k)=0}

Если предполагаемое значение байта ключа было верно, то оно будет включено в возможные варианты на место  L 4 {\displaystyle L^{4}} . Большая часть неверных значений байта будет отсеяно. За счет того, что поиск может производиться отдельно (параллельно) для каждого байта ключа, скорость подбора всего значения раундового ключа весьма велика. Далее по значению  L 4 {\displaystyle L^{4}} можно найти  K 4 {\displaystyle K^{4}} , а потом и  K 0 {\displaystyle K^{0}} — исходный ключ.

## Конкурс AES

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

Первыми шагами навстречу изменению стандартов шифрования было создание конкурса AES. Это был открытый конкурс, проводимый институтом стандартов и технологий США — NIST (National Institute of Standart and Technology). Победитель этого конкурса должен был стать новым стандартом шифрования США. В конкурсе могли принимать частные лица, компании как внутри США так и за пределами страны.

Основные требования:

1. 128 бит — размер блока шифруемых данных.
2. Три или более размеров ключей должно поддерживаться алгоритмом (128, 256, 192 — бит — обязательные размеры ключей для конкурса).

Однако несмотря на малое количество требований для алгоритмов, было много пожеланий:

1. алгоритм должен быть стоек от криптоаналитических атак, известных на момент проведения конкурса;
2. структура алгоритма должна быть ясной, простой и обоснованной;
3. должны отсутствовать слабые и эквивалентные ключи;
4. скорость шифрования данных должна быть высокой на всех потенциальных аппаратных платформах от 8 до 64 битовых.
5. структура алгоритма должна позволять распараллеливать операции в многопроцессорных системах и аппаратных реализациях.
6. алгоритм должен предъявлять минимальные требования к оперативной и энергонезависимой памяти.
7. не должно быть ограничений на использование алгоритмов.

Заметим, что участникам конкурса AES разрешалось вносить изменения в алгоритмы в ходе конкурса, если это незначительные модификации. Для алгоритма Crypton при предоставлении новой версии, жюри сочли изменения значительными, так как они касались таблицы замен, процедуру расширения ключа. В результате, на конкурсе участвовала версия Crypton v0.5.

Отсутствие явных минусов и наличие достоинств у алгоритма Crypton все равно не позволило ему выйти в финал конкурса AES. Причиной тому было участие в конкурсе двух алгоритмов: Rijndael и Twofish. Эти алгоритмы не имели проблем слабых ключей как у алгоритма Crypton. Более того они были быстрее чем Crypton на целевых платформах. Было решено, что в дальнейшем Crypton проиграет в любом случае этим алгоритмам, поэтому эксперты конкурса не пропустили Crypton в финал. (Rijndael — будущий победитель конкурса).

## Версии алгоритма Crypton

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

В конкурсе участвовала первичная редакция алгоритма, которая получила индекс 0.5 через некоторое время. Через некоторое время было предложено ещё несколько редакций, последней из которой стала версия 1.0 с переработанным ключевым расписанием и новыми таблицами подстановки.

## Примечания

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

1. ↑ Бухаров О.Е., Боголюбов Д.П. Распараллеленная самообучающаяся система поддержки принятия решений на генетических алгоритмах и нейронных сетях (рус.) // Системный администратор. — 2014. — № Выпуск №9 (142). Архивировано 28 января 2021 года.

## Литература

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

* Chae Hoon Lim. CRYPTON: a new 128-bit Block Cipher–Specification and Analysis. — 1998. — doi:10.1.1.52.5771.
* Алгоритмы Шифрования. Специальный Справочник/ Автор: Сергей Петрович Панасенко/ Изд: «БХВ-Санкт-Петербург», 2009

## Ссылки

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

* A New 128-bit Block Cipher. Specification and Analysis. (англ)
* A New 128-bit Block Cipher Specification and Analysis Other (недоступная ссылка) (англ)
* Спецификация алгоритма

Содержимое этой статьи нуждается в чистке.

Текст содержит много маловажных, неэнциклопедичных или устаревших подробностей. Пожалуйста, улучшите статью в соответствии с правилами написания статей. (30 июля 2021)

|

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

Потоковые шифры|

* A3
* A5
* A8
* Decim
* F-FCSR
* Grain
* HC-256
* KCipher-2
* MICKEY
* MUGI
* PIKE
* Phelix
* RC4
* Rabbit
* SEAL
* SNOW
* SOSEMANUK
* Salsa20
* STRUMOK
* Trivium
* VMPC

Сеть Фейстеля|

* ГОСТ 28147-89 (Магма)
* Blowfish
* Camellia
* CAST-128
* CAST-256
* CIPHERUNICORN-A
* CIPHERUNICORN-E
* CLEFIA
* Cobra
* DEAL
* DES
* DESX
* DFC
* E2
* EnRUPT
* FEAL
* HPC
* IDEA
* KASUMI
* Khafre
* Khufu
* LOKI97
* MacGuffin
* MARS
* MESH
* MISTY1
* NewDES
* NDS
* RC5
* RC6
* SEED
* Simon
* Sinople
* Skipjack
* SM4
* Speck
* TEA
* XTEA
* XXTEA
* Raiden
* RTEA
* Triple DES
* Twofish

SP-сеть|

* Кузнечик
* 3-WAY
* ABC
* ARIA
* AES (Rijndael)
* Akelarre
* Anubis
* BaseKing
* BassOmatic
* BelT
* CRYPTON
* Diamond2
* Grand Cru
* Hierocrypt-3
* Hierocrypt-L1
* KHAZAD
* Kalyna
* Lucifer
* Present
* Rainbow
* SAFER
* SHARK
* SQUARE
* Serpent
* Threefish

Другие|

* FROG
* NUSH
* REDOC
* SC2000
* SHACAL
* CS-Cipher