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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline cplusplus  
#1 Оставлено : 19 мая 2009 г. 4:18:37(UTC)
cplusplus

Статус: Участник

Группы: Участники
Зарегистрирован: 25.04.2009(UTC)
Сообщений: 12

Здравствуйте!

Я подписал и зашифровал сообщение с помощью CryptSignAndEncryptMessage.

Обращаюсь за помощью.

Во первых не понятно, почему при вызове CryptDecryptAndVerifyMessageSignature ей не передаются указатели PCCERT_CONTEXT на сертификаты получателя и отправителя, на закрытый ключ получателя.

Ну и второе - первый вызов CryptDecryptAndVerifyMessageSignature должен выделить необходимую память для расшифрованного сообщения.
Функция возвращает ноль, а GetLastError() пятерку.
После выполнения функции в cbDecrypted ноль. Т.е. память не выделяется.

Как в msdn-овских примерах:

Код:

            CRYPT_DECRYPT_MESSAGE_PARA DecryptPara;
	CRYPT_VERIFY_MESSAGE_PARA VerifyPara;
	BYTE *pbDecrypted;
	DWORD cbDecrypted;

	// Open the certificate store.
	DecryptPara.cbSize = sizeof(CRYPT_DECRYPT_MESSAGE_PARA);
	DecryptPara.dwMsgAndCertEncodingType = MY_ENCODING_TYPE;
            DecryptPara.cCertStore = 1;
	DecryptPara.rghCertStore = &hCertStore; // вот здесь передается адрес хранилища, и что ??? этого разве достаточно?

	VerifyPara.cbSize = sizeof(CRYPT_VERIFY_MESSAGE_PARA);
            VerifyPara.dwMsgAndCertEncodingType = MY_ENCODING_TYPE;
	VerifyPara.hCryptProv = 0;
	VerifyPara.pfnGetSignerCertificate = 0;
            VerifyPara.pvGetArg = 0;
	pbDecrypted = NULL;
	cbDecrypted = 0;

if(!(CryptDecryptAndVerifyMessageSignature(
        &DecryptPara,
        &VerifyPara,
        0,
        pbSignedAndEncryptedBlob,
        cbSignedAndEncryptedBlob,
        0,
        &cbDecrypted,
        NULL,
        NULL)))
{
	Form1->Memo1->Lines->Add("Failed getting size.");
}
DWORD err = GetLastError();
if(!(pbDecrypted = (BYTE *)malloc(cbDecrypted)))
	{
		Form1->Memo1->Lines->Add("Memory allocation failed.");
	}


Подскажите пожалуйста, как быть???
Природа - МАТЬ, и её надо беречь!
Offline Kirill Sobolev  
#2 Оставлено : 19 мая 2009 г. 14:22:12(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
Во первых не понятно, почему при вызове CryptDecryptAndVerifyMessageSignature ей не передаются указатели PCCERT_CONTEXT на сертификаты получателя и отправителя, на закрытый ключ получателя.

Рекомендую почитать msdn.microsoft.com - там достаточно подробно описано, как происходит выбор сертификатов в этой функции для проверки подписи и дешифрования. Хранилища вполне достаточно, если там содержится сертификат с ссылкой на закрытый ключ, которым можно расшифровать.
Цитата:
Подскажите пожалуйста, как быть???

Попробуйте сначала расшифровать (CryptDecryptMesage), потом проверить подпись (CryptVerifyMessageSignature) - выясните, на каком шаге возникает эта ошибка.
Техническую поддержку оказываем тут
Наша база знаний
Offline cplusplus  
#3 Оставлено : 19 мая 2009 г. 14:23:46(UTC)
cplusplus

Статус: Участник

Группы: Участники
Зарегистрирован: 25.04.2009(UTC)
Сообщений: 12

отвечаю сам на вопрос, о том что вылетает ошибка:


в cbSignedAndEncryptedBlob передавалось значение меньше, чем реальное зашифрованное сообщение, НО остался другой вопрос :


Где все же берется закрытый ключ получателя ???

Закрытый я как понял вот здесь : DecryptPara.rghCertStore = &hCertStore;

Видимо функция сама находит отправителя, если указанно хотябы хранилище.


А закрытый ???? У меня даже расшифровывается сообщение :) несмотря на то, что я не понимаю откуда берется закрытый ключ.

Спасибо большое за потраченное на меня время.
Природа - МАТЬ, и её надо беречь!
Offline cplusplus  
#4 Оставлено : 19 мая 2009 г. 14:25:51(UTC)
cplusplus

Статус: Участник

Группы: Участники
Зарегистрирован: 25.04.2009(UTC)
Сообщений: 12

Kirill Sobolev, спасибо большое. Ваше сообщение пришло одновременно с моим :) Теперь я все понял :)


Спасибо :)
Природа - МАТЬ, и её надо беречь!
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.