КриптоПро и VipNet предоставляют библиотеки, реализующий интерфейс MS CryptoAPI.
Есть XML, в ней указан алгоритм шифрования urn:ietf:params:xml:ns:cpxmlsec:algorithms:gost28147
и алгоритм согласования ключей urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001
Сессионный ключ вроде получилось разобрать/импортировать:.
// Получение дескриптора криптопровайдера
CryptAcquireContext(&hProv, __CONTAINER_NAME__,NULL,PROV_GOST_2001_DH,0);
// Получение дескриптора закрытого ключа получателя.
CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hKey);
// Получение ключа согласования импортом эфемерального ключа отправителя
// на открытом ключе получателя.
CryptImportKey(hProv, bEphemeralPublicKeySimple, 100, hKey, 0, &hAgreeKey);
// Установление алгоритма ключа согласования
ALG_ID alg = CALG_SIMPLE_EXPORT; // алгоритм ключа согласования
CryptSetKeyParam(hAgreeKey, KP_ALGID, (LPBYTE)&alg, 0);
// Получение сессионного ключа импортом зашифрованного сессионного ключа
// на ключе Agree.
CryptImportKey(hProv,pbKeyBlobSimple,dwBlobLenSimple,hAgreeKey,0,&hSessionKey);
Проблема в самой расшифровке:
CryptDecrypt(hSessionKey, 0, bFinal, 0, pbContent, &cbContent);
Функция отрабатывает без ошибок, но результат и близко не похож на исходное сообщение.
Кто-нибудь сталкивался с этим?