我有以下代码来加密和解密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;
}
答案 0 :(得分:5)
几个问题:
RSA默认只加密一个块。它不适合长消息。您不应该使用RSA加密消息本身。生成随机AES密钥并使用RSA加密密钥,使用AES加密实际消息。
您必须使用二进制安全编码(如Hex或Base64)作为密文。使用UTF-8会破坏数据,因为它不允许任意字节序列。
UTF-8旨在对文本进行编码,因此对于您的纯文本来说很好。
使用OAEP,旧的1.5填充模式不安全。即将true
作为第二个参数传递给Encrypt
/ Decrypt
。 (从技术上讲,它可以安全地使用它,但它很棘手,我不推荐它)
进一步说明,一旦你使用AES,还有一些陷阱:1)在加密 - 然后 - mac方案中使用MAC,否则包括padding-oracles在内的主动攻击会破坏你的代码2)使用随机IV每条消息都有所不同
答案 1 :(得分:3)
RSA不应用于加密此类数据。您应该使用AES等对称密钥加密数据,然后使用RSA加密对称密钥。