Речь пойдет о 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 байта) - имитовставка для проверки правильности расшифровки. А также параметры шифра, и алгоритм хэширования.
Читаем контейнер
Небольшое пояснение.
Основная работа разделена на 5 этапов
Снятие транспортной кодировки посредством вычисления хэша по комбинации (пароль/результат прошлого раунда + соль + четырех значный номер раунда) и дешифровки по ГОСТ 28147-89 с указанием IV полученной ранее
Определение алгоритма ключа по заголовку блоба
Деривация ранее полученного хэша через функцию
KDF_GOSTR3411_2012_256
Снятие экспортного шифрования, посредством указания результата функции в качестве ключа
Конвертирование в PEM
Всем спасибо за внимание. Это моя первая статья на Хабре!
Комментарии (7)
AEP
16.10.2022 23:38В свое время воспользовался https://github.com/garex/nodejs-gost-crypto. Не уверен, что сейчас это работает.
ilkman
18.10.2022 13:18-1Не экспортируется сертификат ни в pfx, ни копируется никуда. Уже давно. Ключи не экспортируемые выдают
li0ard Автор
18.10.2022 13:52Вы так уверены? Я получал ключ в сентябре, в УЦ Такском, все спокойно экспортируется. Если вы про ФКН то там да.
ilkman
18.10.2022 20:28Сертификаты руководителям начали выдавать только в ФНС. Не знаю, что такое ФКН. так вот эти сертификаты неэкспортируемые. Видимо были преценденты распространения. Поэтому PFX потерял смысл, либо ваш сценарий предполагает какие то другие сертификаты, смысл которых мне не понятен (не авторизация на вебпорталах, подписывание документов)
stargrave2
Исходный код PyGOST имеет различные тестовые примеры, масса которых взята из ТК26 документов. Среди них есть и PFX-контейнер, полностью разбираемый и дешифруемый: http://www.git.cypherpunks.ru/?p=pygost.git;a=blob;f=pygost/test_pfx.py
Для работы с ASN.1 использует куда более лучшую (по моему) библиотеку PyDERASN (https://habr.com/ru/post/444272/), которая и проще в использовании и в PyGOST многие схемы (пускай и не полные, но достаточные для обработки тестовых примеров ТК26) для неё приложены.
li0ard Автор
Очень приятно видеть автора PyGost и PyDERASN. Данная версия моего кода это скорее образец чем готовая программа, и понятное дело я буду улучшать. Посмотрел ваши примеры, там не совсем то что у меня (по моему мнению), насчет PyDERASN - скорее всего буду использовать её, когда буду переписывать код :)