升级到 .Net 6 时出现问题 - 加密字符串
将项目从 .Net 5 升级到 .Net 6 时出现问题使用加密/解密类解密字符串时出现问题。结果是根据输入字符串的长度在某个点截断的解密字符串。
原因
流相关类的行为发生变化例如 .Net 6 中的 CryptoStream。在以前的版本中,这些类在完成读取操作之前从缓冲区读取所有字节或到达流的末尾。在 .Net 6 中,它们在读取至少一个字节后或从底层流的读取调用返回 0 后完成。
受影响的代码
问题出现在加密类的 Decrypt 方法,特别是使用缓冲区从 CryptoStream 读取解密的字节已修复:
var plainTextBytes = new byte[cipherTextBytes.Length]; var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
解决方案
要解决该问题,需要检查 CryptoStream 实际读取的字节数并相应调整读取。这可以通过在读取操作后检查 MemoryStream 的 Length 属性来完成。
或者,更好的方法是使用 CryptoStream 的 CopyTo 方法或直接在 CryptoStream 之上创建 StreamReader。这些方法确保读取并返回所有解密的字节:
// Usando CopyTo using (var plainTextStream = new MemoryStream()) { cryptoStream.CopyTo(plainTextStream); var plainTextBytes = plainTextStream.ToArray(); return Encoding.UTF8.GetString(plainTextBytes, 0, plainTextBytes.Length); } // Usando StreamReader using (var plainTextReader = new StreamReader(cryptoStream)) { return plainTextReader.ReadToEnd(); }
以上是为什么从 .NET 5 升级后我的 .NET 6 字符串解密被截断?的详细内容。更多信息请关注PHP中文网其他相关文章!