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

C# C.NET中的RSA加密与解密,c#,encryption,cryptography,rsa,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"

我有下面的代码在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不应用于加密此类数据。您应该使用AES等对称密钥加密数据,然后使用RSA加密对称密钥。

几个问题:

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

密文必须使用二进制安全编码,如十六进制或Base64。使用UTF-8会破坏数据,因为它不允许任意字节序列

UTF-8设计用于对文本进行编码,因此它适用于纯文本

使用OAEP,旧的1.5填充模式不安全。i、 e.将true作为第二个参数传递以进行加密/解密。从技术上讲,安全地使用它是可能的,但它很棘手,我不推荐它


进一步说明,一旦使用AES,还有一些陷阱:1在加密-然后MAC方案中使用MAC,否则包括填充预言符在内的主动攻击将破坏您的代码;2使用随机IV,每条消息都不同,如果您在谷歌搜索该错误消息,你会发现这是你的第一个结果:3 MAC的静脉注射。如果您在@user2791316上走到了这一步,为什么不使用经过测试的库,而不是实现自己的协议呢?传输中的数据使用TLS,静止数据使用PGP。即使是专业人士也不总是正确的加密;期望一个新来的人做那件事是不合理的。