В прошлой части я разбирался с транспортным ключевым контейнером от КриптоПро (он же PFX, PKCS12, P12). В этой статье пойдёт речь о собственном формате ключевого контейнера КриптоПро (те самые 6 файлов .key)
![Проприетарный контейнер КриптоПро Проприетарный контейнер КриптоПро](https://habrastorage.org/getpro/habr/upload_files/c82/245/7ad/c822457ad78ef906e9a5e2f1205dbe24.png)
Вообще, тема данной статьи не нова. Ещё в далёком 2016 году @shukan написал статью, в которой он предоставил программу на C, которая вытаскивала ключ для ГОСТ 34.10-2001. Чуть позже, благодаря сообществу, появилась версия и для ГОСТ 34.10-2012. Однако, пробуя запустить все эти утилиты для контейнера ГОСТ 34.10-2012 512 бит, сгенерированного в КриптоПро CSP 5.0, утилиты выдавали ошибку.
Как там всё устроено?
Файл masks.key
![](https://habrastorage.org/getpro/habr/upload_files/9d6/a7f/4c1/9d6a7f4c190a585b8a74839ab8fc9cda.png)
Содержит в себе три Octet String, которые в свою очередь являются маской ключа (32 байта для 256 бит, 64 для 512), солью для деривации пароля и контрольной суммой маски соответственно.
Файл primary.key
![](https://habrastorage.org/getpro/habr/upload_files/3f9/5f3/648/3f95f364880a296125c0b7396531ba5f.png)
Содержит зашифрованный приватный ключ (32 байта для 256 бит, 64 для 512), который после расшифровки надо разделить по модулю на поле Q эллиптической кривой ключа.
Файл header.key
![](https://habrastorage.org/getpro/habr/upload_files/a6b/8df/e28/a6b8dfe28bdccf7165afd5f128264e0f.png)
Содержит всю информацию о контейнере: Сертификат, свойства ключа, параметры эллиптической кривой и алгоритма хэширования, первые 8 байт публичного ключа, а также контрольные суммы.
Получаем приватный ключ
Для получения приватного ключа необходимо выполнить следующие шаги:
Получение ключа хранения с помощью CPKDF (CryptoPro Key Derivation Function) в которую передаётся пароль и соль из файла masks.key.
Расшифровка основного ключа с помощью ГОСТ 28147-89 (Магма) в ECB режиме с параметрами набора Z от ТК-26
Деление по модулю расшифрованного ключа на маску
Подстановка результата в ASN.1 конструкцию приватного ключа
Также хочу выразить особую благодарность @L11R за его код для ГОСТ 34.10-2001, который лёг в основу моей программы.
Всем спасибо за внимание!