Насколько я понимаю, публичный ключ предназначен для того, чтобы им шифровать данные, но расшифровать их с его помощью нельзя. Ниже - приблизительный код. Проблема в том, что CryptDecrypt выполняется успешно и расшифровывает данные, хотя не должна бы... Вопрос по существу: чего я не пойму ? Код (Text): CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0) CryptGenKey(hProv, CALG_RSA_KEYX, KEYLENGTH|CRYPT_EXPORTABLE, &hKeyPair) CryptExportKey(hKeyPair, NULL, PUBLICKEYBLOB, 0, pbPublicKey, &dwPublicKeySize) CryptImportKey(hProv, pbPublicKey, dwPublicKeySize, NULL, CRYPT_EXPORTABLE, &hPublicKey) CryptEncrypt(hPublicKey, 0, TRUE, 0, (BYTE*)EncryptedBuff, &dwDataToEncryptSize, BuffSize) CryptDecrypt(hPublicKey, 0, TRUE, 0, (BYTE*)EncryptedBuff, &BuffSize)
Идущим тернистым путем дзена посвящается. Вышеобозначенная проблема имеет место быть при тестировании на одной машине для одного контейнера с ключами. Судя по всему при импорте контейнер просмотривается на наличие такой же пары как импортируемая и к публичному ключу привязывает уже существующий там, созданный при генерации приватный ключ, причем вызов CryptDestroyKey (для удаления сгенерированной пары ключей и удаления из контейнера приватного) почему-то не помогает. Дабы проверить работоспособность не трогая VMWare я просто освободил контейнер через CryptReleaseContext и создал новый (именованный, причем имя не совпадает с контейнером где генерится пара ключей). После подобного шаманства приватный ключ ведет себя так, как должен. ИМХО про такие "особенности" неплохо бы писать в официальной документации однако Мелкософт такой Мелкософт...