Речь пойдет о 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 этапов

  1. Снятие транспортной кодировки посредством вычисления хэша по комбинации (пароль/результат прошлого раунда + соль + четырех значный номер раунда) и дешифровки по ГОСТ 28147-89 с указанием IV полученной ранее

  2. Определение алгоритма ключа по заголовку блоба

  3. Деривация ранее полученного хэша через функцию KDF_GOSTR3411_2012_256

  4. Снятие экспортного шифрования, посредством указания результата функции в качестве ключа

  5. Конвертирование в PEM

Всем спасибо за внимание. Это моя первая статья на Хабре!

Комментарии (7)


  1. stargrave2
    16.10.2022 19:43
    +3

    Исходный код 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) для неё приложены.


    1. li0ard Автор
      16.10.2022 19:54
      +3

      Очень приятно видеть автора PyGost и PyDERASN. Данная версия моего кода это скорее образец чем готовая программа, и понятное дело я буду улучшать. Посмотрел ваши примеры, там не совсем то что у меня (по моему мнению), насчет PyDERASN - скорее всего буду использовать её, когда буду переписывать код :)


  1. AEP
    16.10.2022 23:38

    В свое время воспользовался https://github.com/garex/nodejs-gost-crypto. Не уверен, что сейчас это работает.


  1. MaxKozlov
    17.10.2022 14:55
    +1

    4D414731 - признак ГОСТ 28147-89

    MAG1 (он же "Магма") 


  1. ilkman
    18.10.2022 13:18
    -1

    Не экспортируется сертификат ни в pfx, ни копируется никуда. Уже давно. Ключи не экспортируемые выдают


    1. li0ard Автор
      18.10.2022 13:52

      Вы так уверены? Я получал ключ в сентябре, в УЦ Такском, все спокойно экспортируется. Если вы про ФКН то там да.


      1. ilkman
        18.10.2022 20:28

        Сертификаты руководителям начали выдавать только в ФНС. Не знаю, что такое ФКН. так вот эти сертификаты неэкспортируемые. Видимо были преценденты распространения. Поэтому PFX потерял смысл, либо ваш сценарий предполагает какие то другие сертификаты, смысл которых мне не понятен (не авторизация на вебпорталах, подписывание документов)