2012-02-28 72 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