М8 (шифр)
Общий | |
---|---|
Дизайнеры | Хитачи |
Впервые опубликовано | 1999 |
Получено из | М6 |
Деталь шифрования | |
Размеры блоков | 64 бита |
Структура | Сеть Фейстеля |
Раунды | Переменная |
В криптографии , разработанная для большей безопасности и высокой производительности как в аппаратных , M8 — это блочный шифр , разработанный Hitachi в 1999 году. Это модификация более раннего алгоритма Hitachi M6 так и в 32-битных программных реализациях. M8 был зарегистрирован Hitachi в марте 1999 года как ISO/IEC 9979-0020. [1]
Как и M6, M8 представляет собой шифр Фейстеля с размером блока 64 бита. Функция округления может включать в себя 32-битное вращение , операции XOR и модульное сложение , что делает ее ранним примером шифра ARX .
Шифр имеет переменное количество раундов (любое положительное целое число N), каждый из которых имеет структуру, определяемую « ключом решения алгоритма » для конкретного раунда. Создание зависимости раундов от ключа призвано усложнить криптоанализ ( см. в FROG аналогичную философию проектирования ).
Описание шифра [ править ]
В качестве счетчика раундов можно установить любое положительное целое число N, но рекомендуется использовать количество раундов не менее 10. Ключ состоит из четырех компонентов: 64-битного ключа данных, 256-битного ключа расширения ключа, набора N 24-битных ключей принятия решения алгоритма и набора N 96-битных ключей расширения алгоритма.
Функция round используется как для расширения ключа, так и для шифрования/дешифрования. Процесс расширения ключа преобразует 64-битный ключ данных и 256-битный ключ расширения ключа в 256-битный ключ выполнения, состоящий из 4 пар 32-битных чисел. .
Шифр имеет типичную конструкцию шифра Фейстеля . Сначала 64-битный входной блок разбивается на две 32-битные половины. В каждом раунде левая половина подвергается ключевой трансформации, а затем объединяется с правой половиной. Наконец половинки меняются местами. Всего функция round состоит из последовательности из девяти настраиваемых операций и трех поразрядных вращений:
обозначает круглое число, которое принимает входные данные и . — это три 32-битных слова ключа расширения алгоритма раунда. являются словами из исполнительного ключа. обозначает побитовое вращение влево. и определяются ключом решения 24-битного алгоритма следующим образом:
MSB LSB op1 op2 op3 op4 op5 op6 op7 op8 op9 S1 S2 S3
где от op1 до op9 — каждый по одному биту (0 = сложение по модулю 2 32 , 1 = исключающее ИЛИ), а от S1 до S3 — по пять битов каждый.
Расширение ключа состоит из восьми раундов шифрования с использованием первых восьми ключей принятия решения и расширения алгоритма, ключа расширения ключа в качестве ключа выполнения и ключа данных в качестве входного блока. Восемь промежуточных выходов, используются в качестве восьми компонентов ключа выполнения .
Реализация шифрования [ править ]
Ниже приведена реализация шифра на Python .
# https://en.wikipedia.org/wiki/M8_(cipher)
M = 0xffffffff
def add(x, y):
return (x + y) & M
def xor(x, y):
return x ^ y
def rol(x, s):
return ((x << s) | (x >> (32 - s))) & M
def m8_round(L, R, ri, k, adk, aek):
"""
One round of the algorithm.
L, R: input
ri: round index
k: 256-bit execution key
adk: 24-bit algorithm decision key
aek: 96-bit algorithm expansion key
"""
op = [[add, xor][(adk >> (23 - i)) & 1] for i in range(9)]
S1 = (adk >> 10) & 0x1f
S2 = (adk >> 5) & 0x1f
S3 = (adk >> 0) & 0x1f
A = (aek >> 64) & M
B = (aek >> 32) & M
C = (aek >> 0) & M
KR = (k >> (32 + 64 * (3 - ri % 4))) & M
KL = (k >> (0 + 64 * (3 - ri % 4))) & M
x = op[0](L, KL)
y = op[2](op[1](rol(x, S1), x), A)
z = op[5](op[4](op[3](rol(y, S2), y), B), KR)
return op[8](op[7](op[6](rol(z, S3), z), C), R), L
def m8_keyexpand(dk, kek, adks, aeks):
"""
Key expansion.
dk: 64-bit data key
kek: 256-bit key expansion key
adks: algorithm decision keys
aeks: algorithm expansion keys
"""
L = (dk >> 32) & M
R = (dk >> 0) & M
k = 0
for i in range(8):
L, R = m8_round(L, R, i, kek, adks[i], aeks[i])
k |= (L << (32 * (7 - i)))
return k
def m8_encrypt(data, N, dk, kek, adks, aeks):
"""
Encrypt one block with M8.
data: 64-bit input block
N: number of rounds (must be >= 8)
dk: 64-bit data key
kek: 256-bit key expansion key
adks: a list of N 24-bit algorithm decision keys
aeks: a list of N 96-bit algorithm expansion keys
"""
ek = m8_keyexpand(dk, kek, adks, aeks)
L = (data >> 32) & M
R = (data >> 0) & M
for i in range(N):
L, R = m8_round(L, R, i, ek, adks[i], aeks[i])
return (L << 32) | R
# Published test vector from ISO/IEC 9979/0020
result = m8_encrypt(
0x0000_0000_0000_0001,
126,
0x0123_4567_89AB_CDEF,
0,
[0x848B6D, 0x8489BB, 0x84B762, 0x84EDA2] * 32,
[0x0000_0001_0000_0000_0000_0000] * 126,
)
assert result == 0xFE4B_1622_E446_36C0
Тестовые векторы [ править ]
Опубликованная версия ISO/IEC 9979-0020 включает следующие данные испытаний:
- Номер раунда: 126
- Ключ расширения: 0 256 (вектор, состоящий из всех нулей)
- Ключ данных: 0123 4567 89AB CDEF в шестнадцатеричном формате.
- Ключ решения алгоритма:
- раунды 1, 5, 9, ...: 848B6D шестигранник
- раунды 2, 6, 10, ...: 8489BB шестнадцатеричный
- раунды 3, 7, 11, ...: 84B762 шестнадцатеричный
- раунды 4, 8, 12, ...: 84EDA2 шестигранник
- Ключ расширения алгоритма: 0000 0001 0000 0000 0000 0000 шестнадцатеричный для всех раундов.
- Открытый текст: 0000 0000 0000 0001 шестнадцатеричный
- Зашифрованный текст после 7 раундов: C5D6 FBAD 76AB A53B шестнадцатеричный.
- Зашифрованный текст после 14 раундов: 6380 4805 68DB 1895 шестнадцатеричный.
- Зашифрованный текст после 21 раунда: 2BFB 806E 1292 5B18 шестнадцатеричный.
- Зашифрованный текст после 28 раундов: F610 6A41 88C5 8747 hex.
- Зашифрованный текст после 56 раундов: D3E1 66E9 C50A 10A2 шестнадцатеричный.
- Окончательный зашифрованный текст после 126 раундов: FE4B 1622 E446 36C0 шестнадцатеричный.
Криптоанализ [ править ]
Зависимое от ключа поведение шифра приводит к появлению большого класса слабых ключей , которые подвергают шифр ряду атак, включая дифференциальный криптоанализ , линейный криптоанализ и современный криптоанализ . [2]
Ссылки [ править ]
- ^ «Запись в реестре ISO/IEC9979-0020» (PDF) . Профессор Крис Митчелл, Группа информационной безопасности, Ройял Холлоуэй, Лондонский университет . ISO/IEC 9979 Реестр криптографических алгоритмов.
- ^ Тосио Токита; Цутому Мацумото. «О применимости дифференциального криптоанализа, линейного криптоанализа и криптоанализа Mod n к алгоритму шифрования M8 (ISO9979-20)». Журнал IPSJ . 42 (8).