c# - 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));
解决方案
当您使用StreamWriter(encryptStream, Encoding.UTF8)
时,这将添加 3 个字节的 Unicode BOM(字节顺序标记)。为避免这种情况,请new StreamWriter(m, new UTF8Encoding())
改用。
Encoding.UTF8.GetBytes
即使设置了编码来执行此操作,也不会添加 BOM - 如果需要,您可以使用它来检索它GetPreamble
。
推荐阅读
- javascript - 交替合并两个不同长度的数组,JavaScript
- javascript - JS/HTML:合并从表中的列中选择的多个
- matlab - 如何使用 matlab2018a 获得希尔伯特边缘谱?
- jms - 无法使用 Solace JMS 订阅持久主题
- javascript - Gijgo Datepicker 上个月和下个月图标更改
- arduino - 如何仅在使用 Arduino 按住按钮时激活此音频和 LED?
- ruby - Jekyll:尽管安装了最新版本,但找不到命令问题
- javascript - 不知道我的简单代码有什么问题
- python - Swift/Python 引用计数差异
- mongodb - 使用 Schema First 方法和 NestJS 在 Mongoose 中填充查询