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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline KsandrFreeman  
#1 Оставлено : 29 января 2014 г. 12:08:18(UTC)
KsandrFreeman

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

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

Сказал(а) «Спасибо»: 1 раз
Доброго времени суток!

Возникли проблемы с подписью. Первый же вызов функции CryptSignHash возвращает 0x80090016. Keyset does not exist. Ключи храню в реестре, запускаю с правами администратора.
Не подскажете, что я делаю не так?

int main()
{
#pragma region _Init Var_
PCHAR pcData = "Test Sring";
DWORD dwLen = strlen(pcData);
#pragma endregion
// Получение контекста криптопровайдера
if ( !CryptAcquireContext (&hProv, "{Cont4Sign4}", "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", 80, CRYPT_NEWKEYSET ) )
{
if ((gle = GetLastError()) == NTE_EXISTS)
{
if ( !CryptAcquireContext (&hProv, "{Cont4Sign4}", "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", 80, 0 ) )
{
ErrorHandle("CryptAcquireContext failed", 2, 1);
}
}
else
{
ErrorHandle("CryptAcquireContext failed", 2, 1);
}
}
LOG("CryptAcquireContext");

// Ключ.
if (!CryptGenKey(hProv, AT_SIGNATURE, 512<<16|CRYPT_EXPORTABLE , &hKey))
{
ErrorHandle("CryptGenKey failed", 1, 1);
}
LOG("CryptGenKey");

// Хэш
if (!CryptCreateHash(hProv, 0x8022, 0, 0, &hHash))
{
ErrorHandle("CryptCreateHash", 1, 1);
}
LOG("CryptCreateHash");

// Подпись
if (!CryptSignHash(hHash, 0xaa42, NULL, 0, NULL, &dwLen))
{
ErrorHandle("CryptSignHash", 1, 1);
}
LOG("CryptSignHash");
printf("dwLen %i\n", dwLen);
Sign = (PBYTE)malloc(dwLen);

if (!CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, Sign, &dwLen))
{
ErrorHandle("CryptSignHash", 1, 1);
}
LOG("CryptSignHash");

system("PAUSE");
return EXIT_SUCCESS;
}
Online Андрей Писарев  
#2 Оставлено : 29 января 2014 г. 12:15:30(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,281
Мужчина
Российская Федерация

Сказал «Спасибо»: 548 раз
Поблагодарили: 2196 раз в 1714 постах
А зачем с правами администратора?
А вместо AT_SIGNATURE - AT_KEYEXCHANGE?
Техническую поддержку оказываем тут
Наша база знаний
Offline KsandrFreeman  
#3 Оставлено : 29 января 2014 г. 12:31:00(UTC)
KsandrFreeman

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

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

Сказал(а) «Спасибо»: 1 раз
В одной из веток форума было что-то про разрешение доступа к реестру. Просто уже не знаю, где в паре строк ошибка.
С AT_KEYEXCHANGE та же ошибка (если заменять в CryptGenKey). Ну а если в CryptSignHash - 0x80090008 - неверный алгоритм.
Offline KsandrFreeman  
#4 Оставлено : 29 января 2014 г. 14:03:54(UTC)
KsandrFreeman

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

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

Сказал(а) «Спасибо»: 1 раз
Случилось чудо. Алгоритм должен быть 0x8021. То бишь 256 бит. И ставить везде AT_SIGNATURE. Почему алгоритм хеширования должен быть 256 бит?
Offline Максим Коллегин  
#5 Оставлено : 29 января 2014 г. 14:12:40(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
Алгоритм хэширования должен соответствовать длине ключа- так написано в ГОСТ.
Знания в базе знаний, поддержка в техподдержке
Offline KsandrFreeman  
#6 Оставлено : 29 января 2014 г. 14:48:24(UTC)
KsandrFreeman

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

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

Сказал(а) «Спасибо»: 1 раз
То есть когда я указываю CryptGenKey(hProv, AT_SIGNATURE, 512<<16|CRYPT_EXPORTABLE , &hKey), то всё равно создаётся ключ 256?
Offline Максим Коллегин  
#7 Оставлено : 29 января 2014 г. 15:59:52(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 715 раз в 620 постах
Создаваемый ключ определяется типом криптопровайдера. А 512 бит в данном случае - длина открытого ключа.
Знания в базе знаний, поддержка в техподдержке
Offline KsandrFreeman  
#8 Оставлено : 29 января 2014 г. 18:14:22(UTC)
KsandrFreeman

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

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

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