Здравствуйте.
Есть скрипт на С# который создает хеш переданной ему строки через POST в кодировке UTF-8, в качестве строки передается часть XML- документа.
Полученный хеш используется для подписания SOAP запроса, при отсылке запроса сервису, возвращается ошибка о неправильности цифровой подписи.
Вот требования предоставляемые сервисом:
ЭЦП формируется согласно требованиям ГОСТ Р 34.10-2001 ("Информационная технология. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи.") и ГОСТ Р 34.11-94 ("Информационная технология. Криптографическая защита информации. Функция хеширования."). ЭЦП представляет собой строку, закодированную в BASE64 (RFC3548).
Работаю на сборке КриптоПро 3.0 + Net Framework 3.6 + Windows 2003.
Значение константы CERT_ALG_ID=32798, в качестве CONTEINER передаю имя контейнера указанное для сохранения секретного ключа при получении тестового сертификата КриптоПро.
Помогите, пожалуйста разобраться в чем проблема.
Вот код функции которая создает хеш
string retVal = "";
IntPtr hCryptoProvider = IntPtr.Zero;
IntPtr hPubKey = IntPtr.Zero;
IntPtr hHash = IntPtr.Zero;
if (CryptAcquireContext(out hCryptoProvider, CONTEINER, null, 71, 0)) {
CryptGetUserKey(hCryptoProvider, 2, ref hPubKey);
CryptCreateHash(hCryptoProvider, (uint)CERT_ALG_ID, IntPtr.Zero, (uint)0, out hHash);
Encoding encoding = Encoding.GetEncoding(System.Text.Encoding.UTF8.HeaderName);
byte[] buffer = encoding.GetBytes(body);
CryptHashData(hHash, buffer, buffer.Length, 0);
uint signatureLength = 0;
CryptSignHash(hHash, (uint)2, null, 0, null, ref signatureLength);
byte[] signature = new byte[signatureLength];
CryptSignHash(hHash, 2, null, 0, signature, ref signatureLength);
retVal = System.Convert.ToBase64String(signature, 0, (int)signatureLength);
if (IntPtr.Zero != hHash){ CryptDestroyHash(hHash); }
if (IntPtr.Zero != hPubKey){ CryptDestroyKey(hPubKey); }
if (IntPtr.Zero != hCryptoProvider){ CryptReleaseContext(hCryptoProvider, 0); }
return retVal;