首页 >后端开发 >C++ >为什么我的 .NET 6 解密会切断 .NET 5 中加密的字符串?

为什么我的 .NET 6 解密会切断 .NET 5 中加密的字符串?

Susan Sarandon
Susan Sarandon原创
2025-01-01 14:47:101037浏览

Why Does My .NET 6 Decryption Cut Off Strings Encrypted in .NET 5?

解决 .Net 6 中的解密截止问题

从 .Net 5 升级到 .Net 6 时,会出现使用以下方式加密字符串的问题与问题中提供的加密类类似的加密类在解密过程中被切断。此问题仅在使用 .Net 6 时出现,导致以下行为:

输入: "12345678901234567890"

.NET 5 输出: "12345678901234567890"

.NET 6 输出: "1234567890123456"

长度差异非常明显,其原因在于 .Net 6 中与流的行为就像CryptoStream.

.Net 6 中的重大更改

从 .Net 6 开始,使用 Read() 或 ReadAsync() 从流中读取数据现在可以在以下任一情况下完成:满足以下条件:

  1. 至少读取一个字节流。
  2. 底层流从读取调用返回 0,表示没有更多数据可用。

对解密代码的影响

在提供的代码中,Decrypt() 方法中的以下部分是不受影响:

var plainTextBytes = new byte[cipherTextBytes.Length];
var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);

在 .Net 6 之前,CryptoStream 的行为确保在操作被视为完成之前缓冲区已完全填满或到达流的末尾。但是,在 .Net 6 中不再出现这种情况,当解密缓冲区未完全填充时,可能会导致数据丢失。

解决方案

解决此问题,您可以修改 Decrypt() 方法以确保所有字节都正确阅读:

  • 使用 CopyTo() 方法:

    using (var plainTextStream = new MemoryStream())
    {
        cryptoStream.CopyTo(plainTextStream);
        var plainTextBytes = plainTextStream.ToArray();
        return Encoding.UTF8.GetString(plainTextBytes, 0, plainTextBytes.Length);
    } 
  • 使用StreamReader.ReadToEnd():

    using (var plainTextReader = new StreamReader(cryptoStream))
    {
        return plainTextReader.ReadToEnd();
    }  

以上是为什么我的 .NET 6 解密会切断 .NET 5 中加密的字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

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