Верификация подписи
От: _Inch_  
Дата: 31.07.06 09:31
Оценка:
Здравствуйте.
Верифицирую ЭЦП в формате PKCS#7 функцией CPVerifySignature. Соответсвенно для этого получаю дескриптор CSP, создаю объект функции хеширования, вычисляю значение хеша данных и.т.п./ниже приведу куски кода как все это делаю/.

Вопрос заключается в следующем: при получении подписи из подписанного сообщения без использования каких-либо функций CryptoApi существует необходимость в ее (т.е. подписи) преобразовании или приведению к какому-либо виду, если да то не подскажите каким образом это можно осущесвить. Данный вопрос возник в связи с тем что подпись правильная (создана функцией CryptSignMessage(...)), а при ее верификации выше указанной функцией возвращается ошибка: 2148073478: "Неправильная подпись".


1) Получаю контекст провайдера:
pVTable.Version = 3;
pVTable.FuncVerifyImage = NULL;
pVTable.FuncReturnhWnd = NULL;
pVTable.pszProvName = "Crypto-Pro GOST R 34.10-94 Сryptographic Service Provider";
pVTable.dwProvType = 71;
pVTable.cbContextInfo = 0;
pVTable.pbContextInfo = NULL;
CPAcquireContext(&Prov, NULL, CRYPT_VERIFYCONTEXT, &pVTable);

2) Импортирую открытый ключ
CPImportKey(Prov,pbImportBlob,dwImportBlobSize,0,0,&hImportedKey)

3) Нахожу алгоритм хеша по OID, переводя значение OID в значение алгоритма.
hashAlg = CertOIDToAlgId((LPCSTR)data);
[in] data = 1.2.643.2.2.9
[out] hashAlg = 32798

4) Создаю хеш
CPCreateHash(Prov,hashAlg,0,0,&hHash);

5) Из ранее полученных данных (их получение пропускаю) расчитываю хеш данных
CPHashData(Prov,hHash,signFile.captionOfFile,signFile.sizeOfcaptionFile,0);
Размер хеш последовательности 32 байта

6) Получаю подпись из подписанного файла (размер 64 байта)

7) И все это передаю в функцию
CPVerifySignature(Prov,hHash,signFile.hash,signFile.hashSize,ImportedKey,NULL,0);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.