【问题标题】:C# AES Decryption returns 0x3F (0011 1111) when byte value > 127当字节值 > 127 时,C# AES 解密返回 0x3F (0011 1111)
【发布时间】:2020-10-27 06:01:30
【问题描述】:

我正在尝试使用 AES 256 加密/解密二进制文件。 当我加密它时,显然字节没有问题。 但是,当我解密加密的二进制文件时,它会返回一个包含大量字节 = 0x3F (0011 1111) 的新二进制文件。我认为这些字节是 > 127 值,因为正确解密的其他字节是

我认为存在符号问题,但我使用的是接受 0 到 255 值的字节类型。 其他可能性是编码问题。

我的解密函数:

                static public byte[] AESDecrypt(byte[] ct, byte[] key, byte[] IV)
    {
        byte[] ret = new byte[ct.Length];

        Aes AES = Aes.Create();
        ICryptoTransform Decryptor = AES.CreateDecryptor(key, IV);

        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, Decryptor, CryptoStreamMode.Write))
                cs.Write(ct, 0, ct.Length);

            ret = ms.ToArray();
        }

        return ret;
    }

cs.Write() 已经为每个大于 127 的字节返回一个 int 值 = 0x3F。

函数调用:

byte[] pt = { 128, (byte)'t', (byte)'e', (byte)'s', (byte)'t' };
        byte[] ct = AESEncrypt(pt, AESStorageKey, AESStorageIV);
        byte[] pt2 = AESDecrypt(ct, AESStorageKey, AESStorageIV);
        txtPassword.Text = pt[0].ToString() + " " + ct[0].ToString() + " " + pt2[0].ToString();

TextBox 中的输出为:“128 183 63” 请注意,63 是 0x3F 值(0011 1111),但正确返回的应该是 128。


好的,在您对 StreamReader/StreamWriter 和二进制处理的帮助下,我发现了错误。那是在 Encrypt 函数中,因为我使用 StreamWriter 来处理二进制数据。现在我已经修好了!谢谢大家!

加密函数:

        static public byte[] AESEncrypt(byte[] pt, byte[] key, byte[] IV)
    {
        byte[] ret;

        AesManaged AES = new AesManaged();
        ICryptoTransform Encryptor = AES.CreateEncryptor(key, IV);

        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, Encryptor, CryptoStreamMode.Write))
                cs.Write(pt, 0, pt.Length); //The correct binary handling

            // Here was the error before:
            //using (StreamWriter sw = new StreamWriter(cs))
            //  sw.Write(Encoding.ASCII.GetString(pt));

            ret = ms.ToArray();
        }

        return ret;
    }

【问题讨论】:

  • 如果您将字节 in 传递给此方法,并检索此方法的字节 out,您为什么要搞乱 字符串?从您的编码和解码路径中删除任何字符串类型的代码,这样会更快乐。
  • 我正在尝试加密/解密二进制文件... 那么不应使用StreamReader,它只会损坏您的数据。

标签: c# encryption cryptography aes unsigned


【解决方案1】:

StreamReader 默认使用 UTF-8。我认为你应该改用Encoding.UTF8.GetBytes()

【讨论】:

  • 没有。 StreamReader 根本不应该被使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 2019-05-08
  • 1970-01-01
相关资源
最近更新 更多