首頁 > 後端開發 > C++ > 為什麼我的 .NET 6 解密會切斷 .NET 5 中加密的字串?

為什麼我的 .NET 6 解密會切斷 .NET 5 中加密的字串?

Susan Sarandon
發布: 2025-01-01 14:47:10
原創
1009 人瀏覽過

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

解決.Net 6 中的解密截止問題

從.Net 5 升級到.Net 6 時,會出現使用以下方式加密字串的問題與問題中提供的加密類別類似的加密類別在解密過程中被切斷。此問題僅在使用 .Net 6 時出現,導致以下行為:

輸入: "12345678901234567890"

. "12345678901234567890"

.NET 6 輸出: "1234567890123456"

長度差異非常明顯,其原因在於 .Net.Net 6.中與流的行為就像CryptoStream.

.Net 6 中的重大變更

從 .Net 6 開始,使用 Read() 或 ReadAsync()從流中讀取資料現在可以在以下任一情況下完成:滿足以下條件:

    至少讀取一個位元組流。
  1. 底層流從讀取呼叫傳回 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板