Как стать автором
Обновить

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

Уровень сложностиСредний
Время на прочтение2 мин
Количество просмотров14K

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

Транспортная кодировка
Транспортная кодировка

Ключевой blob

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

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

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

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

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

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

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

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

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

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

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

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

Программа на Go

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

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

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

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

  4. Расшифровка CEK_ENC с помощью ГОСТ 28147-89 в ECB режиме используя в качестве ключа результат функции деривации

  5. Подстановка в ASN.1 структуру и конвертирование в PEM

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

Теги:
Хабы:
Всего голосов 31: ↑31 и ↓0+31
Комментарии16

Публикации

Истории

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн