Читаем ключевой контейнер КриптоПро
Речь пойдет о PFX, который можно экспортировать из КриптоПро, как бы все хорошо, но данный контейнер нельзя использовать в OpenSSL и в других криптографических средствах из-за некой PBE с OID 1.2.840.113549.1.12.1.80.
Также есть известная утилита P12FromGostCSP, она действительно работает, но у нее есть минусы, а именно:
Иногда стоит больше чем сам сертификат
Работает напрямую через Microsoft CryptoAPI соответственно не принимая на вход PFX
Отсутствие кроссплатформенности, что особенно огорчило меня
И как уже говорил @shukan в демоверсии не дает сохранить результат, зачем тогда демоверсия вообще
Транспортная кодировка (Та самая PBE)
Является шифром ГОСТ 28147–89 (он же «Магма») в CFB режиме, и функцией хэширования ГОСТ 34.11–94 с перестановочными значениями (SBOX) от КриптоПро. В ASN1 структуре идет соль, количество итерация хэширования, и шифрованная структура ключа. После расшифровки получаем ключевой блоб.
Ключевой блоб
Содержит заголовок и ASN структуру шифрованного приватного ключа.
Пример заголовка: 0720000042AA00004D41473140000000
. Из него можно получить следующую информацию
07
— Приватный ключ42АА
— Ключ по ГОСТ 2012 года, 512 бит (46АА — 256 бит)4D414731
— признак ГОСТ 28147–89, в чем суть я так и не понял
Следом идет структура экспортного шифрования.
Экспортное шифрование
Экспортное шифрование или же алгоритм CALG_PRO12_EXPORT
— последний рубеж к значению приватного ключа. Состоит из наборов значений, таких как: UKM (8 байт) — вектор инициализации Магмы, CEK_ENC (64 байта в 512 бит, 32 байта в 256 бит) — шифрованное значение ключа, CEK_MAC (4 байта) — имитовставка для проверки правильности расшифровки. А также параметры шифра, и алгоритм хэширования.
Читаем контейнер
Программа на Github.
Небольшое пояснение.
Основная работа разделена на 5 этапов
Снятие транспортной кодировки посредством вычисления хэша по комбинации (пароль/результат прошлого раунда + соль + четырех значный номер раунда) и дешифровки по ГОСТ 28147–89 с указанием IV полученной ранее
Определение алгоритма ключа по заголовку блоба
Деривация ранее полученного хэша через функцию
KDF_GOSTR3411_2012_256
Снятие экспортного шифрования, посредством указания результата функции в качестве ключа
Конвертирование в PEM
Всем спасибо за внимание. Это моя первая статья на Хабре!