Pull to refresh

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

Reading time2 min
Views12K

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

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

Tags:
Hubs:
Total votes 31: ↑31 and ↓0+31
Comments16

Articles