получение ошибки при расшифровке при использовании контейнера ключей RSA и шифровании данных с использованием экспортированного открытого ключа

#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 . Поэтому это работает. Однако for CreateAsmKeys(true) , CspProviderFlags.UseMachineKeyStore применяется в CreateAsmKeys то время CspProviderFlags.NoFlags как все еще используется в Decrypt , что вызывает исключение.