Читаем ключевой контейнер КриптоПро

Речь пойдет о 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 структуре идет соль, количество итерация хэширования, и шифрованная структура ключа. После расшифровки получаем ключевой блоб.

20df32d6aed033127a8256197072200e.png

Ключевой блоб

Содержит заголовок и ASN структуру шифрованного приватного ключа.

Пример заголовка: 0720000042AA00004D41473140000000. Из него можно получить следующую информацию

  • 07 — Приватный ключ

  • 42АА — Ключ по ГОСТ 2012 года, 512 бит (46АА — 256 бит)

  • 4D414731 — признак ГОСТ 28147–89, в чем суть я так и не понял

Следом идет структура экспортного шифрования.

fbd201d3f460d34410364640040cd5d1.png

Экспортное шифрование

Экспортное шифрование или же алгоритм CALG_PRO12_EXPORT — последний рубеж к значению приватного ключа. Состоит из наборов значений, таких как: UKM (8 байт) — вектор инициализации Магмы, CEK_ENC (64 байта в 512 бит, 32 байта в 256 бит) — шифрованное значение ключа, CEK_MAC (4 байта) — имитовставка для проверки правильности расшифровки. А также параметры шифра, и алгоритм хэширования.

bf1154609e37597de8d2513b4006db17.png

Читаем контейнер

Программа на Github.

Небольшое пояснение.

Основная работа разделена на 5 этапов

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

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

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

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

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

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

© Habrahabr.ru