首先,我写下面的代码只是出于学术目的。我这么说的原因是因为我没有把它放在生产环境中,因此我“绕过”了一些我需要做的开销,如果我是这样的话,我只需要能够使用下面的代码加密/解密一个字符串。我有几次能够做到这一点,但由于某种原因,我开始收到"CryptographicException错误数据“,并且不确定是什么导致了这个问题。
private string RSAEncrypt(string value)
{
byte[] encryptedData = Encoding.Unicode.GetBytes(value);
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = _rsaContainerName;
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams))
{
encryptedData = RSA.Encrypt(encryptedData, false);
return Convert.ToBase64String(encryptedData);
}
}
private string RSADecrypt(string value)
{
byte[] encryptedData = Encoding.Unicode.GetBytes(value);
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = _rsaContainerName;
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams))
{
encryptedData = RSA.Decrypt(encryptedData,false);
return Convert.ToBase64String(encryptedData);
}
}它只是在RSADecrypt调用中抛出了这个异常。
有什么想法吗?我在某处读到,它可能与传递给RSA.Decrypt的encryptedData的预期大小有关。
谢谢}
发布于 2012-03-12 16:14:24
Convert.[To/From]Base64String);)来回转换加密数据
如下所示:
private string RSAEncrypt(string value)
{
byte[] plaintext = Encoding.Unicode.GetBytes(value);
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = _rsaContainerName;
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams))
{
byte[] encryptedData = RSA.Encrypt(plaintext, false);
return Convert.ToBase64String(encryptedData);
}
}
private string RSADecrypt(string value)
{
byte[] encryptedData = Convert.FromBase64String(value);
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = _rsaContainerName;
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams))
{
byte[] decryptedData = RSA.Decrypt(encryptedData,false);
return Encoding.Unicode.GetString(decryptedData);
}
}发布于 2012-03-12 07:23:22
http://blogs.msdn.com/b/shawnfa/archive/2005/11/10/491431.aspx
不通过字符串编码往返密文
人们在使用托管加密类时经常犯的一个错误是,他们试图通过使用某个Encoding类将加密操作的结果存储在字符串中。这似乎是有道理的,对吧?毕竟,Encoding.ToString()接受一个byte[]并将其转换为一个字符串,而这正是他们想要的。
..。
相反,如果要将密文转换为字符串,请使用Base64编码。
..。
导致每次都能工作的代码,因为可以保证base64编码能够准确地表示任何输入字节序列。
这里有一个很好的、正确的示例:http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael.aspx
发布于 2012-03-12 21:48:14
RSA不用于加密大型对象。当你超过填充限制时,你会得到异常。实际的限制是基于填充本身(使用false意味着您使用的是旧的 PKCS#1 v1.5填充)和公钥的长度(2048位)。
将RSA与大对象一起使用的正确方法是使用对称密钥(例如256位AES密钥)加密大对象,并使用您的RSA公钥加密此小密钥。
你可以在我的blog上找到做这些事情的代码。
https://stackoverflow.com/questions/9659898
复制相似问题