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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Tora-Bora  
#1 Оставлено : 10 сентября 2009 г. 19:21:48(UTC)
Tora-Bora

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

Группы: Участники
Зарегистрирован: 10.09.2009(UTC)
Сообщений: 4

Есть кусок кода, который должен подписывать сообщение, начинается со строчки
bool result = win32.CryptAcquireContext(out hCryptoProvider, _container, null, 71, 0);
так вот result=false и ошибка 0x80090017, описание: "Тип поставщика не определен"

У меня vista, пробовал на соседнем компе с КриптоПро 3.0, там все работает.

А еще я пробовал, цифру 75:
bool result = win32.CryptAcquireContext(out hCryptoProvider, _container, null, 75, 0);
работает! Но подпись в результате получается не правильная.

Я так понимаю что нету 71 типа провайдера.

Код на C# использует функции win32 библиотеки advapi32.dll, Crypt32.dll



Offline Татьяна  
#2 Оставлено : 10 сентября 2009 г. 19:36:11(UTC)
Татьяна

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.02.2008(UTC)
Сообщений: 1,491
Откуда: Крипто-Про

Поблагодарили: 40 раз в 37 постах
В 3.6 нет криптопровайдера с типом 71. Он был исключен из продукта, поскольку ГОСТ, по которому он работает, выведен из действия 1-го января 2008-го года.
Татьяна
ООО Крипто-Про
Offline Tora-Bora  
#3 Оставлено : 11 сентября 2009 г. 1:46:20(UTC)
Tora-Bora

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

Группы: Участники
Зарегистрирован: 10.09.2009(UTC)
Сообщений: 4

Спасибо!
Хмм, а почему если я использую тип 75, мою подпись не могут проверить? То-есть все в коде я оставил по-старому, только поменял цифру на 75, подпись сформировалась без ошибок, но сервер отвечает: неверная подпись. Может такое быть, что сервер использует тип 71 и поэтому не может проверить мою подпись?
Offline Максим Коллегин  
#4 Оставлено : 11 сентября 2009 г. 3:16:13(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,390
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 714 раз в 619 постах
Должно работать.

Отредактировано пользователем 11 сентября 2009 г. 3:33:41(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке
Offline Tora-Bora  
#5 Оставлено : 11 сентября 2009 г. 16:21:42(UTC)
Tora-Bora

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

Группы: Участники
Зарегистрирован: 10.09.2009(UTC)
Сообщений: 4

Хорошо.
А подскажите еще, может другие идентификаторы надо изменить. Дело в том, что мне дали исходники, а там вместо enum'ов цифры указаны, а что они означают и где их взяли непонятно.
AT_SIGNATURE = 2
CERT_ALG_ID = 32798
win32.CryptGetUserKey(hCryptoProvider, win32.AT_SIGNATURE, ref hPubKey);
win32.CryptCreateHash(hCryptoProvider, (uint)CryptoPro.CERT_ALG_ID, IntPtr.Zero, (uint)0, out hHash);

что вот за AT_SIGNATURE и что за CERT_ALG_ID? Может какой алгоритм другой указать?

Вобщем вот весь код подписи:

IntPtr hCryptoProvider = IntPtr.Zero;
IntPtr hPubKey = IntPtr.Zero;
IntPtr hHash = IntPtr.Zero;

try
{
win32.CryptAcquireContext(out hCryptoProvider, _container, null, CryptoPro.TYPE, 0);
win32.CryptGetUserKey(hCryptoProvider, win32.AT_SIGNATURE, ref hPubKey);
win32.CryptCreateHash(hCryptoProvider, (uint)CryptoPro.CERT_ALG_ID, IntPtr.Zero, (uint)0, out hHash);

Encoding encoding = Encoding.GetEncoding(encodingHeaderName);
byte[] buffer = encoding.GetBytes(body);
win32.CryptHashData(hHash, buffer, buffer.Length, 0);

uint signatureLength = 0;
win32.CryptSignHash(hHash, (uint)win32.AT_SIGNATURE, null, 0, null, ref signatureLength);

byte[] signature = new byte[signatureLength];
win32.CryptSignHash(hHash, win32.AT_SIGNATURE, null, 0, signature, ref signatureLength);

retVal = System.Convert.ToBase64String(signature, 0, (int)signatureLength);
Offline Максим Коллегин  
#6 Оставлено : 11 сентября 2009 г. 16:39:24(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,390
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 714 раз в 619 постах
Нормальные идентификаторы: первый определен в wincrypt.h, второй - в wincryptex.h
Цитата:
CALG_GR3411

Может проблемы с конвертированием в base64?

Отредактировано пользователем 11 сентября 2009 г. 16:40:50(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в техподдержке
Offline Tora-Bora  
#7 Оставлено : 11 сентября 2009 г. 18:32:33(UTC)
Tora-Bora

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

Группы: Участники
Зарегистрирован: 10.09.2009(UTC)
Сообщений: 4

Да, дело не в криптопровайдере. Сейчас поставил на другую систему CryptoPro 2.0, и с 71 криптопровайдером тоже создается подпись, но результат тот-же самый, ошибка проверки подписи. А подпись ответа нормально проверяется и свою подпись я тоже нормально проверяю, буду трясти техподдержку сервака...
Offline Roberto1  
#8 Оставлено : 5 марта 2012 г. 18:00:03(UTC)
Roberto1

Статус: Участник

Группы: Участники
Зарегистрирован: 12.01.2012(UTC)
Сообщений: 19
Откуда: Kazan RF

Добрый день, делаю тот же алгоритм что описал Tora-Bora выше.
на сточке 1-ой строчке CryptSignHash падает:
Код:
                uint signatureLength = 0;
                if (!Crypt32Wrapper.CryptSignHash(hHash, Crypt32Wrapper.AT_KEYEXCHANGE, null, 0, null, ref signatureLength))


Ошибка:
CryptSignHash (1) returns false!!! error = [-2146893802] message = [Набор ключей не существует]"

В чем может быть проблема? Куда капать.


Алгоритм рабочий для типа криптопровайдера 71, переделываю на 75.
пока столкнулся только с тем что
Код:
int code = Crypt32Wrapper.CryptGetUserKey(hCryptoProvider, Crypt32Wrapper.AT_SIGNATURE, ref hPubKey);

возвращает не 0 как раньше а 1, с текстом операция успешно завершена.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.