首页 > 解决方案 > AES 加密和输入字符串编码

问题描述

有人可以解释一下为什么这两段代码没有给出相同的结果,而第二个示例中的 StreamWriter 使用的是 UTF8 编码:

var TokenEncryptKey = "D268197CF891452844441A143AAEAAEB";
        var key = Encoding.UTF8.GetBytes(TokenEncryptKey);

        var alg = new RijndaelManaged();
        alg.Key = key;
        alg.Mode = CipherMode.ECB;

        var mem = new MemoryStream();

        CryptoStream encryptStream = new CryptoStream(mem, alg.CreateEncryptor(), CryptoStreamMode.Write);

        var validReservation = Encoding.UTF8.GetBytes("AAAAAAAAAAAAAAAAAAAAAAA");
        encryptStream.Write(validReservation, 0, validReservation.Length);
        encryptStream.Flush();
        encryptStream.FlushFinalBlock();

        Console.Out.WriteLine(Convert.ToBase64String(mem.GetBuffer(), 0, (int)mem.Length));

第二个例子

var TokenEncryptKey = "D268197CF891452844441A143AAEAAEB";
        var key = Encoding.UTF8.GetBytes(TokenEncryptKey);

        var alg = new RijndaelManaged();
        alg.Key = key;
        alg.Mode = CipherMode.ECB;

        var mem = new MemoryStream();

        CryptoStream encryptStream = new CryptoStream(mem, alg.CreateEncryptor(), CryptoStreamMode.Write);

        StreamWriter sw = new StreamWriter(encryptStream, Encoding.UTF8);
        sw.Write("AAAAAAAAAAAAAAAAAAAAAAA");
        sw.Flush();
        encryptStream.FlushFinalBlock();

        Console.Out.WriteLine(Convert.ToBase64String(mem.GetBuffer(), 0, (int)mem.Length));

标签: c#encryptioncharacter-encoding

解决方案


当您使用StreamWriter(encryptStream, Encoding.UTF8)时,这将添加 3 个字节的 Unicode BOM(字节顺序标记)。为避免这种情况,请new StreamWriter(m, new UTF8Encoding())改用。

Encoding.UTF8.GetBytes即使设置了编码来执行此操作,也不会添加 BOM - 如果需要,您可以使用它来检索它GetPreamble


推荐阅读