Простое использование RSACryptoServiceProvider KeyPassword не удается

Я хочу защитить свой закрытый ключ RSA паролем (кто бы не стал), но следующая C# не работает:

SecureString pw = new SecureString();
pw.AppendChar('x');
CspParameters prms = new CspParameters();
prms.KeyPassword = pw;
RSACryptoServiceProvider crypto = new RSACryptoServiceProvider(prms);
byte[] encrypted = crypto.Encrypt(Encoding.ASCII.GetBytes("encryptme"), true);

... с CryptographicException: "Указан неверный тип". Если я возьму назначение KeyPassword, оно будет работать нормально.

Что я или Microsoft делаю неправильно?

1 ответ

Решение

Настройка CspParameters.KeyPassword эквивалентно звонку CryptSetProvParam с PP_KEYEXCHANGE_PIN (или же PP_SIGNATURE_PIN). Этот флаг не поддерживается поставщиком службы шифрования Microsoft по умолчанию (он предназначен для использования с CSP на основе смарт-карт).

Вы можете попробовать установить

prms.Flags = CspProviderFlags.UseUserProtectedKey;

или альтернативно генерировать непостоянную пару ключей, экспортировать ее и зашифровывать ключом, полученным из пароля самостоятельно.

Другие вопросы по тегам