我在C#下面的代码:C# - 加密和解密数据使用RSA
主类
X509Certificate2 cert = new X509Certificate2("C:/test.pfx", "hello", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
Encryption enc = new Encryption();
string encrypted = enc.Encrypt("hello there", cert);
string decrypted = enc.Decrypt(encrypted, cert);
Console.WriteLine("Encrypted Text: " + encrypted);
Console.WriteLine("Decrypted Text: " + decrypted);
加密类
public string Encrypt(string plainText, X509Certificate2 cert)
{
RSACryptoServiceProvider publicKey = (RSACryptoServiceProvider)cert.PublicKey.Key;
byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
byte[] encryptedBytes = publicKey.Encrypt(plainBytes, false);
string encryptedText = encryptedBytes.ToString();
return encryptedText;
}
public string Decrypt(string encryptedText, X509Certificate2 cert)
{
RSACryptoServiceProvider privateKey = (RSACryptoServiceProvider)cert.PrivateKey;
byte[] encryptedBytes = Encoding.UTF8.GetBytes(encryptedText);
byte[] decryptedBytes = privateKey.Decrypt(encryptedBytes, false);
string decryptedText = decryptedBytes.ToString();
return decryptedText;
}
正如你所看到的,在主要课程中,我正在导入证书。然后我创建一个Encryption类的实例。然后,我将纯文本与证书一起传递给Encrypt方法以获取加密文本。之后,我将加密文本传递给Decrypt方法以获取明文。
我的问题是打印加密文本的结果是系统。[]字节(如果我注释了解密调用)。如果我不注释解密调用,则会在解密方法中得到加密例外:错误数据。
我想encryptedBytes数组没有正确转换为字符串。此外,我不确定我是否正确组建了RSAEncryptionProvider。我该如何解决这个问题?
更新
我解决了一个问题。当从字节数组转换为字符串时,我不得不使用Encoding.UTF8.GetString(EncryptedBytes)。现在的问题是解密方法给了我另一个加密异常(他要解密的数据超过了这个128字节模数的最大值)。
有人知道为什么会发生这种情况,以及如何解决它?
加密总是二进制数据进行(尽管它可能看起来像你的字符串),并总是产生二进制数据输出。你为什么期待任何字符串? – 2013-04-28 10:26:27
请不要在标题中重复标签。 – 2013-04-28 10:30:32
@Eugene我想在屏幕上显示文本,看看它是否真的有效 – Matthew 2013-04-28 10:32:56