C#.NET 中的 RSA 加密和解密
本文关键字:解密 加密 RSA NET 中的 | 更新日期: 2023-09-27 18:32:20
我有以下代码来加密和解密 c# 中的消息。 当我尝试运行时,它给出了一个异常,即"要解密的数据超过了这个模数为 256 字节的最大值"
public static void Main(string[] args)
{
X509Certificate2 cert = new X509Certificate2(@"C:'Data'ABC-rsa-public-key-certificate.cer");
string encryptedText = EncrypIt("Hello", cert);
string decryptedText = DecrptIt(encryptedText, cert);
System.Console.WriteLine(decryptedText);
}
public static string EncrypIt(string inputString, X509Certificate2 cert)
{
RSACryptoServiceProvider publicKey = (RSACryptoServiceProvider)cert.PublicKey.Key;
byte[] plainBytes = Encoding.UTF8.GetBytes(inputString);
byte[] encryptedBytes = publicKey.Encrypt(plainBytes, false);
string encryptedText = Encoding.UTF8.GetString(encryptedBytes);
return encryptedText;
}
public static string DecrptIt(string encryptedText, X509Certificate2 cert)
{
RSACryptoServiceProvider privateKey = (RSACryptoServiceProvider)cert.PublicKey.Key;
byte[] encryptedBytes = Encoding.UTF8.GetBytes(encryptedText);
byte[] decryptedBytes = privateKey.Decrypt(encryptedBytes, false);
string decryptedText = Encoding.UTF8.GetString(decryptedBytes);
return decryptedText;
}
几个问题:
-
默认情况下,RSA 只加密一个块。它不适合长消息。不应使用 RSA 加密消息本身。生成随机 AES 密钥,并使用 RSA 加密密钥,使用 AES 加密实际消息。
-
必须对密文使用二进制安全编码,例如十六进制或 Base64。使用 UTF-8 会损坏数据,因为它不允许任意字节序列。
UTF-8 旨在对文本进行编码,因此适合您的明文。
-
使用OAEP,旧的1.5填充模式不安全,即将
true
作为第二个参数传递给Encrypt
/Decrypt
。(从技术上讲,可以安全地使用它,但这很棘手,我不推荐它)
作为进一步说明,一旦您使用AES,就会有更多的陷阱:1)在加密然后MAC方案中使用MAC,否则包括填充预言机在内的主动攻击将破坏您的代码2)对每条消息使用不同的随机IV
RSA 不应用于加密此类数据。您应该使用 AES 等对称密钥加密数据,然后使用 RSA 加密对称密钥。