[#] Читаем контейнер закрытого ключа КриптоПро средствами OpenSSL
habrabot(difrex,1) — All
2016-01-16 01:00:06


Речь пойдет о файлах primary.key, masks.key и header.key, которые лежат в директории ххххх.000 на флешке. Данные файлы входят в состав криптоконтейнера закрытого ключа электронной подписи криптопровайдера КриптоПро, формат которого нигде не опубликован. Целью данной статьи является чтение контейнера и преобразование закрытого ключа в формат, который может быть прочитан в библиотеке OpenSSL. Долгое время было распространено ошибочное суждение, что достаточно сделать нечто вида (primary\_key XOR masks\_key) и мы получим закрытый ключ в чистом (raw) виде, однако забегая вперед, можно утверждать, что в КриптоПро было применено более сложное преобразование, в худшем случае состоящее из более чем 2000 (двух тысяч) операций хеширования. Стоит упомянуть о существовании утилиты [P12FromGostCSP][1] которая позволяет конвертировать ключ в формат P12, доступный для работы с OpenSSL, но утилита имеет следующие существенные недостатки:

* Читает контейнер не напрямую, а через криптопровайдер, поэтому там, где кроме OpenSSL ничего нет, не работает.
* Если в свойствах ключа не отмечено, что ключ «экспортируемый», то конвертировать его невозможно.
* В демо версии не формирует файл с ключом, эта возможность присутствует только в платной версии.



# Файл primary.key

Содержит 32 байта ключа в формате Asn1. Это только половина ключа, полный ключ получается при делении этого числа по модулю Q на маску. Поле, хранящее модуль Q в библиотеке OpenSSL имеет название order. Маска лежит в файле masks.key ![primary.key][2] [Читать дальше →][3]

[1]: http://soft.lissi.ru/downloads/
[2]: https://habrastorage.org/files/0aa/ee2/1ef/0aaee21ef1774fd790b79cdaa1aa6bf3.png
[3]: http://habrahabr.ru/post/275039/#habracut