Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#AES解密总是以10字节的凌乱代码结束。_C#_Encryption_Cryptography - Fatal编程技术网

C#AES解密总是以10字节的凌乱代码结束。

C#AES解密总是以10字节的凌乱代码结束。,c#,encryption,cryptography,C#,Encryption,Cryptography,我有一个文本文件“toEnc.txt”(文件大小为485b)进行加密和解密 加密后,“byte[]enc_data”的长度增加到496b。 但是我设置了“enc.Padding=PaddingMode.None 解密后,不管文本内容是什么,“testout.txt”最后总是有10字节的凌乱代码 我还尝试了.zip文件。加密的文件长度也增加了,解密后的文件被破坏了(可能是因为zip文件末尾的代码很乱) 这是我的密码: private async Task RunEncryption(

我有一个文本文件“toEnc.txt”(文件大小为485b)进行加密和解密

加密后,“byte[]enc_data”的长度增加到496b。
但是我设置了“enc.Padding=PaddingMode.None

解密后,不管文本内容是什么,“testout.txt”最后总是有10字节的凌乱代码

我还尝试了.zip文件。加密的文件长度也增加了,解密后的文件被破坏了(可能是因为zip文件末尾的代码很乱)

这是我的密码:

       private async Task RunEncryption()
       {
           String data;
           using (StreamReader sr = new StreamReader("toEnc.txt"))
           {
              data = sr.ReadToEnd();
           }
           byte[] enc_data = await Program.myEncrypt(data);

            await RunDecrypt(enc_data);   //to test if decryption works
      }

    static async Task<byte[]> myEncrypt(string toEncStr)
    {
        byte[] encrypted;
        using (Aes enc = Aes.Create())
        {
            Aes encaes = Aes.Create();
            encaes.Key = enc.Key;
            encaes.IV = enc.IV;

            Program.Key = enc.Key;
            Program.IV = enc.IV;

            try
            {
                FileStream fs = new FileStream("key.txt", FileMode.OpenOrCreate);
                fs.Write(Key, 0, Key.Length);
                fs.Write(IV, 0, IV.Length);
                fs.Close();
            }
            catch ( Exception e)
            {
                Console.WriteLine("Encryption failed!{0}.", e.Message);
                Environment.Exit(0);
            }

            enc.Padding = PaddingMode.None;

            ICryptoTransform encryptor = encaes.CreateEncryptor(encaes.Key, encaes.IV);

            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;
    }

    private async Task RunDecrypt(byte[] inbytes)
    {
        try
        {
            String write_data = await myDecrypt(inbytes);
            using (StreamWriter sw = new StreamWriter("testout.txt", 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];
                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.None;
                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();
                            //decrypted = srDecrypt.Read(  , 0, );
                            return decrypted;
                        }
                    }
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Decryption failed! {0}.", e.Message);
            return @"null";
        }
    }
专用异步任务RunEncryption()
{
字符串数据;
使用(StreamReader sr=newstreamreader(“toEnc.txt”))
{
数据=sr.ReadToEnd();
}
字节[]enc_data=wait Program.myEncrypt(数据);
等待RunDecrypt(enc_data);//测试解密是否有效
}
静态异步任务myEncrypt(字符串到encstr)
{
字节[]加密;
使用(Aes enc=Aes.Create())
{
Aes encaes=Aes.Create();
encaes.Key=附件键;
encaes.IV=enc.IV;
程序键=加密键;
Program.IV=enc.IV;
尝试
{
FileStream fs=newfilestream(“key.txt”,FileMode.OpenOrCreate);
fs.Write(Key,0,Key.Length);
fs.写入(IV,0,IV.长度);
fs.Close();
}
捕获(例外e)
{
WriteLine(“加密失败!{0}.”,e.Message);
环境。退出(0);
}
附件填充=填充模式。无;
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();
}
}
}
返回加密;
}
专用异步任务RunDecrypt(字节[]inbytes)
{
尝试
{
字符串写入\ U数据=等待myDecrypt(以字节为单位);
使用(StreamWriter sw=newstreamwriter(“testout.txt”,true))
{
软件写入(写入数据);
sw.Close();
}
}
捕获(例外e)
{
}
}
异步任务myDecrypt(字节[]到字节)
{
尝试
{
字符串解密;
使用(Aes dec=Aes.Create())
{
字节[]键=新字节[dec.Key.Length];
字节[]IV=新字节[dec.IV.Length];
FileStream fsread=newfilestream(“key.txt”,FileMode.Open);
fsread.Read(Key,0,Key.Length);
fsread.Read(IV,0,IV.Length);
fsread.Close();
十二月键=键;
十二月四日=四日;
十二月填充=填充模式。无;
ICryptoTransform decryptor=dec.CreateDecryptor(dec.Key,dec.IV);
使用(MemoryStream msDecrypt=新的MemoryStream(toDecBytes))
{
使用(CryptoStream csDecrypt=新加密流(msDecrypt、解密程序、CryptoStreamMode.Read))
{
使用(StreamReader srDecrypt=新的StreamReader(csDecrypt))
{
decrypted=srDecrypt.ReadToEnd();
//decrypted=srDecrypt.Read(,0,);
返回解密;
}
}
}
}
}
捕获(例外e)
{
WriteLine(“解密失败!{0}.”,e.Message);
返回@“null”;
}
}

您的代码有很多问题

  • 如果使用
    PaddingMode.None
    ,则必须提供正好是块大小倍数的明文(AES为16字节)。所以,您不能简单地加密任意明文。请使用
    PaddingMode.Pkcs7
    进行加密和解密

  • 你正在读密文,它还没有完全写出来。您需要调用
    encrypted=msEncrypt.ToArray()
    使用(CryptoStream csEncrypt…
    块之后:

    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();
    }
    
  • 您有太多可用于加密的变量。您只需要一个
    Aes
    实例(
    enc
    )。只需将代码与
    encaes
    Program
    一起丢弃,然后从
    enc
    实例中写入正确的
    密钥和
    IV



IV不是秘密,因此您可以将其与密文一起发送。通常,它只是在密文前加上前缀并在解密前切掉。

为什么要使用2
Aes
变量-
enc
encaes
?您在
enc
变量上设置
Padding
,然后使用
encaes用于编码。呃..这是一个错误..谢谢!我删除了不必要的变量并将
填充模式更改为
PKCS7
,并且按照您所说的那样,它工作了!出现了另一个问题…当我将代码
RunDecrypt
myDecrypt
的解密部分放在单独的解密程序中时,出现了一个错误ying
解密失败!填充无效且无法删除。
这是怎么回事?另一个问题,当我加密.zip或二进制文件时,文件大小增加,文件损坏。似乎只有txt文件大小可以保持不变?无效的填充可能意味着您不期望