Статус: Участник
Группы: Участники
Зарегистрирован: 21.08.2009(UTC) Сообщений: 21 Откуда: Москва
|
Добрый день! Есть задача поместить ЭЦП хэша некоторых данных и сертификат, ключом которого подписан этот хэш в сообщение формата PKCS#7 (например, *.p7b). Этап формирования и подписания хэша прошел на ура, но на моменте сборки итогового файла у меня произошел затык. Если сохранять только один сертификат, то проблем нет никаких, но как к нему присоединить еще и ЭЦП -- не понимаю...
Буду очень признателен, если у кого-нибудь найдутся мысли и идеи по этому поводу. Заранее спасибо!
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 21.08.2009(UTC) Сообщений: 21 Откуда: Москва
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 21.08.2009(UTC) Сообщений: 21 Откуда: Москва
|
Внимательно изучил указанную тему, но понял, что у меня более тривиальная задача: у меня есть исходное сообщение в текстовом виде и сертификат подписанта. Следующий код создает открепленную подпись (за основу взял пример из MSDN http://msdn.microsoft.com/en-us/library/aa382372(VS.85).aspx) : Код:CRYPT_SIGN_MESSAGE_PARA SignPara;
const BYTE * rgpbToBeSigned[] = {pbContent}; //pbContent -- собственно сообщение
DWORD rgcbToBeSigned[] = {cbContent}; //cbContent -- размер сообщения
DWORD cbSignedBlob;
BYTE * pbSignedBlob;
memset(&SignPara,0,sizeof(CRYPT_SIGN_MESSAGE_PARA));
SignPara.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SignPara.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
SignPara.pSigningCert = pUserCert; //указатель на CERT_CONTEXT с сертификатом подписанта
SignPara.HashAlgorithm.pszObjId = szOID_RSA_SHA1RSA; //я не уверен, что здесь именно такой алгоритм надо использовать
SignPara.HashAlgorithm.Parameters.cbData = 0;
SignPara.pvHashAuxInfo = 0;
SignPara.cMsgCert = 1;
SignPara.rgpMsgCert = &pUserCert;
SignPara.cMsgCrl = 0;
SignPara.rgpMsgCrl = 0;
SignPara.cAuthAttr = 0;
SignPara.rgAuthAttr = 0;
SignPara.cUnauthAttr = 0;
SignPara.rgUnauthAttr = 0;
SignPara.dwFlags = NULL;
SignPara.dwInnerContentType = NULL;
if( !CryptSignMessage(&SignPara,TRUE,1,rgpbToBeSigned,rgcbToBeSigned,NULL,&cbSignedBlob) )
{
puts("Error in CryptSignMessage 1");
printf("%X\n",GetLastError());
return -100;
}
pbSignedBlob = (BYTE *)malloc(sizeof(BYTE));
if( !CryptSignMessage(&SignPara,TRUE,1,rgpbToBeSigned,rgcbToBeSigned,pbSignedBlob,&cbSignedBlob) )
{
puts("Error in CryptSignMessage 2");
printf("%X\n",GetLastError());
return -100;
}
FILE * tmp = fopen("out.p7b","wb");
fwrite(pbSignedBlob,cbSignedBlob,sizeof(BYTE),tmp);
fclose(tmp);
Проблема в том, что при проверке программой csptest я получаю следующую ошибку: Цитата:C:\Program Files\Crypto Pro\CSP>csptest -sfsign -verify -detached -in signed-data.txt -signature CMS.p7b CSP (Type:75) v3.6.5355 KC1 Release Ver:3.6.5371 OS:Windows CPU:IA32 FastCode:READY,ENABLED. An error occurred in running the program. .\signtsf.c:554:No user cert specified. Cryptocontext will be opened automaticaly. Error number 0x0 (0). Операция успешно завершена.
An error occurred in running the program. .\signtsf.c:681:Detached Signature was NOT verified
Error number 0x80091007 (2148077575). Неправильное значение хеша.
Total: SYS: 0.000 sec USR: 0.000 sec UTC: 0.031 sec [ErrorCode: 0x80091007] Что я в данной ситуации делаю неправильно? Отредактировано пользователем 31 августа 2009 г. 21:38:45(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:SignPara.HashAlgorithm.pszObjId = szOID_RSA_SHA1RSA; //я не уверен, что здесь именно такой алгоритм надо использовать Если подпись по ГОСТ, то и хэширование тоже должно быть по ГОСТ. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 21.08.2009(UTC) Сообщений: 21 Откуда: Москва
|
В качестве алгоритма хеширования пробовал указывать алгоритмы:
szOID_CP_GOST_R3411 "1.2.643.2.2.9" szOID_GostR3411_94_CryptoProParamSet "1.2.643.2.2.30.1"
Эффекта не дало, ошибка по-прежнему остается.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
А присоединенная подпись работает? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 21.08.2009(UTC) Сообщений: 21 Откуда: Москва
|
Присоедниненная подпись работает. И создается нормально и проверяется по сертификату подписанта тоже корректно. Отредактировано пользователем 1 сентября 2009 г. 16:46:50(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.01.2008(UTC) Сообщений: 671   Откуда: Йошкар-Ола Сказал «Спасибо»: 3 раз Поблагодарили: 95 раз в 68 постах
|
|
С уважением, Юрий Строжевский |
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
значит проблема где-то здесь Цитата:const BYTE * rgpbToBeSigned[] = {pbContent}; //pbContent -- собственно сообщение DWORD rgcbToBeSigned[] = {cbContent}; //cbContent -- размер сообщения попробуйте снять подпись с файла с присоединенной подписью (это можно сделать csptest при проверке) и сравнить полученный результат с signed-data.txt - они одинаковы? |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close