Я пытаюсь импортировать пару открытого и закрытого ключей RSA, созданную с помощью Win32 Crypto API, в приложение .NET.Код, который создает и экспортирует пару ключей, выглядит примерно так:
// Abbreviated for clarity.
CryptAcquireContext(..., MS_ENHANCED_PROV, ...);
// Generate public/private key pair
CryptCreateHash(..., CALG_SHA1, ...);
CryptHashData(hash, password, ...);
CryptDeriveKey(..., CALG_3DES, hash, CRYPT_EXPORTABLE, ...);
CyrptExportKey(..., derivedKey, PRIVATEKEYBLOB, ...);
По сути, этот код экспортирует пару открытого / закрытого ключа в виде зашифрованного большого двоичного объекта.Он использует алгоритм 3DES для шифрования с помощью ключа, полученного из хэша SHA-1.
Теперь, когда я пытаюсь импортировать этот ключ в .NET, у меня возникают проблемы.Я пытался подходов:
(1) Я создаю объект RSACyrptoServiceProvider и вызываю ImportCspBlob ().Это вызывает исключение с сообщением «неверные данные».Это неудивительно, поскольку объект провайдера не может узнать, как был зашифрован большой двоичный объект.Насколько я могу судить, нет никакого способа сказать ему, какой алгоритм и ключ использовать для этого.
(2) Я вручную расшифровываю большой двоичный объект, используя класс PasswordDeriveBytes, а затем передаю расшифрованныйblob to ImportCsbBlob ().Еще раз, я получаю исключение.На этот раз сообщение «плохая версия провайдера».Я попытался вручную указать имя поставщика («Microsoft Enhanced Cryptographic Provider v1.0») при создании объекта поставщика, но это не имеет значения.
Очень важно, чтобы я работал.Есть идеи?
РЕШЕНИЕ
После генерации незашифрованных пар открытого / секретного ключей в C ++ и .NET я обнаружил, что Microsoft Enhanced Cryptographic Provider на самом деле не шифруетпервые 8 байтов пары ключей.(Это должна быть информация о версиях, которая выбрасывала оболочку .NET для цикла.) После изменения моего кода расшифровки .NET, чтобы оставить только первые 8 байтов, все работает нормально.
Это решение не оченьхорошо, поскольку это зависит от внутренних реализаций криптографического провайдера.К сожалению, я не думаю, что есть какой-то другой путь, так как Microsoft забыла предоставить версию ImportCspBlob, которая позволяет вам указать алгоритм и ключ для расшифровки.