Простое использование 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;
или альтернативно генерировать непостоянную пару ключей, экспортировать ее и зашифровывать ключом, полученным из пароля самостоятельно.