C#AES解密的二进制文件大小增加了一倍。只有文本文件工作正常
加密和解密文本文件时,代码工作正常 但在加密二进制和zip文件时,解密后文件大小几乎翻了一番。例如,一个2.06mb的bin.exe在解密后变成了3.69mb;4mb的zip文件在解密后变为7+mb 这是因为填充模式吗?我应该设置什么填充模式来处理所有类型的文件?如何解决这个问题C#AES解密的二进制文件大小增加了一倍。只有文本文件工作正常,c#,encryption,C#,Encryption,加密和解密文本文件时,代码工作正常 但在加密二进制和zip文件时,解密后文件大小几乎翻了一番。例如,一个2.06mb的bin.exe在解密后变成了3.69mb;4mb的zip文件在解密后变为7+mb 这是因为填充模式吗?我应该设置什么填充模式来处理所有类型的文件?如何解决这个问题 private async Task RunEncrypt(string srcfile) { string data; using (StreamReader sr
private async Task RunEncrypt(string srcfile)
{
string data;
using (StreamReader sr = new StreamReader(srcfile))
{
data = sr.ReadToEnd();
}
byte[] enc_data = await Program.myEncrypt(data);
}
static async Task<byte[]> myEncrypt(string toEncStr)
{
byte[] encrypted;
using (Aes encaes = Aes.Create())
{
try
{
//store key to key.txt
FileStream fs = new FileStream("key.txt", FileMode.OpenOrCreate);
fs.Write(encaes.Key, 0, encaes.Key.Length);
fs.Write(encaes.IV, 0, encaes.IV.Length);
fs.Close();
}
catch ( Exception e)
{
Console.WriteLine("Recording encryption keys failed!{0}.", e.Message);
Environment.Exit(0);
}
encaes.Padding = PaddingMode.PKCS7;
ICryptoTransform encryptor = encaes.CreateEncryptor(encaes.Key, encaes.IV);
try
{
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(toEncStr);
}
}
encrypted = msEncrypt.ToArray();
}
return encrypted;
}
catch (Exception e)
{
Console.WriteLine("Encryption failed!{0}.", e.Message);
return Encoding.UTF8.GetBytes("null");
}
}
}
private async Task RunDecrypt(byte[] inbytes)
{
try
{
string write_data = await myDecrypt(inbytes);
using (StreamWriter sw = new StreamWriter("test.exe", true))
{
sw.Write(write_data);
sw.Close();
}
}
catch (Exception e)
{
}
}
async Task<string> myDecrypt(byte[] toDecBytes)
{
try
{
string decrypted;
using (Aes dec = Aes.Create())
{
byte[] Key = new byte[dec.Key.Length];
byte[] IV = new byte[dec.IV.Length];
//read key from key.txt
FileStream fsread = new FileStream("key.txt", FileMode.Open);
fsread.Read(Key, 0, Key.Length);
fsread.Read(IV, 0, IV.Length);
fsread.Close();
dec.Key = Key;
dec.IV = IV;
dec.Padding = PaddingMode.PKCS7;
ICryptoTransform decryptor = dec.CreateDecryptor(dec.Key, dec.IV);
using (MemoryStream msDecrypt = new MemoryStream(toDecBytes))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
decrypted = srDecrypt.ReadToEnd();
return decrypted;
}
}
}
}
}
catch (Exception e)
{
Console.WriteLine("Decryption failed! {0}.", e.Message);
return @"null";
}
}
专用异步任务RunEncrypt(字符串srcfile)
{
字符串数据;
使用(StreamReader sr=新的StreamReader(srcfile))
{
数据=sr.ReadToEnd();
}
字节[]enc_data=wait Program.myEncrypt(数据);
}
静态异步任务myEncrypt(字符串到encstr)
{
字节[]加密;
使用(Aes encaes=Aes.Create())
{
尝试
{
//将密钥存储到key.txt
FileStream fs=newfilestream(“key.txt”,FileMode.OpenOrCreate);
fs.Write(encaes.Key,0,encaes.Key.Length);
fs.Write(encaes.IV,0,encaes.IV.Length);
fs.Close();
}
捕获(例外e)
{
WriteLine(“记录加密密钥失败!{0}.”,e.Message);
环境。退出(0);
}
encages.Padding=PaddingMode.PKCS7;
ICryptoTransform encryptor=encaes.CreateEncryptor(encaes.Key,encaes.IV);
尝试
{
使用(MemoryStream msEncrypt=new MemoryStream())
{
使用(CryptoStream csEncrypt=new CryptoStream(msEncrypt,encryptor,CryptoStreamMode.Write))
{
使用(StreamWriter swEncrypt=newstreamwriter(csEncrypt))
{
swEncrypt.Write(toEncStr);
}
}
加密=msEncrypt.ToArray();
}
返回加密;
}
捕获(例外e)
{
WriteLine(“加密失败!{0}.”,e.Message);
返回Encoding.UTF8.GetBytes(“null”);
}
}
}
专用异步任务RunDecrypt(字节[]inbytes)
{
尝试
{
字符串写入\ U数据=等待myDecrypt(以字节为单位);
使用(StreamWriter sw=新StreamWriter(“test.exe”,true))
{
软件写入(写入数据);
sw.Close();
}
}
捕获(例外e)
{
}
}
异步任务myDecrypt(字节[]到字节)
{
尝试
{
字符串解密;
使用(Aes dec=Aes.Create())
{
字节[]键=新字节[dec.Key.Length];
字节[]IV=新字节[dec.IV.Length];
//从key.txt读取密钥
FileStream fsread=newfilestream(“key.txt”,FileMode.Open);
fsread.Read(Key,0,Key.Length);
fsread.Read(IV,0,IV.Length);
fsread.Close();
十二月键=键;
十二月四日=四日;
12月Padding=PaddingMode.PKCS7;
ICryptoTransform decryptor=dec.CreateDecryptor(dec.Key,dec.IV);
使用(MemoryStream msDecrypt=新的MemoryStream(toDecBytes))
{
使用(CryptoStream csDecrypt=新加密流(msDecrypt、解密程序、CryptoStreamMode.Read))
{
使用(StreamReader srDecrypt=新的StreamReader(csDecrypt))
{
decrypted=srDecrypt.ReadToEnd();
返回解密;
}
}
}
}
}
捕获(例外e)
{
WriteLine(“解密失败!{0}.”,e.Message);
返回@“null”;
}
}
通过使用StreamReader和StreamWriter,您将文件内容视为文本。要支持二进制文件,请直接从源/目标流读/写。通过使用StreamReader和StreamWriter,您将文件内容视为文本。要支持二进制文件,请直接从源/目标流读/写。二进制数据应作为二进制数据而不是任意转换为UTF8的二进制数据提供给加密。停止使用StreamReader
转换为字符串。将文件视为二进制。二进制数据应作为二进制数据而不是任意转换为UTF8的二进制数据提供给加密。停止使用StreamReader
转换为字符串。将文件视为二进制文件。请改用FileStream?@MinKim或MemoryStream
,这样您就可以返回字节[]
而不是字符串。此外,函数myEncrypt
使用async
,但内部没有wait
。它应该删除async
并返回一个byte[]
而不是Task
(或Task
),在这种情况下,我还必须将myEncrypt(string src)
更改为myEncrypt(byte[/src)
。还可以使用(CryptoStream csEncrypt…
代码块修改。你能告诉我怎么做吗?我是C#[link]的新手。这篇文章真的帮了我很大的忙!以防万一其他人也有同样的问题。谢谢大家!改用FileStream?@MinKim或MemoryStream
,这样你就可以返回字节[]
而不是字符串
。同样,你的函数myEncrypt
使用async
,但里面没有wait
。它应该删除async
并返回字节[]
而不是任务(或任务
),在这种情况下,我必须更改myEncrypt(string src)
至