Jump to content

М8 (шифр)

М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]

Ссылки [ править ]

  1. ^ «Запись в реестре ISO/IEC9979-0020» (PDF) . Профессор Крис Митчелл, Группа информационной безопасности, Ройял Холлоуэй, Лондонский университет . ISO/IEC 9979 Реестр криптографических алгоритмов.
  2. ^ Тосио Токита; Цутому Мацумото. «О применимости дифференциального криптоанализа, линейного криптоанализа и криптоанализа Mod n к алгоритму шифрования M8 (ISO9979-20)». Журнал IPSJ . 42 (8).


Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: b4d832bf118dda140cbe74b7cc5bca75__1651031880
URL1:https://arc.ask3.ru/arc/aa/b4/75/b4d832bf118dda140cbe74b7cc5bca75.html
Заголовок, (Title) документа по адресу, URL1:
M8 (cipher) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)