Статус: Активный участник
Группы: Участники
Зарегистрирован: 08.07.2009(UTC) Сообщений: 31
|
День добрый, суть задачи в том чтобы не привязываясь к конкретному крипто провайдеру реализовать ЭЦП по имеющемуся сертификату. Застрял на выборе алгоритма хэширования, почитал форум, вроде понял как реализовать, но все равно возникла проблема Вот код Delphi: Цитата:function TFSCryptoCertificates.CertContextToSignAlgorithms(ipCertContext:PCCERT_CONTEXT; var oHashAlg, oSignAlg:ALG_ID):boolean; var cHashAlgorithms:array of ALG_ID; vKeyAlgorithm:array [1..2] of ALG_ID; vKeyOIDInfo:PCRYPT_OID_INFO; vInd:integer; const cHashAlgCount=5; begin //Инициализируем структуру алгоритмов хэширования, которые будут перебираться SetLength(cHashAlgorithms, cHashAlgCount); cHashAlgorithms[0]:=CALG_SHA1; cHashAlgorithms[1]:=CALG_MD5; cHashAlgorithms[2]:=CALG_MD4; cHashAlgorithms[3]:=CALG_MD2; cHashAlgorithms[4]:=CALG_MAC; //Структура перебора хэш функций создана Result:=false; oHashAlg:=0; oSignAlg:=0; vKeyOIDInfo:=nil; vKeyAlgorithm[2]:=CertOIDToAlgId(ipCertContext.pCertInfo.SubjectPublicKeyInfo.Algorithm.pszObjId); //Если алгоритм подписи RSA то сразу переключаемся на хэширование SHA1 if vKeyAlgorithm[2]=CALG_RSA_KEYX then begin oHashAlg:=CALG_SHA1; oSignAlg:=vKeyAlgorithm[2]; Result:=true; Exit; end; //А теперь перебираем алгоритмы хэширования и пробуем найти нужный for vInd:=0 to cHashAlgCount do begin vKeyAlgorithm[1]:=cHashAlgorithms[vInd]; vKeyOIDInfo:=CryptFindOIDInfo(CRYPT_OID_INFO_SIGN_KEY, @vKeyAlgorithm, CRYPT_SIGN_ALG_OID_GROUP_ID); if Assigned(vKeyOIDInfo) then begin oHashAlg:=vKeyAlgorithm[1]; oSignAlg:=vKeyAlgorithm[2]; Result:=true; Exit; end else vKeyOIDInfo:=nil; end; Result:=Assigned(vKeyOIDInfo); end;
Основная закавыка в функции CryptFindOIDInfo, она постоянно возвращает nil. Как я понимаю она перебирает все зарегистрированные вариации HashAlg+SignAlg и если находит совпадение с маской (@vKeyAlgorithm), то возвращает указатель на структуру. С сертификатами на основе стандартных криптопровайдеров винды проблем не возникло, а вот с CryptoPro вышла заморочка, не находит он такую пару. Алгоритм подписи имеет значение 11811, к сожалению не знаю как его перевести в вид CALG_XXX, если это вообще возможно. Если не сложно, подскажите, в чем суть? Отредактировано пользователем 6 октября 2009 г. 18:58:16(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 08.07.2009(UTC) Сообщений: 31
|
Ну вот, так обычно, сначала задаешь вопрос, структурируешь свои мысли, а потом приходит озарение ))) Естественно не нашел, потому что среди перебираемых алгоритмов хэширования, не было ГОСТа, каюсь )
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
CALG_XXX и есть идентификатор алгоритма, так что значение 11811 никуда переводить не надо, им можно пользоваться напрямую. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 08.07.2009(UTC) Сообщений: 31
|
Да это я понимаю, просто как правило приятнее работать с константами, код читабельнее получается, но все равно спасибо. Раз уж поднялась тема, порекомендуйте чтонибудь из бесплатных сторонних программ для следующего 1. Декодировать и просматривать сертификаты 2. Генерировать подпись на основе сертификата (чтоб потом можно было сравнить со своим результатом) 3. Генерировать хэш Помню что на форуме было несколько упоминаний, но никак не получается найти. Вобщем нужны достаточно специфичные инструменты, гугл тоже не улавливает чего я хочу )))
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:1. Декодировать и просматривать сертификаты dumpasn1 По 2-3 про сторонние не подскажу, но это умеют csptest и cpverify соответственно, входят в состав КриптоПро CSP. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 08.07.2009(UTC) Сообщений: 31
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close