【问题标题】:RSA Encryption and Decryption in C#.NETC#.NET 中的 RSA 加密和解密
【发布时间】:2013-09-20 15:38:25
【问题描述】:

我有下面的代码来加密和解密 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;
   }

【问题讨论】:

标签: c# encryption cryptography rsa


【解决方案1】:

几个问题:

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

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

    UTF-8 旨在对文本进行编码,因此它适合您的纯文本。

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


进一步说明,一旦使用 AES,就会出现更多陷阱:1) 在 encrypt-then-mac 方案中使用 MAC,否则包括填充预言在内的主动攻击会破坏您的代码 2) 使用随机 IV每条消息都不同

【讨论】:

  • 3) 也对 IV 进行 MAC。如果你走到这一步@user2791316,你为什么不直接使用一个久经考验的库而不是实现你自己的协议呢?对传输中的数据使用 TLS,对静态数据使用 PGP。即使是专业人士也并不总是正确地掌握密码学。期望新人这样做是不合理的。
【解决方案2】:

不应使用 RSA 加密此类数据。您应该使用 AES 等对称密钥加密您的数据,然后使用 RSA 加密对称密钥。

【讨论】:

    猜你喜欢
    • 2011-08-19
    • 2014-06-02
    • 2012-06-02
    • 2015-03-16
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2018-10-27
    相关资源
    最近更新 更多