Перейти до вмісту

CAST-128

Матеріал з Вікіпедії — вільної енциклопедії.
CAST-128
Загальні
РозробникиКарлайл Адамс, Стаффорд Таварес
Уперше оприлюднений1996 рік
Пов'язаний зМережа Фейстеля
Деталі шифру
Розмір ключа40-128 біт
Розмір блоку64 біт
Раундів12 (16 при ключі > 80 біт)
Див. також: CAST-256

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-біт.

Неідентичні раунди

[ред. | ред. код]
Вихідна функція F

Три різних типів функції використовуються в 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[] являє поле заміни і і "^" представляє додавання по 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]
 К19 = 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]
 К23 = 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]
 К26 = 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

S-Box S2

S-Box S3

S-Box S4

S-Box S5

S-Box S6

S-Box S7

S-Box S8

Розшифрування

[ред. | ред. код]

Розшифровка для CAST-128 відносно проста. Розшифрування працює в тому ж алгоритмічній напрямку що й шифрування, починаючи з зашифрованого тексту в якості вхідних даних. При цьому підключ використовуються в зворотному напрямку.

Посилання

[ред. | ред. код]