首页 >后端开发 >C++ >为什么升级到 .NET 6 后我的解密字符串被截断?

为什么升级到 .NET 6 后我的解密字符串被截断?

Patricia Arquette
Patricia Arquette原创
2025-01-01 01:28:13472浏览

Why Are My Decrypted Strings Truncated After Upgrading to .NET 6?

更新到 .NET 6 后加密字符串的问题

问题摘要:

将 .NET 项目更新为版本 6 中,人们发现与之前相比,加密字符串的解密会导致输出部分被截断原始输入。具体来说,解密字符串的一部分被截断,长度差异一致。

原因:

该问题源于影响 .NET 6 的重大更改像 CryptoStream 这样的流。以前,这些流的行为独特,直到所有提供的缓冲区空间被填满或到达流末尾时才完成读取操作。

使用 .NET 6,这些流现在与其他流的行为更加一致。如果使用长度为 N 的缓冲区执行读取操作,则在满足以下任一条件时完成:

  • 至少从流中读取一个字节,或者
  • 基础流从以下位置返回 0它自己的读取操作。

代码影响:

在提供的加密/解密代码中,正在使用的 CryptoStream 未正确考虑此更改。具体来说,代码无法检查解密过程中是否读取并返回所有字节。

解决方案:

要解决此问题,需要修改代码以确保它在解密期间读取所有可用字节。这可以通过使用以下方法之一来实现:

  • 使用 CopyTo: 此方法直接将所有数据从 CryptoStream 复制到新缓冲区,保证读取所有字节.
using (var plainTextStream = new MemoryStream())
{
    cryptoStream.CopyTo(plainTextStream);
    var plainTextBytes = plainTextStream.ToArray();
    return Encoding.UTF8.GetString(plainTextBytes, 0, plainTextBytes.Length);
} 
  • 使用StreamReader:由于明文是UTF8编码的,因此使用StreamReader直接从CryptoStream读取数据是一个方便的解决方案。
using (var plainTextReader = new StreamReader(cryptoStream))
{
    return plainTextReader.ReadToEnd();
}  

通过实现这些修复,代码将确保所有解密的字节都被捕获并作为输出字符串的一部分正确返回。

以上是为什么升级到 .NET 6 后我的解密字符串被截断?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn