Добрый день, мне нужно зашифровать файл по ГОСТ 28147 и вложить его внутрь SOAP запроса в виде такой структуры:
Код:<EncryptedData xmlns="http://www.w3.org/2001/04/xmlenc#" Type="http://www.w3.org/2001/04/xmlenc#Element">
<EncryptionMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gost28147"/>
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001"/>
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<X509Data>
<X509Certificate>X509CERT</X509Certificate>
</X509Data>
</KeyInfo>
<CipherData>
<CipherValue>CIPHER_KEY</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>CIPHER_DATA</CipherValue>
</CipherData>
</EncryptedData>
В наличие есть файл, сертификат получателя установленный в системе и сертификат отправителя c закрытым ключом установленный в криптоконтейнер.
Алгоритм шифрования примерно такой:
CryptAcquireContext - Получаем контекст криптопровайдера hProv
открываем сертификат получателя и получаем контекст сертификата получателя CERT_CONTEXT
CryptImportPublicKeyInfo - Получаем открытый ключ получателя hPublicKey
CryptExportKey(hPublicKey, 0, PUBLICKEYBLOB, 0 - экспортируем ключ получателя в блоб pbKeyBlob
CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hSenderKey) - Получаем закрытый ключ отправителя hSenderKey
CryptImportKey(hProv, pbKeyBlob, dwBlobLen, hSenderKey, 0, &hAgreeKey) - Получаем ключ согласования hAgreeKey из ключа отправителя и блоба с открытым ключом получателя
CryptGenKey(hProv, CALG_G28147, CRYPT_EXPORTABLE, &hSessionKey) - Генерируем сессионный ключ hSessionKey
CryptExportKey(hSessionKey, hAgreeKey, SIMPLEBLOB, 0, pbKeyBlobSimple, &dwBlobLenSimple) Шифруем сессионный ключ на ключе согласования hAgreeKey
CryptEncrypt(hSessionKey, 0, TRUE, 0, pbContent, &cbContent, bufLen) - Шифруем данные pbContent сессионным ключом
Правильно ли я понимаю, что в X509CERT передаем сертификат отправителя, в CIPHER_KEY передаем шифрованный сессионный ключ pbKeyBlobSimple, а в CIPHER_DATA - зашифрованные данные pbContent?
Не упускаю ли я чего-то?