Это шифрование на основе шифра Фиестеля с использованием 64-битных блоков в соответствии со спецификациями, определенными стандартами Российского Союза. Существует не так много информации об этом шифре, разработанном Советским Союзом в то время, когда АНБ разрабатывало DES-56. Это осталось в качестве альтернативы
Это блочный шифр с симметричным ключом и профилем:
Сеть : Fiestel
Размер блока : 64 бита
Размер ключа : 256 бит
Размер подраздела : 32 бита
Количество Раундов: 32 Раунда
S-Box : 8x16
Размер разделения : 32 бита
Ключ: 256 бит
Сообщение (шестнадцатеричное): n бит (будет разделено на 64-битные блоки)
Ключ должен быть сгенерирован с использованием генератора псевдослучайных битов (256 бит). Пожалуйста, обратитесь к MersenneTwister BlumBlumShub PRNG в моем репозитории.
Попробуйте настроить скрипт на генерацию 256 псевдослучайных битов. Это будет ваш ключ. Я оставлю это на ваше усмотрение.
Первоначальное внедрение КГБ (советской версии АНБ) было засекречено. Первоначальные S-боксы были созданы по заказу Советского Союза и держались в секрете от общественности. S-боксы предназначались отдельно для производителей микросхем по ГОСТу (опять же, поскольку КГБ изначально планировал использовать черный ход).
Но.. В рассекреченном GOST_R_3412-2015 есть S-Box, используемый в этой реализации.
Центральный банк Российской Федерации использовал другой S-Box, который предназначался для того, чтобы иметь бэкдоры для взлома КГБ. В идеале S-образный блок является сердцем любого шифра.
Есть и другие функции, которые приведены в спецификации, но я явно упоминаю приведенные ниже 2 преобразования. Другие преобразования, приведенные в статье, являются неявными (как в реализованных неявно).
ГОСТ MAGMA использует нелинейную биективную функцию (по сути, причудливый термин для подстановки), являющуюся нелинейной . Позволь
π быть преобразованием подстановки из S-Box, определенного выше.
Преобразование может быть определено из V32 -> V32 (имеется в виду 32-битное отображение векторного пространства)
|| Обратитесь к операции объединения.
V32 -> V32 : t(a)=t(a7.....|| a0) = π7||...|| π< sub>0.
Где a=(a7.....|| a0) ϵ V32 , ai ϵ V4 , i=(0...7)
V32 -> V32 : g[k] (a1,a0)=t((V32(a+k)))<<< 11 ,
Где ai ϵ V32 и ' + ' относятся к сложению по модулю 232
Шифр использует 256-битные ключи и использует итеративный дополнительный ключ для каждого раунда из родительского ключа
Начальные дополнительные ключи для раунда 1-8,9-16,17-24 K1= K255||..||K224 K2= K223||..||K192 . . . . . . . . . . . . K8= K31||.. ||K0
Заключительный раунд 25-32
Измените порядок с K8->K1 Для подведения итогов:
Раунд (1->8 (вкл.)) : MSB->LSB (32- битное разделение) ===>Фаза возрастания
Раунд (9->16 (вкл.)) : MSB->LSB (32- битное разделение) ===>Фаза возрастания
Раунд (17->24 (вкл.)) : MSB->LSB (32- битное разделение) ===>Фаза возрастания
Раунд (25->32 (вкл.)) : LSB->MSB (32- битное разделение) ===>Фаза убывания
При этом используется система шифрования Fiestel, в которой мы изначально получаем все подразделы и для удобства сводим двумерную матрицу к 1d
1.Разделяем сообщение на левое и правое (32 бита)
-
Цикл Fiestel раундов до 31 раунда
(Left,Right)= (Right,Left^g_function(Right,(key[i])))
Это неявная функция G (отличается от функции g) -
Для последнего раунда выполните
((Left^g_function(Right,(key[-1])))<<32 )^Right
Это еще одна неявная функция G* Функция, определенная в статье.
Расшифровка буквально обратная для шифрования, мы переходим от последнего раунда ко второму , применяя то же преобразование.
Для раунда 1 выполните ((Left^g_function(Right,(key[0])))<<32 )^Right