C# AES解密c
我试图解密字节,但在read=cryptoStream.Readbuffer,0,len行中有一个错误,要解密的数据长度无效;inputFile.lenght=4256,len=4256 这是解密的代码C# AES解密c,c#,encryption,aes,C#,Encryption,Aes,我试图解密字节,但在read=cryptoStream.Readbuffer,0,len行中有一个错误,要解密的数据长度无效;inputFile.lenght=4256,len=4256 这是解密的代码 byte[] salt = new byte[32]; FileStream fsCrypt = new FileStream(inputFile, FileMode.Open); fsCrypt.Seek(fsCrypt.Length - 3
byte[] salt = new byte[32];
FileStream fsCrypt = new FileStream(inputFile, FileMode.Open);
fsCrypt.Seek(fsCrypt.Length - 376, SeekOrigin.Begin);
fsCrypt.Read(salt, 0, salt.Length);
byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
RijndaelManaged AES = new RijndaelManaged();
AES.KeySize = 256;
AES.BlockSize = 128;
var key = new Rfc2898DeriveBytes(passwordBytes, salt, 50000);
AES.Key = key.GetBytes(AES.KeySize / 8);
AES.IV = key.GetBytes(AES.BlockSize / 8);
AES.Padding = PaddingMode.PKCS7;
AES.Mode = CipherMode.CFB;
int read;
byte[] buffer = new byte[1048576];
List < byte > bytes = new List < byte > ();
fsCrypt.Seek(0, SeekOrigin.Begin);
read = 1;
var len = Convert.ToInt32(fsCrypt.Length);
MemoryStream mem = new MemoryStream();
fsCrypt.CopyTo(mem);
mem.Position = 0;
using(CryptoStream cryptoStream = new CryptoStream(mem, AES.CreateDecryptor(), CryptoStreamMode.Read)) // CryptoStream cryptoStream = new CryptoStream(fsCrypt, AES.CreateDecryptor(), CryptoStreamMode.Read
{
//var buffer2 = new byte[len];
while ((read = cs.Read(buffer, 0, buffer.Length)) > 0) {
foreach(var m in buffer)
bytes.Add(m);
}
}
您可以调用encrypted=msEncrypt.ToArray;加密太早,它必须在csEncrypt的using语句结束之后,以便将所有数据刷新到内存流中
同样,在解密过程中,您也开始在文件的早期进行解密
fsCrypt.SeekfsCrypt.Length-376,SeekOrigin.Begin;应该是fsCrypt.SeekfsCrypt.Length-32,SeekOrigin.Begin;如果你写出来的盐长度是32
最后,在将salt数据传递给mem之前,您也没有修剪salt,因此您将salt数据与cyphertext一起传递到流中,这会使您的消息过长。您解密的数据长度为wrong@JoePhillips我添加了我如何编码文件的代码,你能检查一下吗;使用CryptoStream csEncrypt=new CryptoStreammsEncrypt,AES.CreateEncryptor,CryptoStreamMode.Write后,再次解密时我会出错非常感谢,不要告诉我如何从流中切盐?ty,我写了这个fsCrypt.SetLengthfsCrypt.Length-32;解码没有错误和正确,但我在文本后有这么多空间,在记事本++中显示NULL哦,我想我理解是的,NULL我修复了,但现在添加到结尾OЩ-ЖЖЖЖФ»r'іъ
byte[] salt = GenerateRandomSalt();
//convert password string to byte arrray
byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(password);
//Set Rijndael symmetric encryption algorithm 71 246
RijndaelManaged AES = new RijndaelManaged();
AES.KeySize = 256;
AES.BlockSize = 128;
AES.Padding = PaddingMode.PKCS7;
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;
var kk = key.ToString();
FileStream fsIn = new FileStream(inputFile, FileMode.Open);
byte[] buffer = new byte[1048576];
int read = 0;
byte[] encrypted;
using(MemoryStream msEncrypt = new MemoryStream()) {
using(CryptoStream csEncrypt = new CryptoStream(msEncrypt, AES.CreateEncryptor(), CryptoStreamMode.Write)) {
fsIn.Seek(0, SeekOrigin.Begin);
while ((read = fsIn.Read(buffer, 0, buffer.Length)) > 0) {
csEncrypt.Write(buffer, 0, read);
}
encrypted = msEncrypt.ToArray();
}
}
fsIn.Seek(0, SeekOrigin.Begin);
fsIn.Write(encrypted, 0, encrypted.Length);
fsIn.Seek(fsIn.Length, SeekOrigin.Begin);
fsIn.Write(salt, 0, salt.Length);