【问题标题】:"Padding is invalid and cannot be removed" -Whats wrong with this code?“填充无效且无法删除”-此代码有什么问题?
【发布时间】:2011-01-17 06:08:59
【问题描述】:

每次我运行它并加密时,输出都是可变的,当我尝试解密时 我得到“填充无效,无法删除。”已经为此奋斗了一两天,我不知所措。

    private static string strIV = "abcdefghijklmnmo"; //The initialization vector.
    private static string strKey = "abcdefghijklmnmoabcdefghijklmnmo"; //The key used to encrypt the text.

    public static string Decrypt(string TextToDecrypt)
    {
        return Decryptor(TextToDecrypt);
    }

    private static string Encryptor(string TextToEncrypt)
    {
        //Turn the plaintext into a byte array.
        byte[] PlainTextBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(TextToEncrypt);            

        //Setup the AES providor for our purposes.
        AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider();
        aesProvider.Key = System.Text.Encoding.ASCII.GetBytes(strKey);
        aesProvider.IV = System.Text.Encoding.ASCII.GetBytes(strIV);
        aesProvider.BlockSize = 128;
        aesProvider.KeySize = 256;            
        aesProvider.Padding = PaddingMode.PKCS7;
        aesProvider.Mode = CipherMode.CBC;

        ICryptoTransform cryptoTransform = aesProvider.CreateEncryptor(aesProvider.Key, aesProvider.IV);            
        byte[] EncryptedBytes = cryptoTransform.TransformFinalBlock(PlainTextBytes, 0, PlainTextBytes.Length);
        return Convert.ToBase64String(EncryptedBytes);                        
    }

    private static string Decryptor(string TextToDecrypt)
    {
        byte[] EncryptedBytes = Convert.FromBase64String(TextToDecrypt);

        //Setup the AES provider for decrypting.            
        AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider();
        aesProvider.Key = System.Text.Encoding.ASCII.GetBytes(strKey);
        aesProvider.IV = System.Text.Encoding.ASCII.GetBytes(strIV);
        aesProvider.BlockSize = 128;
        aesProvider.KeySize = 256;            
        aesProvider.Padding = PaddingMode.PKCS7;
        aesProvider.Mode = CipherMode.CBC;

        ICryptoTransform cryptoTransform = aesProvider.CreateDecryptor(aesProvider.Key, aesProvider.IV);
        byte[] DecryptedBytes = cryptoTransform.TransformFinalBlock(EncryptedBytes, 0, EncryptedBytes.Length);
        return System.Text.Encoding.ASCII.GetString(DecryptedBytes);
    }
}

【问题讨论】:

    标签: c# .net encryption aes


    【解决方案1】:

    您需要先设置BlockSizeKeySize,然后再设置KeyIV。此外,您可能应该为每条消息生成一个随机 IV,并注意 ICryptoTransform 实现了 IDisposable,因此应该处置这些对象。

    【讨论】:

    • 这是解决我问题的响应。每个人都非常乐于助人。我花了一段时间才意识到设置这些属性是依赖于顺序的。谢谢戴夫!
    • 本示例中使用的 AesCryptoServiceProvider 也实现了 IDisposable,因为它是 .NET 中可用的非托管 AES 实现。建议使用 using 语句。
    • 你刚刚拯救了我的一天。谢谢!
    • @GregLoehr 你能否详细说明一些示例代码,因为我是 Windows 的新手,并且在“TransformFinalBlock”处填充相同的崩溃。我已设置aesProvider.BlockSize = 128; aesProvider.KeySize = 256; aesProvider.IV = App.iv; aesProvider.Key = KeyHashValue; aesProvider.Mode = CipherMode.CBC; aesProvider.Padding = PaddingMode.PKCS7;
    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 2014-06-17
    • 1970-01-01
    • 2021-03-15
    • 2011-12-25
    • 1970-01-01
    • 2018-07-17
    • 2012-01-24
    相关资源
    最近更新 更多