【问题标题】:Padding issue with AES Encryption in .NET [duplicate].NET中AES加密的填充问题[重复]
【发布时间】:2013-05-31 12:48:32
【问题描述】:

我开始使用 ECB,因为我听说它是​​最容易开始的,所以我创建了一个控制台应用程序,它接受输入进行加密,然后将其解密并输出加密文本和解密文本。这一切都很完美。我尝试使用 CBC 从头开始​​创建了一个新程序,但出现错误:“填充无效,无法删除。”从我所看到的我已经正确地完成了所有事情,任何人都可以指出我的问题可能是正确的方向吗?我已经尝试了我在博客和本网站上可以找到的所有内容,但均无济于事。异常发生在 DecryptData 方法中的 DecryptedText = srDecrypt.ReadToEnd() 行。

RijndaelManaged rijm = new RijndaelManaged();
//more variables here

    protected void Page_Load(object sender, EventsArgs e)
    {
        //Convert Key from string to Byte Array Here

        rijm.BlockSize = 128;
        rijm.KeySize = 256;
        rijm.Key = keyByteArray;
        rijm.Mode = CipherMode.CBC;
        rijm.Padding = PaddingMode.PKCS7;
        ICryptoTransform crypt = rijm.CreateEncryptor(keyByteArray, null);

        using(crypt)
        {
           byte[] value1Cipher = EncryptData(crypt, value1);
           byte[] value2Cihper = EncryptData(crypt, value2);

           encryptedValue1 = Convert.ToBase64String(vaue1Cipher);
           encrpytedValue2 = Convert.ToBase64String(value1Cipher);
        }

        ICryptoTransform decrypt = rijm.CreateDecryptor(keyByteArray, null);

        using (decrypt)
        {
           decryptedValue1 = DecryptData(decrypt, encryptedValue1); //string
           decryptedValue2 = DecryptData(decrypt, encrpytedValue2); //string
        }
        //... Do something with the values here.
    }
    private byte[] EncryptData(ICryptoTransform encrypt, string text)
    {
        var stream = new MemoryStream();
        using (var cryptoStream = new CryptoStream(stream, encrypt, CryptoStreamMode.Write))
        {
            using (var writer = new StreamWriter(cryptoStream))
            {
                writer.Write(text);

            }
        }
        return stream.ToArray();
    }

    private string DecryptData(ICryptoTransform decrypt, string cipherText)
    {
        string decryptedText = null;
            byte[] text = Convert.FromBase64String(cipherText);
            using (MemoryStream msDecrypt = new MemoryStream(text))
            using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decrypt, CryptoStreamMode.Read))
            using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                decryptedText = srDecrypt.ReadToEnd();

        return decryptedText;
    }

【问题讨论】:

  • @JonWillemse 我已经尝试过了,但没有任何影响。
  • 你在哪一行得到了异常?
  • @JohnWillemse 它出现在 DecryptData 方法中的 decryptedText = srDecrypt.ReadToEnd() 行。
  • 我在以下几行中看到了一个错误:decryptedValue1 = DecryptData(decryptor, ...,我认为 decryptor 应该改为 decrypt,但不确定这是否只是拼写错误或相关。
  • @JohnWillemse 这只是我在清理要放在网站上的代码时犯的一个错误。感谢您捕捉到这一点,所以现在更清楚了。

标签: c# .net encryption aes


【解决方案1】:

要么使用无参数CreateEncryptor()/CreateDecryptor() 方法,要么传递IV。如果您使用无参数版本,则应调用 CreateIV 并将结果值存储在 .IV 中。

【讨论】:

  • 所以 ECB 不需要静脉注射,但 CBC 需要?
  • 正确 - ECB 不使用 IV(这有点不可能适应 ECB 方案,它独立处理每个块)。 CBC 使用 IV 加密第一个块。 API 是相同的(并非所有文档都很好),因此可能会让人感到困惑。
猜你喜欢
  • 2011-06-17
  • 2016-09-03
  • 2013-09-25
  • 2018-07-17
  • 2011-10-16
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 2015-09-16
相关资源
最近更新 更多