简体   繁体   English

使用Aes解密密文时出现“填充无效且无法删除”错误

[英]“Padding is invalid and cannot be removed” Error while decrypting cipher text Using Aes

I want to encrypt/ decrypt my access token using Aes. 我想使用Aes加密/解密我的访问令牌。 Encryption part is successful working. 加密部分成功运行。 But my problem is when decrypting the encrypted access token following error is occurred 但是我的问题是发生以下错误时解密加密的访问令牌

Padding is invalid and cannot be removed. 填充无效,无法删除。

Following line is throwing an exception: 以下行引发异常:

 using (var srDecrypt = new StreamReader(csDecrypt))
                            {
                                result = srDecrypt.ReadToEnd();
                            }

Can anyone tell me what I can do to solve this issue? 谁能告诉我该如何解决这个问题? (as a console application) (作为控制台应用程序)

 class Program
    {
        private static string keyString = "E546C8DF278CD5931069B522E695D4F2";
        static void Main(string[] args)
        {
            var text = "a16df7367e9eca23ac5e071dc4449a7a";
            Console.WriteLine(EncryptString(text)); ;
            Console.WriteLine(DecryptString(EncryptString(text)));
            Console.ReadLine();
        }

        public static string EncryptString(string text)
        {
            var key = Encoding.UTF8.GetBytes(keyString);

            using (var aesAlg = Aes.Create())
            {
                using (var encryptor = aesAlg.CreateEncryptor(key, aesAlg.IV))
                {
                    using (var msEncrypt = new MemoryStream())
                    {
                        using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                        using (var swEncrypt = new StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(text);
                        }

                        var iv = aesAlg.IV;

                        var decryptedContent = msEncrypt.ToArray();

                        var result = new byte[iv.Length + decryptedContent.Length];

                        Buffer.BlockCopy(iv, 0, result, 0, iv.Length);
                        Buffer.BlockCopy(decryptedContent, 0, result, iv.Length, decryptedContent.Length);

                        return Convert.ToBase64String(result);
                    }
                }
            }
        }

        public static string DecryptString(string cipherText)
        {
            var fullCipher = Convert.FromBase64String(cipherText);

            var iv = new byte[16];
            var cipher = new byte[16];

            Buffer.BlockCopy(fullCipher, 0, iv, 0, iv.Length);
            Buffer.BlockCopy(fullCipher, iv.Length, cipher, 0, iv.Length);
            var key = Encoding.UTF8.GetBytes(keyString);

            using (var aesAlg = Aes.Create())
            {
                using (var decryptor = aesAlg.CreateDecryptor(key, iv))
                {
                    string result;
                    using (var msDecrypt = new MemoryStream(cipher))
                    {
                        using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                        {
                            using (var srDecrypt = new StreamReader(csDecrypt))
                            {
                                result = srDecrypt.ReadToEnd();
                            }
                        }
                    }

                    return result;
                }
            }
        }
    }

You should change it 你应该改变它

        var iv = new byte[16];
        var cipher = new byte[16];

        Buffer.BlockCopy(fullCipher, 0, iv, 0, iv.Length);
        Buffer.BlockCopy(fullCipher, iv.Length, cipher, 0, iv.Length);

to

        var iv = new byte[16];
        var cipher = new byte[fullCipher.Length - 16]; //Calculate correct byte size

        Buffer.BlockCopy(fullCipher, 0, iv, 0, iv.Length);
        Buffer.BlockCopy(fullCipher, iv.Length, cipher, 0, cipher.Length);  //Change destination count of copied bytes

Cipher array size can't be 16 bytes by default you should calculate it. 默认情况下,密码数组大小不能为16个字节,您应该计算得出。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM