Меню
Главная
Случайная статья
Настройки
|
CAST-128 (или CAST5) в криптографии — блочный алгоритм симметричного шифрования на основе сети Фейстеля, который используется в целом ряде продуктов криптографической защиты, в частности некоторых версиях PGP и GPG и кроме того одобрен для использования Канадским правительством.
Содержание
Основные сведения
Алгоритм был создан в 1996 году Карлайлом Адамсом (Carlisle Adams) и Стаффордом Таваресом (Stafford Tavares) используя метод построения шифров CAST, который используется также и другим их алгоритмом CAST-256 (алгоритм-кандидат AES).
CAST-128 состоит из 12 или 16 раундов сети Фейстеля с размером блока 64 бита и длиной ключа от 40 до 128 бит (но только с инкрементацией по 8 бит). 16 раундов используются когда размеры ключа превышают 80 бит. В алгоритме используются 8x16 S- блоки, основанные на бент-функции, операции XOR и модулярной арифметике (модулярное сложение и вычитание). Есть три различных типа функций раундов, но они похожи по структуре и различаются только в выборе выполняемой операции (сложение, вычитание или XOR) в различных местах.
Хотя CAST-128 защищён патентом Entrust, его можно использовать во всём мире для коммерческих или некоммерческих целей бесплатно.
Описание
CAST — это популярный 64-битовый шифр, допускающий размеры ключа вплоть до 128 бит, который был разработан в Канаде Карлайлом Адамсом (Carlisle Adams) и Стаффордом Таваресом (Stafford Tavares). Авторы утверждают, что название обусловлено ходом разработки и должно напоминать о вероятностном характере процесса, а не об инициалах авторов.
Алгоритм CAST использует 64-битовый блок и 64-битовый ключ. CAST устойчив к дифференциальному и линейному криптоанализу. Сила алгоритма CAST заключена в его S-блоках. У CAST нет фиксированных S-блоков и для каждого приложения они конструируются заново. Созданный для конкретной реализации CAST S-блок уже больше никогда не меняется. Другими словами, S-блоки зависят от реализации, а не от ключа. Northern Telecom использует CAST в своём пакете программ Entrust для компьютеров Macintosh, PC и рабочих станций UNIX. Выбранные ими S-блоки не опубликованы, что впрочем неудивительно.
CAST-128 принадлежит компании Entrust Technologies, но является бесплатным как для коммерческого, так и для некоммерческого использования. CAST-256 — бесплатное доступное расширение CAST-128, которое принимает размер ключа до 256 бит и имеет размер блока 128 бит. CAST-256 был одним из первоначальных кандидатов на AES.
Описание алгоритма
CAST-128 основан на сети Фейстеля. Полный алгоритм шифрования изложен в следующих четырех шагах:
ВХОД: текст m1 ... m64, ключ K = k1 ... k128.
ВЫХОД: зашифрованный текст c1 ... C64.
1. (развертка ключа) составляет 16 пар подключей {Kmi, Kri} полученных из K (см. разделы Пары раундовых ключей и Неидентичные раунды).
2. (L0, R0) <- (m1. .. m64). (Разделяет текст на левую и правую 32-битные половины L0 = m1 ... m32 и R0 = m33 ... m64).
3. (16 раундов) for i from 1 to 16, вычислить Li и Ri следующим образом:
Li = Ri-1;
Ri = Li-1 ^ F(Ri-1,Kmi,Kri), где F определена в разделе «Пары раундовых ключей» (F имеет тип 1, тип 2, тип 3 или, в зависимости от i).
4. c1 ... c64 <- (R16, L16). (Меняем окончательные блоки местами L16, R16 и объединяем, чтобы сформировать зашифрованный текст.)
Расшифрование совпадает с алгоритмом шифрования, приведенным выше, кроме того, что раунды (и, следовательно, пары подключей), используются в обратном порядке, чтобы вычислить (L0, R0) из (R16, L16).
Пары раундовых ключей
CAST-128 использует пару подключей за раунд: 32-битные величины Km используется в качестве "маскировки" ключа и Kr используют как "перестановки" ключа, из которых используются только начальные 5-бит.
Неидентичные раунды
Три различных типов функции используются в CAST-128. Типы выглядит следующим образом (где "D" является входными данными в функцию F и "Ia"-"Id" является наиболее значимый байт - наименее значимый байт I, соответственно). Обратите внимание, что "+" и "-" сложение и вычитание по модулю 2 ** 32, "^" является побитовое XOR и "<<<" является циклическим сдвигом влево.
Раунды 1,4,7,10,13,16 |
I = ((Kmi + Ri-1) <<< Kri) F = ((S1[Ia] ^ S2[Ib]) – (S3[Ic]) )+ S4[Id]
|
Раунды 2,5,8,11,14 |
I = ((Kmi ^ Ri-1) <<< Kri) F = ((S1[Ia] - S2[Ib]) + (S3[Ic])) ^ S4[Id]
|
Раунды 3,6,9,12,15 |
I = ((Kmi - Ri-1) <<< Kri) F = ((S1[Ia] + S2[Ib]) ^ (S3[Ic]) )- S4[Id]
|
Поля замены
CAST-128 использует восемь полей замены: поля S1, S2, S3 и S4 раундовые функции полей замены, S5, S6, S7 и S8 являются ключами развертки полей замены. Несмотря на то, что 8 полей замены требуют в общей сложности 8 Кбайт для хранения, обратите внимание на то, что только 4 Кбайта требуются во время фактического шифрования / дешифрование, так как генерация подключа обычно делается до любого ввода данных.
См. Приложение для содержимого полей замены S1 - S8.
Ключи развертки
Представим 128-разрядный ключ в виде x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF, где x0 старший байт, и xF младший байт.
Представим z0..zF промежуточными (временными) байтами. Si[] представляет поле замены i и "^" представляет сложение по XOR’у.
Поля замены формируются из ключа x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF следующим образом.
z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8]
z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA]
z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9]
zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB]
K1 = S5[z8] ^ S6[z9] ^ S7[z7] ^ S8[z6] ^ S5[z2]
K2 = S5[zA] ^ S6[zB] ^ S7[z5] ^ S8[z4] ^ S6[z6]
K3 = S5[zC] ^ S6[zD] ^ S7[z3] ^ S8[z2] ^ S7[z9]
K4 = S5[zE] ^ S6[zF] ^ S7[z1] ^ S8[z0] ^ S8[zC]
x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0]
x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2]
x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1]
xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3]
K5 = S5[x3] ^ S6[x2] ^ S7[xC] ^ S8[xD] ^ S5[x8]
K6 = S5[x1] ^ S6[x0] ^ S7[xE] ^ S8[xF] ^ S6[xD]
K7 = S5[x7] ^ S6[x6] ^ S7[x8] ^ S8[x9] ^ S7[x3]
K8 = S5[x5] ^ S6[x4] ^ S7[xA] ^ S8[xB] ^ S8[x7]
z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8]
z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA]
z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9]
zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB]
K9 = S5[z3] ^ S6[z2] ^ S7[zC] ^ S8[zD] ^ S5[z9]
K10 = S5[z1] ^ S6[z0] ^ S7[zE] ^ S8[zF] ^ S6[zC]
K11 = S5[z7] ^ S6[z6] ^ S7[z8] ^ S8[z9] ^ S7[z2]
K12 = S5[z5] ^ S6[z4] ^ S7[zA] ^ S8[zB] ^ S8[z6]
x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0]
x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2]
x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1]
xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3]
K13 = S5[x8] ^ S6[x9] ^ S7[x7] ^ S8[x6] ^ S5[x3]
K14 = S5[xA] ^ S6[xB] ^ S7[x5] ^ S8[x4] ^ S6[x7]
K15 = S5[xC] ^ S6[xD] ^ S7[x3] ^ S8[x2] ^ S7[x8]
K16 = S5[xE] ^ S6[xF] ^ S7[x1] ^ S8[x0] ^ S8[xD]
Остающаяся половина идентична тому, что дано выше, продолжение от последнего создало x0..xF, чтобы генерировать ключи K17 - K32.
z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8]
z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA]
z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9]
zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB]
K17 = S5[z8] ^ S6[z9] ^ S7[z7] ^ S8[z6] ^ S5[z2]
K18 = S5[zA] ^ S6[zB] ^ S7[z5] ^ S8[z4] ^ S6[z6]
K19 = S5[zC] ^ S6[zD] ^ S7[z3] ^ S8[z2] ^ S7[z9]
K20 = S5[zE] ^ S6[zF] ^ S7[z1] ^ S8[z0] ^ S8[zC]
x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0]
x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2]
x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1]
xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3]
K21 = S5[x3] ^ S6[x2] ^ S7[xC] ^ S8[xD] ^ S5[x8]
K22 = S5[x1] ^ S6[x0] ^ S7[xE] ^ S8[xF] ^ S6[xD]
K23 = S5[x7] ^ S6[x6] ^ S7[x8] ^ S8[x9] ^ S7[x3]
K24 = S5[x5] ^ S6[x4] ^ S7[xA] ^ S8[xB] ^ S8[x7]
z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8]
z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA]
z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9]
zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB]
K25 = S5[z3] ^ S6[z2] ^ S7[zC] ^ S8[zD] ^ S5[z9]
K26 = S5[z1] ^ S6[z0] ^ S7[zE] ^ S8[zF] ^ S6[zC]
K27 = S5[z7] ^ S6[z6] ^ S7[z8] ^ S8[z9] ^ S7[z2]
K28 = S5[z5] ^ S6[z4] ^ S7[zA] ^ S8[zB] ^ S8[z6]
x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0]
x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2]
x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1]
xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3]
K29 = S5[x8] ^ S6[x9] ^ S7[x7] ^ S8[x6] ^ S5[x3]
K30 = S5[xA] ^ S6[xB] ^ S7[x5] ^ S8[x4] ^ S6[x7]
K31 = S5[xC] ^ S6[xD] ^ S7[x3] ^ S8[x2] ^ S7[x8]
K32 = S5[xE] ^ S6[xF] ^ S7[x1] ^ S8[x0] ^ S8[xD]
Маскировка и перестановка подключей
Km1, ..., Km16 32-разрядные подключи маскировки (один на раунд).
Kr1,, Kr16 32-разрядные перестановки подключей (один на раунд); только младшие 5 битов используются в каждом раунде.
for (i=1; i<=16; i++) { Kmi = Ki; Kri = K16+i; }
Переменный размер ключа
CAST-128 Алгоритм шифрования был разработан, чтобы размер ключа мог варьироваться от 40 до 128 бит, в 8-битном шаге (т. е. допустимые размеры ключа равняются 40, 48, 56, 64..., 112, 120, и 128 битам). Для переменной работы размера ключа спецификация следующие:
1) Для размеров ключа до и включая 80 битов (т. е., 40, 48, 56, 64, 72, и 80 битов) алгоритм точно такой же, но использует 12 раундов вместо 16;
2) Для размеров ключа больше, чем 80 битов, алгоритм использует полные 16 раундов;
3) Для размеров ключа меньше, чем 128 битов ключ дополнен нулевыми байтами (в самых правых, или младших, позициях) к 128 битам (так как расписание ключа CAST 128 принимает входной ключ 128 битов).
Приложение: Поля замены
S-Box S1
30fb40d4 |
9fa0ff0b |
6beccd2f |
3f258c7a |
1e213f2f |
9c004dd3 |
6003e540 |
cf9fc949
|
bfd4af27 |
88bbbdb5 |
e2034090 |
98d09675 |
6e63a0e0 |
15c361d2 |
c2e7661d |
22d4ff8e
|
28683b6f |
c07fd059 |
ff2379c8 |
775f50e2 |
43c340d3 |
df2f8656 |
887ca41a |
a2d2bd2d
|
a1c9e0d6 |
346c4819 |
61b76d87 |
22540f2f |
2abe32e1 |
aa54166b |
22568e3a |
a2d341d0
|
66db40c8 |
a784392f |
004dff2f |
2db9d2de |
97943fac |
4a97c1d8 |
527644b7 |
b5f437a7
|
b82cbaef |
d751d159 |
6ff7f0ed |
5a097a1f |
827b68d0 |
90ecf52e |
22b0c054 |
bc8e5935
|
4b6d2f7f |
50bb64a2 |
d2664910 |
bee5812d |
b7332290 |
e93b159f |
b48ee411 |
4bff345d
|
fd45c240 |
ad31973f |
c4f6d02e |
55fc8165 |
d5b1caad |
a1ac2dae |
a2d4b76d |
c19b0c50
|
882240f2 |
0c6e4f38 |
a4e4bfd7 |
4f5ba272 |
564c1d2f |
c59c5319 |
b949e354 |
b04669fe
|
b1b6ab8a |
c71358dd |
6385c545 |
110f935d |
57538ad5 |
6a390493 |
e63d37e0 |
2a54f6b3
|
3a787d5f |
6276a0b5 |
19a6fcdf |
7a42206a |
29f9d4d5 |
f61b1891 |
bb72275e |
aa508167
|
38901091 |
c6b505eb |
84c7cb8c |
2ad75a0f |
874a1427 |
a2d1936b |
2ad286af |
aa56d291
|
d7894360 |
425c750d |
93b39e26 |
187184c9 |
6c00b32d |
73e2bb14 |
a0bebc3c |
54623779
|
64459eab |
3f328b82 |
7718cf82 |
59a2cea6 |
04ee002e |
89fe78e6 |
3fab0950 |
325ff6c2
|
81383f05 |
6963c5c8 |
76cb5ad6 |
d49974c9 |
ca180dcf |
380782d5 |
c7fa5cf6 |
8ac31511
|
35e79e13 |
47da91d0 |
f40f9086 |
a7e2419e |
31366241 |
051ef495 |
aa573b04 |
4a805d8d
|
548300d0 |
00322a3c |
bf64cddf |
ba57a68e |
75c6372b |
50afd341 |
a7c13275 |
915a0bf5
|
6b54bfab |
2b0b1426 |
ab4cc9d7 |
449ccd82 |
f7fbf265 |
ab85c5f3 |
1b55db94 |
aad4e324
|
cfa4bd3f |
2deaa3e2 |
9e204d02 |
c8bd25ac |
eadf55b3 |
d5bd9e98 |
e31231b2 |
2ad5ad6c
|
954329de |
adbe4528 |
d8710f69 |
aa51c90f |
aa786bf6 |
22513f1e |
aa51a79b |
2ad344cc
|
7b5a41f0 |
d37cfbad |
1b069505 |
41ece491 |
b4c332e6 |
032268d4 |
c9600acc |
ce387e6d
|
bf6bb16c |
6a70fb78 |
0d03d9c9 |
d4df39de |
e01063da |
4736f464 |
5ad328d8 |
b347cc96
|
75bb0fc3 |
98511bfb |
4ffbcc35 |
b58bcf6a |
e11f0abc |
bfc5fe4a |
a70aec10 |
ac39570a
|
3f04442f |
6188b153 |
e0397a2e |
5727cb79 |
9ceb418f |
1cacd68d |
2ad37c96 |
0175cb9d
|
c69dff09 |
c75b65f0 |
d9db40d8 |
ec0e7779 |
4744ead4 |
b11c3274 |
dd24cb9e |
7e1c54bd
|
f01144f9 |
d2240eb1 |
9675b3fd |
a3ac3755 |
d47c27af |
51c85f4d |
56907596 |
a5bb15e6
|
580304f0 |
ca042cf1 |
011a37ea |
8dbfaadb |
35ba3e4a |
3526ffa0 |
c37b4d09 |
bc306ed9
|
98a52666 |
5648f725 |
ff5e569d |
0ced63d0 |
7c63b2cf |
700b45e1 |
d5ea50f1 |
85a92872
|
af1fbda7 |
d4234870 |
a7870bf3 |
2d3b4d79 |
42e04198 |
0cd0ede7 |
26470db8 |
f881814c
|
474d6ad7 |
7c0c5e5c |
d1231959 |
381b7298 |
f5d2f4db |
ab838653 |
6e2f1e23 |
83719c9e
|
bd91e046 |
9a56456e |
dc39200c |
20c8c571 |
962bda1c |
e1e696ff |
b141ab08 |
7cca89b9
|
1a69e783 |
02cc4843 |
a2f7c579 |
429ef47d |
427b169c |
5ac9f049 |
dd8f0f00 |
5c8165bf
|
S-Box S2
|
|