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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline KoGen  
#1 Оставлено : 24 января 2011 г. 19:43:04(UTC)
KoGen

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

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

Доброго времени суток!

Заранее прошу извинить, если с данным вопросом уже обращались, но в поиске не нашел, а с КриптоПро и криптографией вообще раньше не работал

Подписать текстовое сообщение (файл, xml). Есть сертификат + закрытый ключ на Rutoken`е
Версия КриптоПро 3.6.4071 КС1 (3.6.5236)


вызываю

HCRYPTPROV hProv = 0;
hProv = GetAcquireContext(hProv, SelectCertificate());
GetHash(hProv);



функция SelectCertificate() - отдает имя контейнера (выбираю из диалога сертификат, из его свойств получаю имя контейнера с закрытым ключом)
LPCTSTR SelectCertificate()

функцией GetAcquireContext(..) - получаю контекст криптопровайдера (появляется диалог выбора рутокена и ввода пина), возвращает hprov отдличный от 0

HCRYPTPROV GetAcquireContext(HCRYPTPROV hProv, LPCTSTR aContainer) {
if(CryptAcquireContext(&hProv, aContainer, NULL, 75, 0)) {
printf("CSP context acquired.\n");
return hProv;
}
else {
printf("CSP context not acquired.\n");
return hProv;
}
}


далее пытаюсь подписать данные как в примере на сайте


static HCRYPTHASH hHash = 0;
static BYTE *pbSignature = NULL;
BYTE *pbBuffer = (BYTE *)"The data that is to be hashed and signed";
DWORD dwBufferLen = (DWORD)(strlen((char *)pbBuffer) + 1);
DWORD dwSigLen = 0;
FILE *signature;

if (CryptCreateHash(hProv, CALG_GR3411, 0, 0, &hHash))
printf("Hash object created. \n");
else
MyHandleError(TEXT("Error during CryptCreateHash"));

if (CryptHashData(hHash, pbBuffer, dwBufferLen, 0))
printf("The data has been hashed.\n");
else
MyHandleError(TEXT("Error during CryptHashData"));

dwSigLen = 0;
if (CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, 0, &dwSigLen))
printf("Signature length %d found.\n", dwSigLen);
else
MyHandleError(TEXT("Error during CryptSignHash"));

pbSignature = (BYTE *)malloc(dwSigLen);
if (!pbSignature)
MyHandleError(TEXT("pbSignature: out of memory"));

if (CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, pbSignature, &dwSigLen))
printf("pbSignature is the hash signature.\n");
else
MyHandleError(TEXT("Error during CryptSignHash."));

if (!(signature = fopen("signature.txt", "w+b")))
MyHandleError(TEXT("Problem opening the file signature.txt\n"));
fwrite(pbSignature, 1, dwSigLen, signature);

if (hHash) CryptDestroyHash(hHash);


программа выпадает с ошибкой " Error number 80090016 " на вызове функции CryptSignHash(..).
Причем, явно видно, что при выполнении этой функции происходит обращение к ключу (моргает прилично по времени),
а затем возвращается данный код с ошибкой.

В чём может быть проблема?
Offline Kirill Sobolev  
#2 Оставлено : 24 января 2011 г. 19:53:10(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
//
// MessageId: NTE_BAD_KEYSET
//
// MessageText:
//
// Keyset does not exist
//
#define NTE_BAD_KEYSET _HRESULT_TYPEDEF_(0x80090016L)

Похоже в контейнере нет ключа подписи, попробуйте AT_KEYEXCHANGE вместо AT_SIGNATURE.
Техническую поддержку оказываем тут
Наша база знаний
Offline KoGen  
#3 Оставлено : 24 января 2011 г. 19:58:20(UTC)
KoGen

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

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

Также использовал консольную утилиту cryptcp.exe
Вызывал с параметрами
E:\projects\eds\lib - old\Debug>cryptcp.exe -sign -f C:\2.cer signature.txt sign.txt.sign -nochain // подпись
E:\projects\eds\lib - old\Debug>cryptcp.exe -verify -f c:\2.cer sign.txt.sign 1.txt -nochain // верификация

консольная утилита отрабатывает, значит, что-то в тестовом примере мною сделано не правильно!
Offline KoGen  
#4 Оставлено : 24 января 2011 г. 20:00:31(UTC)
KoGen

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

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

да, помогло,
полез курить msdn дальше
спасибо!
Offline KoGen  
#5 Оставлено : 24 января 2011 г. 20:14:15(UTC)
KoGen

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

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

Правильно ли я понимаю,

что полученный результат и будет ЭЦП,
принадлежащей пользователю (определяется сертификатом) и подписанный закрытым ключом (контейнер в Rutoken`е) ?
Offline Kirill Sobolev  
#6 Оставлено : 24 января 2011 г. 21:13:24(UTC)
Кирилл Соболев

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

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

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