问题描述
可以帮忙吗...
我想使用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();