填充无效,无法使用AES删除

问题描述

可以帮忙吗...

我想使用Aes加密/解密文件。加密部分成功运行。但是我的问题是解密文本加密错误时发生:填充无效并且无法删除

我的错误发生在网上(私有无效FileDecrypt):

while ((read = cryptoStream.Read(buffer,buffer.Length)) > 0)

我的代码:

private void FileEncrypt(string inputFile,string outputFile,string password)
        {
            byte[] salt = GenerateSalt();
            byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
            RijndaelManaged AES = new RijndaelManaged();
            AES.KeySize = 256;//AES 256 bits
            AES.BlockSize = 128;//AES 128 bits
            AES.Padding = PaddingMode.PKCS7;
            //AES.Padding = PaddingMode.Zeros;            
            var key = new Rfc2898DeriveBytes(passwordBytes,salt,50000);
            AES.Key = key.GetBytes(AES.KeySize / 8);
            AES.IV = key.GetBytes(AES.BlockSize / 8);            
            AES.Mode = CipherMode.CFB;            
            
            using (FileStream filestreamCrypt = new FileStream(outputFile,FileMode.Create))
            {
                filestreamCrypt.Write(salt,salt.Length);
                using (CryptoStream cs = new CryptoStream(filestreamCrypt,AES.CreateEncryptor(),CryptoStreamMode.Write))
                {
                    using (FileStream filestreamIn = new FileStream(inputFile,FileMode.Open))
                    {
                        int readLength = (int)filestreamIn.Length;
                        byte[] buffer = new byte[readLength];                        
                        int read;
                        while ((read = filestreamIn.Read(buffer,buffer.Length)) > 0)
                        {                            
                            cs.Write(buffer,read);
                            cs.FlushFinalBlock();
                        }
                    }
                }
                filestreamCrypt.Dispose();
            }
        }

        private void FileDecrypt(string inputFileName,string outputFileName,string password)
        {            
            byte[] passwordBytes = Encoding.UTF8.GetBytes(password);            

            byte[] salt = new byte[32];
            using (FileStream filestreamCrypt = new FileStream(inputFileName,FileMode.Open))
            {
                filestreamCrypt.Read(salt,salt.Length);
                RijndaelManaged AES = new RijndaelManaged();
                AES.KeySize = 256;//AES 256 bits
                AES.BlockSize = 128;//AES 128 bits                
                var key = new Rfc2898DeriveBytes(passwordBytes,50000);
                AES.Key = key.GetBytes(AES.KeySize / 8);
                AES.IV = key.GetBytes(AES.BlockSize / 8);
                AES.Padding = PaddingMode.PKCS7;
                //AES.Padding = PaddingMode.Zeros;
                AES.Mode = CipherMode.CFB;
                using (CryptoStream cryptoStream = new CryptoStream(filestreamCrypt,AES.CreateDecryptor(),CryptoStreamMode.Read))
                {
                    using (FileStream filestreamOut = new FileStream(outputFileName,FileMode.Create))
                    {
                        int read;
                        int readLength = (int)filestreamCrypt.Length;
                        byte[] buffer = new byte[readLength];                        
                        //var fullCipher = Convert.FromBase64String(filestreamOut.ToString());
                        while ((read = cryptoStream.Read(buffer,buffer.Length)) > 0) **//ERROR**
                        {
                            filestreamOut.Write(buffer,read);                            
                        }
                    }                    
                }
            }
        } 

非常感谢您的帮助。

解决方法

替换此:

while ((read = filestreamIn.Read(buffer,buffer.Length)) > 0)
{                            
    cs.Write(buffer,read);
    cs.FlushFinalBlock();  <--- Flush final block every time around loop !
}

与此:

while ((read = filestreamIn.Read(buffer,read);
}
cs.FlushFinalBlock();  

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...