C#.NET中的RSA加密和解密

use*_*316 0 c# encryption cryptography rsa

我有以下代码来加密和解密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;
   }
Run Code Online (Sandbox Code Playgroud)

Cod*_*aos 5

几个问题:

  1. RSA默认只加密一个块.它不适合长消息.您不应该使用RSA加密消息本身.生成随机AES密钥并使用RSA加密密钥,使用AES加密实际消息.

  2. 您必须使用二进制安全编码(如Hex或Base64)作为密文.使用UTF-8会破坏数据,因为它不允许任意字节序列.

    UTF-8旨在对文本进行编码,因此它对您的纯文本很好.

  3. 使用OAEP,旧的1.5填充模式不安全.即true作为第二个参数传递给Encrypt/ Decrypt.(从技术上讲,可以安全地使用它,但它很棘手,我不推荐它)


另外需要注意的是,一旦你使用AES,就会有一些陷阱:1)在加密 - 然后 - mac方案中使用MAC,否则包括padding-oracles在内的主动攻击会破坏你的代码2)使用不同的随机IV每条消息