Передо мной стоит задача реализации высокоуровневых функций шифрования, аналогичные функциям CryptEncryptMessage/СryptDecrypMessage, через низкоуровневые функции CryptEncrypt/CryptDecrypt.
Задача состоит в следующем:
1. Реализовать функцию myCryptEncryptMessage. Зашифровать данные с помощью myCryptEncryptMessage и расшифровать с использованием СryptDecrypMessage. В результате получить исходные данные.
2. Реализовать функцию myCryptDecryptMessage. Зашифровать данные с помощью CryptEncryptMessage и расшифровать с использованием myCryptDecryptMessage.
Собственно я установил демо-версию КриптоПро CSP 4.0 для OS Linux x64.
Шифрование и дешифрование данных, через указанные CryptEncryptMessage/СryptDecrypMessage функции, корректно работает.
Алгоритм реализации функции myCryptEncryptMessage достаточно прозрачен:
1. Получаем контекст криптопровайдера.
2. Генерируем сессионный ключ
3. Импортируем открытый ключ получателя зашифрованного сообщения из сертификата
4. Производим шифрование данных с помощью сессионного ключа
5. Зашифровываем сессионный ключ с помощью открытого ключа получателя зашифрованного сообщения
6. Получаем BLOB сессионного ключа и BLOB открытого ключа для замены необходимых частей структуры PKCS#7 enveloped-data
Непосредственно саму структуру PKCS#7 я получил с использованием CryptEncryptMessage
В качестве основы решения я опирался на пример:
https://cpdn.cryptopro.r...example_EncryptFile.htmlПри данной реализации, функция должна отрабатывать без доступа к ключевому контейнеру отправителя зашифрованного сообщения и на выходе должен получаться PKCS#7 с соответствующими данными, такой что при передаче в функцию CryptDecryptMessage, на выходе должны получиться исходные данные.
Но при такой реализации возникают следующие проблемы, собственно которые я и хотел уточнить:
1. Ошибка при экспортировании(шифровании) сессионного ключа (NTE_BAD_KEY_STATE).
hKey = CryptGenKey(key_params); // флаг CRYPT_EXPORTABLE выставлен!
hPubKey = CryptImportPublicKeyInfo(recipient_certificate);
pbKeyData = CryptExportKey(hKey, hPubKey, SIMPLEBLOB);
(Обсуждение этой проблемы я нашел тут
https://www.cryptopro.ru...ro/forum/view.asp?q=955)2. Не совсем понятно какие части необходимо заменять в стуктуре PKCS#7. Я пробовал по примеру (https://www.cryptopro.ru/forum2/default.aspx?g=posts&t=2987), но к сожалению результат аналогичный
Собственно если существует возможность решить данную задачу, то прошу вас подсказать мне место, где я допустил ошибку. Если на практике эта задача не выполнима, то напишите по каким причинам. Заранее спасибо.