- PVSM.RU - https://www.pvsm.ru -

Стандарты симметричного шифрования стран СНГ на Python

image
Первые недели нового года самое подходящее время для того, чтобы уютно устроившись у окошка, вспомнить что же нам принес год ушедший.
А принес он нам два новых стандарта шифрования. Российский стандарт ГОСТ Р 34.12-2015 (блочный шифр Кузнечик). И украинский ДСТУ 7624:2014 (блочный шифр Калина). Холодными, зимними вечерами нельзя упускать такой удачный повод покодить. Под катом краткое описание алгоритмов и их реализация на Python. А чтобы новым шифрам было веселее, разбавим их общество белорусским СТБ 34.101.31-2007.

ГОСТ Р 34.12-2015

Начать предлагаю с российского стандарта — блочного шифра Кузнечик. Длина входного блока шифра — 128 бит, длина ключа — 256 бит.
В шифре используются следующие преобразования:

  • X — побитовое сложение по модулю 2 с ключом:
    Стандарты симметричного шифрования стран СНГ на Python - 2
  • Нелинейное преобразование S осуществляется заменой каждого байта подстановкой из таблицы π:
    Стандарты симметричного шифрования стран СНГ на Python - 3
  • Линейное преобразование L реализуется с помощью умножения над полем Галуа по модулю многочлена Стандарты симметричного шифрования стран СНГ на Python - 4:
     Δ — отображение, сопоставляющее двоичной строке элемент конечного поля.
    Стандарты симметричного шифрования стран СНГ на Python - 5 — отображение, сопоставляющее элементу конечного поля двоичную строку.
    Стандарты симметричного шифрования стран СНГ на Python - 6
    При вычислении Стандарты симметричного шифрования стран СНГ на Python - 7 операции сложения и умножения производятся в конечном поле.
    Стандарты симметричного шифрования стран СНГ на Python - 8
    Стандарты симметричного шифрования стран СНГ на Python - 9

Процедуру зашифрования 128-битного блока a формально описывается выражением:
Стандарты симметричного шифрования стран СНГ на Python - 10.
Что в более наглядной форме выглядит так:
Стандарты симметричного шифрования стран СНГ на Python - 11

Раундовые 128-битные ключи K1, K2 получаются разбиением основного 256-битного ключа пополам.
С их помощью вычисляются следующие раундовые ключи:
Стандарты симметричного шифрования стран СНГ на Python - 12
Стандарты симметричного шифрования стран СНГ на Python - 13
Стандарты симметричного шифрования стран СНГ на Python - 14

При расшифровании используются обратные преобразования:
Стандарты симметричного шифрования стран СНГ на Python - 15

Пример использования на Python:

if __name__ == '__main__':
    mtest = list(binascii.unhexlify('1122334455667700ffeeddccbbaa9988'))
    ktest = list(binascii.unhexlify('8899aabbccddeeff0011223344556677fedcba98765432100123456789abcdef'))
    gost =gost2015(ktest)
    print('GOST 34.12-2015')
    print(datetime.datetime.now())
    c = gost.encryption(mtest)
    d = gost.decryption(c)
    print(datetime.datetime.now())

ДСТУ 7624:2014

Введенный в июле 2015 года в качестве украинского стандарта шифр Калина поддерживает несколько вариантов длины блока и ключа. Здесь я опишу версию шифра с длиной блока и длиной ключа равной 128 бит.

Внутреннее состояние шифра является матрицей с 8 рядами и 2 столбцами. Перед началом шифрования матрица заполняется байтами открытого текста. Затем над элементами матрицы производится 10 раундов следующих преобразований.

  • Стандарты симметричного шифрования стран СНГ на Python - 16 — сложение колонок матрицы состояния с колонками раундового ключом, представленного в виде матрицы, по модулю 264.
  • Стандарты симметричного шифрования стран СНГ на Python - 17 (SubBytes) — замена каждого байта матрицы состояния подстановкой из одной из четырех таблиц π0, π1, π2, π3.
  • Стандарты симметричного шифрования стран СНГ на Python - 18 (SiftRows) — циклический сдвиг вправо на одну позицию строк с 4-й по 8-ю.
  • Стандарты симметричного шифрования стран СНГ на Python - 19 (MixColumns) — преобразование колонок матрицы состояний. Каждый элемент новой матрицы вычисляется по формуле: Стандарты симметричного шифрования стран СНГ на Python - 20, где ⊗ — скалярное произведение векторов, v — вектор, Стандарты симметричного шифрования стран СНГ на Python - 21, Gj — колонка матрицы. Операции умножения и сложения производится в конечном поле по модулю многочлена Стандарты симметричного шифрования стран СНГ на Python - 22
  • Стандарты симметричного шифрования стран СНГ на Python - 23 — побитовое сложение по модулю 2 матрицы внутреннего состояния шифра и раундового ключа Kv

Процесс шифрования описывается следующим выражением:
Стандарты симметричного шифрования стран СНГ на Python - 24
Или в более наглядном виде:
Стандарты симметричного шифрования стран СНГ на Python - 25
Для формирования раундовых ключей сначала, используя мастер-ключ К, вычисляется промежуточный ключ Стандарты симметричного шифрования стран СНГ на Python - 26:
Стандарты симметричного шифрования стран СНГ на Python - 27, где Стандарты симметричного шифрования стран СНГ на Python - 28 для случаев, когда длина блока равна длине ключа.
Ключи для четных раундов генерируются на основе промежуточного ключа:
Стандарты симметричного шифрования стран СНГ на Python - 29, где i — номер раунда, а Стандарты симметричного шифрования стран СНГ на Python - 30 и Стандарты симметричного шифрования стран СНГ на Python - 310x01000100010001000100010001000100
Ключи для нечетных раундов вычисляются так:
Стандарты симметричного шифрования стран СНГ на Python - 32, где l — длина блока.

При расшифровании используются обратные преобразования:
Стандарты симметричного шифрования стран СНГ на Python - 33

Пример использования на Python:

if __name__ == '__main__':
    key = list(binascii.unhexlify('000102030405060708090a0b0c0d0e0f'))
    pt = list(binascii.unhexlify('101112131415161718191a1b1c1d1e1f'))
    dstu =dstu2014(key)

    key2 = list(binascii.unhexlify('0f0e0d0c0b0a09080706050403020100'))
    ct = list(binascii.unhexlify('1f1e1d1c1b1a19181716151413121110'))
    dstu2 = dstu2014(key2)

    print(datetime.datetime.now())
    c = dstu.encryption(pt)
    d = dstu2.decryption(ct)
    print(datetime.datetime.now())

СТБ 34.101.31-2007

Шифр BelT, имеющий длину блока 128 бит и длину ключа 256 бит, был принят в качестве стандарта симметричного шифрования республики Беларусь в 2011 году. Шифрование осуществляется 8 раундами преобразований, применяемых ко входному блоку.
Процедура зашифрования состоит из следующих шагов:

  • Входной блок записывается в виде image
  • Ключ записывается в виде image и определяются раундовые ключи Стандарты симметричного шифрования стран СНГ на Python - 36
  • Дополнительным переменным a, b, c, d присваиваются значения image
  • Стандарты симметричного шифрования стран СНГ на Python - 38
    Где Gr — операция преобразования 32-битной входной строки и Стандарты симметричного шифрования стран СНГ на Python - 39; RotHir — циклический сдвиг влево на r бит; H(u) — операция замены 8-битной входной строки подстановкой из таблицы; Стандарты симметричного шифрования стран СНГ на Python - 40 и Стандарты симметричного шифрования стран СНГ на Python - 41 — операции сложения и вычитания по модулю 232.
  • image возвращается в качестве шифртекста.

При расшифровании те же операции применяются в обратном порядке.

Пример использования на Python:

if __name__ == '__main__':
    key = list(binascii.unhexlify('E9DEE72C8F0C0FA62DDB49F46F73964706075316ED247A3739CBA38303A98BF6'))
    belt1 = belt(key)
    m = list(binascii.unhexlify('B194BAC80A08F53B366D008E584A5DE4'))

    key2 = list(binascii.unhexlify('92BD9B1CE5D141015445FBC95E4D0EF2682080AA227D642F2687F93490405511'))
    belt2 = belt(key2)
    c = list(binascii.unhexlify('E12BDC1AE28257EC703FCCF095EE8DF1'))
    print(datetime.datetime.now())
    c1 = belt1.encryption(m)
    d1 = belt2.decryption(c)
    print(datetime.datetime.now())

PS

Реализацию всех описанных алгоритмов на Python можно найти на GitHub [1].

Ссылки

  1. Более подробное описание шифра Кузнечик приводится и в этой [2] статье пользователя ru_crypt [3], из которой я позаимствовал несколько иллюстраций.
  2. Текст стандарта ГОСТ Р 34.12-2015 можно найти тут [4].
  3. Описание шифра Калина доступно здесь [5].
  4. Стандарт СТБ 34.101.31-2007 лежит тут [6].

Автор: NeverWalkAloner

Источник [7]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/108704

Ссылки в тексте:

[1] GitHub: https://github.com/NeverWalkAloner/Cryptography-standards

[2] этой: http://habrahabr.ru/post/266359/

[3] ru_crypt: http://habrahabr.ru/users/ru_crypt/

[4] тут: http://tc26.ru/standard/gost/GOST_R_3412-2015.pdf

[5] здесь: https://eprint.iacr.org/2015/650.pdf

[6] тут: http://apmi.bsu.by/assets/files/std/belt-spec27.pdf

[7] Источник: http://habrahabr.ru/post/273895/