| ||||
| ||||
Скажите ,пожалуйста, откуда CryptEncryptMessage знает каким ключом зашифровать сообщение? CRYPT_ENCRYPT_MESSAGE_PARA EncryptPara; EncryptPara.hCryptProv = hProv; CryptEncryptMessage(&EncryptPara, 1, &pCertContext, lpBuffer, dwFileSize, NULL, &count); CryptEncryptMessage(&EncryptPara, 1, &pCertContext,lpBuffer, dwFileSize, encrypted, &count); Подразумевается, что EncryptPara.hCryptProv = hProv; - связан как то с сертификатов, скажем через : CertGetCertificateContextProperty(...CERT_KEY_PROV_HANDLE_PROP_ID,hProv...); Это так? | ||||
Ответы: | ||||
| ||||
точнее сказать, сообщение шифруется на сессионным ключом, который в свою очередь шифруется на ключе обмена... но на каком именно ключе обмена шифруется сессионный ключ функцией CryptEncryptMessage? Поможите пожалуйста... | ||||
| ||||
Нет, это не так. Подразумевается что CSP identified by hCryptProv is used to do content encryption, recipient key encryption, and recipient key export. Its private key is not used. Ключ обмена зависит от провайдера. В КриптоПро CSP, например, используется алгоритм обмена Диффи-Хелмана, ключ обмена создается по этому алгоритму непосредственно в процессе шифрования. Если хотите узнать как это работает "по шагам" посмотрите export.c в нашем примере. | ||||
| ||||
я запутался совсем............... >>"Ключ обмена зависит от провайдера" Получается ключ генерится независимо от контейнера с ключами... Как вообще используются тогда ключи\сертификат из контейнера при CryptEncryptMessage?? ведь при дешифровании с помощью CryptDecryptMessage используется CRYPT_DECRYPT_MESSAGE_PARA.rghCertStore CRYPT_DECRYPT_MESSAGE_PARA DecryptPara; HCERTSTORE StoreArray[] = { hSystemStore }; DecryptPara.rghCertStore = StoreArray; и функции сама ищет нужный сертификат в хранилище согласно:"The certificate stores are searched to find a certificate context corresponding to the unique identifier. " но зачем сертификат , если подписано сообщение было ключом, который "создается по этому алгоритму непосредственно в процессе шифрования"... ??может быть сертификат при дешифровании ищется соответствующий pCertContext вот здесь: CryptEncryptMessage(&EncryptPara, 1, &pCertContext,lpBuffer, dwFileSize, encrypted, &count); Извиняюсь за сумбурность... собственно: -Используются ли как то ключи из контейнера при CryptEncryptMessage,? | ||||
| ||||
Попробую распутать :) Для шифрования нужен открытый ключ (сертификат)получателя, для расшифрования - секретный ключ получателя. Ключи отправителя тут вообщем то непричем - их вообще может не быть. А ключ обмена в КриптоПро CSP создается с использованием открытого ключа получателя. А вот для подписи нужен секретный ключ подписчика, для проверки подписи - открытый ключ (сертификат). | ||||
| ||||
ооо, мой мир перевернулся с ног на голову... получается , в CryptEncryptMessage сертификаты виспользуются для экспорта сессионного ключа, сформированного при шифровании. Сертификаты сами по себе хранят публичные ключи получателей=>этого хватает для экспорта сессионного ключа. В случае, если получателей несколько - то для каждого получателя формируется что то вроде массива экспортированного ключа, что ли?? Это так? Далее вставляется уникальный ID сертификата в массив экспортированных сессионных ключей. А на стороне получателя мы можем найти необходимый для корректного импорта сессионного ключа элемент данного массива ( задаем в CRYPT_DECRYPT_MESSAGE_PARA.rghCertStore -место , где искать сертификат для расшифровки)... Я правильно понял?:) | ||||
| ||||
Все правильно :) Да, для каждого получателя создается свой ключ экспорта и на нем уже шифруется общий сессионный ключ. Уникальный ИД - это как правило издатель + серийный номер сертификата получателя. | ||||
| ||||
Спасибо большое. Вы мне очень помогли! | ||||