Простое использование RSACryptoServiceProvider KeyPassword не удается - PullRequest
2 голосов
/ 16 декабря 2009

Я хочу защитить свой закрытый ключ 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 Ответ

1 голос
/ 16 декабря 2009

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

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

prms.Flags = CspProviderFlags.UseUserProtectedKey;

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

...