首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# AES解密总是以10字节结尾,杂乱的代码。

C# AES解密总是以10字节结尾,杂乱的代码。
EN

Stack Overflow用户
提问于 2017-04-20 08:10:09
回答 1查看 1.5K关注 0票数 1

我有一个文本文件"toEnc.txt“(文件大小为485 b)来加密和解密。

加密后,"byte[] enc_data“的长度增加到496b。

但是我设置了"enc.Padding = PaddingMode.None;“

解密后,无论文本内容是什么,"testout.txt“最终总是有10个字节的杂乱代码。

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

这是我的代码:

代码语言:javascript
复制
       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";
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-20 17:48:23

您的代码有很多问题。

  • 如果您使用PaddingMode.None,那么您必须提供完全是块大小的倍数的明文(对于AES来说是16个字节)。因此,您将不能简单地加密任意明文。请使用PaddingMode.Pkcs7进行加密和解密。
  • 你正在读密文之前,它是完整的书写。您需要在encrypted = msEncrypt.ToArray();块之后调用using (CryptoStream csEncrypt...: 使用(MemoryStream msEncrypt =新MemoryStream()) { new (CryptoStream csEncrypt =新CryptoStream(msEncrypt,encryptor,CryptoStreamMode.Write)) { new (StreamWriter swEncrypt =新StreamWriter(csEncrypt)) { swEncrypt.Write(toEncStr);} encrypted = msEncrypt.ToArray();}
  • 您有太多的变量可用于加密。您只需要一个Aes实例(enc)。只需丢弃encaesProgram的代码,从enc实例中编写正确的KeyIV即可。

IV不是秘密的,所以你可以把它和密文一起发送。通常,它只是简单地先于密文,并在解密前被分割掉。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43513795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档