RSA в C # не создает такую ​​же зашифрованную строку для определенных ключей?

У меня есть требование, когда мне нужно зашифровать строку подключения в одном приложении и расшифровать ее в другом. Имея это в виду, я сохраняю открытый ключ и закрытые ключи в App.Config приложения соответственно.

Теперь, не должен ли RSA выдавать мне ту же зашифрованную строку с теми же ключами, которые я использую?

Я все время получаю разные зашифрованные строки с одинаковыми ключами !! Пожалуйста, помогите мне устранить путаницу. Я не понимаю, как я могу решить эту проблему, что я получаю исключение BAD Data, если использую сохраненную зашифрованную строку, поскольку каждый раз при шифровании я получаю разные зашифрованные строки.

Вот мой код:

private string connecString;
private RSACryptoServiceProvider rsaEncryptDecrypt;

public EncryptAndDecrypt(string connecString)
{
    this.connecString = connecString;
    this.rsaEncryptDecrypt = new RSACryptoServiceProvider(4096);
}

public string EncryptTheConnecString(string publicKeyValue)
{
    byte[] encryptedData;
    rsaEncryptDecrypt.FromXmlString(publicKeyValue);

    byte[] message = Encoding.UTF8.GetBytes(connecString);
    encryptedData = rsaEncryptDecrypt.Encrypt(message, false);

    return Convert.ToBase64String(encryptedData);
}

public string DecryptTheConnecString(string privateKeyValue, string encrystr)
{
    byte[] decryptedData;
    rsaEncryptDecrypt.FromXmlString(privateKeyValue);

    byte[] message = Convert.FromBase64String(encrystr);
    decryptedData = rsaEncryptDecrypt.Decrypt(message, false);

    return Encoding.UTF8.GetString((decryptedData));
}

Заранее спасибо.

Обновление 1: я использовал

UnicodeEncoding ByteConverter = new UnicodeEncoding();
ByteConverter.GetBytes("data to encrypt");
//Which is not Connection string but a small test str

Тем не менее я вижу, что зашифрованные данные каждый раз меняются. Но ошибка недопустимые данные больше не отображается. Тем не менее я не могу использовать UTF16 (UnicodeEncoding) вместо Encoding.UTF8, потому что он не может зашифровать огромную строку, такую ​​как строка подключения, и вызывает исключение:

 CryptographicException: Key not valid for use in specified state.

Обновление 2:

Я мог бы решить проблему с неверными данными, используя UTF8Encoding ByteConverter = new UTF8Encoding();, а затем выполнив ByteConverter .GetString("HUGE STRING");


person Nagaraj Tantri    schedule 28.02.2012    source источник
comment
re: Обновление 2, Encoding.UTF8 - это объект UTF8Encoding (.Net 4.5)   -  person costa    schedule 25.11.2016
comment
Никогда не пишите new RSACryptoServiceProvider(4096); в своем коде, это ошибка. ВСЕГДА RSA.Create() ...   -  person Jammer    schedule 31.05.2020


Ответы (2)


Это может произойти из-за случайного заполнения.

person Andrew Savinykh    schedule 29.02.2012
comment
Хммм, ну ладно ... позаботимся об этом. ! - person Nagaraj Tantri; 29.02.2012
comment
Отлично, только что нашел это Ответ - person Nagaraj Tantri; 29.02.2012

В общем, ответ на ваш вопрос - да, он всегда должен давать один и тот же результат, если заданы одни и те же параметры.

Лучший способ решить эти проблемы - максимально приближаться к передовому коду. В настоящее время вы используете поставщика криптографии, который немного отличается от предлагаемого в документации по фреймворку, см. Следующее:

static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
{
    byte[] encryptedData;
    //Create a new instance of RSACryptoServiceProvider.
    using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
    {

        //Import the RSA Key information. This only needs
        //toinclude the public key information.
        RSA.ImportParameters(RSAKeyInfo);

        //Encrypt the passed byte array and specify OAEP padding.  
        //OAEP padding is only available on Microsoft Windows XP or
        //later.  
        encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
    }
    return encryptedData;
}

Это выдержка из официального документа MSDN:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider.aspx

Сначала попробуйте применить передовой опыт, а затем посмотрите, возникает ли эта проблема.

person ntziolis    schedule 28.02.2012
comment
Тот самый пример, который вы привели, я пробовал до того, как пришел с этим решением. Но я получаю эту ошибку: CryptographicException Key not valid for use in specified state. Потому что мой connecString больше, чем их текст. Поэтому я конвертирую его в Encoding.UTF8.GetBytes(connecString);, а не в ByteConverter.GetBytes(connecString); - person Nagaraj Tantri; 29.02.2012
comment
@NagarajTantri случайность, которую вы можете испытать, исходит от заполнения, как описано в @zespri, и это причина, по которой вы можете отключить заполнение в коде реализации по умолчанию, просто установите параметр DoOAEPPadding = false - person ntziolis; 29.02.2012
comment
Использование RSA без заполнения небезопасно. crypto.stackexchange.com/questions/1448/ - person Jammer; 31.05.2020