#c# #cryptography #rsa
#c# #криптография #rsa
Вопрос:
В приведенном ниже коде я сначала создаю асимметричный ключ и экспортирую открытый ключ в местоположение C:Temp
. Теперь я шифрую и расшифровываю текст «тест», но во время расшифровки я получаю сообщение об ошибке ниже,
В чем проблема с кодом? Разве это не шифруется должным образом? Как это исправить? Пожалуйста, предложите
System.Security.Cryptography.CryptographicException: 'Error occurred while decoding OAEP padding.'
Система.Безопасность.Криптография.Криптографическое исключение
HResult = 0x80131430
Сообщение= Произошла ошибка при декодировании заполнения OAEP.
Источник=
Отслеживание стека:
в системе.Безопасность.Криптография.RSACryptoServiceProvider.Ключ дешифрования(SafeKeyHandle pKeyContext, байт[] pbEncryptedKey, Int32 cbEncryptedKey, логическое значение fOAEP, ObjectHandleOnStack ohRetDecryptedKey)
в системе.Безопасность.Криптография.RSACryptoServiceProvider.Расшифровать(байт[] rgb, логическое значение fOAEP)
в net452.Program.Расшифровать (String encryptText) в C:UsersH190733sourcereposnet452net452Program.cs:line 52
в net452.Program.Main(строка[] аргументов) в C:UsersH190733sourcereposnet452net452Program.cs:line 23
Вот весь код для консольного приложения C #,
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace net452
{
class Program
{
private const string KEY_STORE_NAME = "MyKeyStore";
public static CspParameters csp = new CspParameters();
public static RSACryptoServiceProvider rsa;
static void Main(string[] args)
{
//create keys
CreateAsmKeys(true);
//encrypt the text "test"
var encryptedData = Encrypt("test");
//try to decrypt it and getting error
var data = Decrypt(encryptedData);
Console.ReadLine();
}
private static string Encrypt(string plainText)
{
using (var reader = new StreamReader(Path.Combine(@"C:Temp", "publicKey.txt")))
{
csp.KeyContainerName = KEY_STORE_NAME;
rsa = new RSACryptoServiceProvider(csp);
var publicKeyText = reader.ReadToEnd();
rsa.FromXmlString(publicKeyText);
rsa.PersistKeyInCsp = true;
var encryptedAsBytes = rsa.Encrypt(Encoding.UTF8.GetBytes(plainText), true);
return Convert.ToBase64String(encryptedAsBytes);
}
}
public static string Decrypt(string encryptText)
{
var cspParams = new CspParameters { KeyContainerName = KEY_STORE_NAME };
rsa = new RSACryptoServiceProvider(cspParams);
var decryptBytes = rsa.Decrypt(Convert.FromBase64String(encryptText), true);
return Encoding.Default.GetString(decryptBytes);
}
private static void CreateAsmKeys(bool useMachineKeyStore)
{
csp.KeyContainerName = KEY_STORE_NAME;
if (useMachineKeyStore)
{
csp.Flags = CspProviderFlags.UseMachineKeyStore;
}
rsa = new RSACryptoServiceProvider(csp) { PersistKeyInCsp = true };
//export public key to location C:Temp
using (var writer = new StreamWriter(Path.Combine(@"C:Temp", "publicKey.txt")))
{
writer.Write(rsa.ToXmlString(false));
}
}
}
}
Комментарии:
1. Я думаю, вам также необходимо установить
CspProviderFlags.UseMachineKeyStore
флагDecrypt
при создании экземпляраCspParameters
экземпляра (в соответствии сCreateAsmKeys
). ВEncrypt
этом нет необходимости, так как открытый ключ в конечном итоге считывается из файла.2. Спасибо, пока я звоню
CreateAsmKeys(flase)
, мы НЕ используемCspProviderFlags.UseMachineKeyStore
. В этом случае все выглядит хорошо и работает3. При вызове
CreateAsmKeys(false)
CspProviderFlags.NoFlags
последовательно используется вCreateAsmKeys
иDecrypt
. Поэтому это работает. Однако forCreateAsmKeys(true)
,CspProviderFlags.UseMachineKeyStore
применяется вCreateAsmKeys
то времяCspProviderFlags.NoFlags
как все еще используется вDecrypt
, что вызывает исключение.