RSA в C # не производит ту же зашифрованную строку для конкретных ключей? - PullRequest
3 голосов
/ 28 февраля 2012

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

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

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

Вотмой код:

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

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

 CryptographicException: Key not valid for use in specified state.

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

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

Ответы [ 2 ]

6 голосов
/ 29 февраля 2012

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

2 голосов
/ 28 февраля 2012

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

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

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

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

...