Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline shadom  
#1 Оставлено : 2 ноября 2009 г. 13:46:26(UTC)
shadom

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.10.2009(UTC)
Сообщений: 6
Откуда: Ульяновск

Здравствуйте.

Есть скрипт на С# который создает хеш переданной ему строки через 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 передаю имя контейнера указанное для сохранения секретного ключа при получении тестового сертификата КриптоПро.

Помогите, пожалуйста разобраться в чем проблема.Pray

Вот код функции которая создает хеш


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;
Offline Челпанов А.  
#2 Оставлено : 2 ноября 2009 г. 15:04:19(UTC)
Челпанов А.

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
Код:
if (CryptAcquireContext(out hCryptoProvider, CONTEINER, null, 71, 0)) { 

71 - это старый ГОСТ на подпись, у ГОСТ Р 34.10-2001 константочка 75.
С уважением, Александр.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.