2012-02-28 50 views
3

我有一個需求,我需要在一個應用程序中加密連接字符串,並在另一個應用程序中解密它。考慮到這一點,我將公鑰和私鑰分別保存在應用程序的App.Config中。C#中的RSA不會爲特定的密鑰生成相同的加密字符串?

現在,不應該給我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 

不過我看到,加密的數據被改變每次。 但是壞數據錯誤不再被看到。 然而我不能使用UTF16(UnicodeEncoding)Encoding.UTF8,因爲它不能加密像連接字符串的巨大串並拋出一個異常:

CryptographicException: Key not valid for use in specified state. 

更新2:

我可以通過使用UTF8Encoding ByteConverter = new UTF8Encoding();然後做ByteConverter .GetString("HUGE STRING");

+0

回覆:更新2,Encoding.UTF8是一個UTF8Encoding對象(.Net 4.5) – costa 2016-11-25 01:28:12

回答

6

它可能發生是因爲Random Padding

+0

嗯,哦,好的..將關注這一個。 ! – 2012-02-29 05:18:29

+0

很好,剛纔發現這個[Answer](http://stackoverflow.com/questions/2568335/why-rsa-encryption-can-return-different-results-with-c-sharp-and-java#answer-2568684 ) – 2012-02-29 05:21:23

2

可以解決不良數據的問題通常ans對於你的問題是肯定的,如果給出相同的參數,它應該總是產生相同的結果。

解決這些問題的最好的辦法就是保持接近最佳實踐代碼成爲可能,目前你使用的加密提供略有不同的框架文件提出,請參閱以下內容:

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

第一次嘗試,並採用最佳實踐,然後看看這個問題仍然出現。

+0

您給出的例子,在我使用這個解決方案之前,我嘗試了它。 **但是**我得到這個錯誤:'CryptographicException Key在指定狀態下無效.'因爲我的'connecString'比他們的文本大。所以我把它轉換成'Encoding.UTF8.GetBytes(connecString);'而不是'ByteConverter。GetBytes(connecString);' – 2012-02-29 03:52:01

+0

@NagarajTantri您可能遇到的隨機性來自填充,因爲@zespri描述過,這就是您可以在默認實現代碼中禁用填充的原因,只需設置參數'DoOAEPPadding = false' – ntziolis 2012-02-29 07:23:05

相關問題