C#AES解密的二进制文件大小增加了一倍。只有文本文件工作正常

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

加密和解密文本文件时,代码工作正常

但在加密二进制和zip文件时,解密后文件大小几乎翻了一番。例如,一个2.06mb的bin.exe在解密后变成了3.69mb;4mb的zip文件在解密后变为7+mb

这是因为填充模式吗?我应该设置什么填充模式来处理所有类型的文件?如何解决这个问题

     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)