我在 C# 中有以下代码:
主班
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 方法以取回明文。
我的问题是打印加密文本的结果是 System.[]Byte (如果我注释掉解密调用)。如果我不注释掉解密调用,我会得到一个 Cryptographic Exception: Bad Data in the decryption 方法。
我猜 encryptedBytes 数组没有正确转换为字符串。此外,我不确定我是否正确形成了 RSAEncryptionProvider。请问我该如何解决?
更新
我解决了一个问题。从字节数组转换为字符串时,我不得不使用 Encoding.UTF8.GetString(EncryptedBytes)。现在的问题是,解密方法给了我另一个加密异常(他要解密的数据超过了这个 128 字节模数的最大值)。
有谁知道为什么会发生这种情况以及如何解决它?