Как проверить S/MIME сообщение средствами CryptoAPI?
От: AShe  
Дата: 23.04.04 13:37
Оценка:
Возникла проблема проверки сообщения в S/MIME. Необходимо проверить целостность текста

сообщения после получения. Делаю так:
1. С помощью функций CryptMsgOpenToDecode и CryptMsgUpdate создаю объект HCRYPTMSG hMsg из p7s файла.
2. Из сообщения получаю сертификат подписавшей стороны (PCCERT_CONTEXT pSignerCert).
3. Получаю хэндл CSP с помощью CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0);
4. Получаю открытый ключ CryptImportPublicKeyInfoEx(hProv, MY_TYPE,

&pSignerCert->pCertInfo->SubjectPublicKeyInfo, CALG_RSA_SIGN, 0, NULL, &hPubKey));
5. Создаю хэш CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash);
6. Вычисляю хэш для открытого текста из сообщения CryptHashData(hHash, pbBuffer, cbBuffer, 0);
где pbBuffer и cbBuffer указатель на буфер с текстом полученного сообщения и его длина.
7. Получаю сигнатуру из сообщения с помощью CryptMsgGetParam(hMsg, CMSG_ENCRYPTED_DIGEST, 0,
pbDigest, &cbDigest);
8. Далее пытаюсь расшифровать сигнатуру на основе открытого ключа из сообщения
CryptDecrypt(hPubKey, 0, TRUE, 0, pbDigest, &cbDigest);
Здесь возникает ошибка: "Bad Key".
9. Если пропустить шаг 8 и пытаться проверить сигнатуру таким образом СryptVerifySignature(
hHash, pbDigest, cbDigest, hPubKey, NULL, 0), то вернется FALSE.
Текст полученного сообщения совпадает с текстом отправленного. Подскажите что я делаю
неправильно. Может я неправильно получаю сигнатуру или открытый ключ из сообщения? И вообще
как проверить полученный тест сообщения, что он не был изменен? Алгоритм хэширования SHA-1. Заранее спасибо.
Re: Как проверить S/MIME сообщение средствами CryptoAPI?
От: Аноним  
Дата: 23.07.08 05:38
Оценка:
AS>8. Далее пытаюсь расшифровать сигнатуру на основе открытого ключа из сообщения
AS>CryptDecrypt(hPubKey, 0, TRUE, 0, pbDigest, &cbDigest);
AS>Здесь возникает ошибка: "Bad Key".
AS>9. Если пропустить шаг 8 и пытаться проверить сигнатуру таким образом СryptVerifySignature(
AS>hHash, pbDigest, cbDigest, hPubKey, NULL, 0), то вернется FALSE.


а для расшифровки используется разве открытый ключ? может закрытый?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.