升级到 .NET 6 时的解密问题:字符串加密类
在 .NET 5 项目中,类似于提供的一种解决方案效果很好。然而,升级到 .NET 6 后,解密的字符串在特定点被切断。
问题分析
根本原因在于 .NET 之间的重大更改。 NET 5 和 .NET 6。具体来说,DeflateStream、GZipStream 和 CryptoStream 的行为与其他 Stream 的行为有所不同类型。
分辨率
此更改会影响加密类中的 Decrypt 方法。以前,当调用 cryptoStream.Read 时,预计仅当缓冲区已满或流到达末尾时操作才会完成。然而,在 .NET 6 中,即使只读取了一个字节或底层流返回 0(表示没有更多数据可用),cryptoStream.Read 现在也会完成。
因此,Decrypt 方法需要更新为妥善处理这种行为。一种解决方案是检查 cryptoStream.Read 实际读取了多少字节并确保读取了所有数据:
var plainTextBytes = new byte[cipherTextBytes.Length]; var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
或者,可以使用 CopyTo 或 StreamReader 来获得更高效、简洁的代码:
using (var plainTextStream = new MemoryStream()) { cryptoStream.CopyTo(plainTextStream); var plainTextBytes = plainTextStream.ToArray(); return Encoding.UTF8.GetString(plainTextBytes, 0, plainTextBytes.Length); }
using (var plainTextReader = new StreamReader(cryptoStream)) { return plainTextReader.ReadToEnd(); }
以上是为什么从 .NET 5 升级到 .NET 6 后我的字符串解密被切断?的详细内容。更多信息请关注PHP中文网其他相关文章!