首頁 > 後端開發 > C++ > 為什麼升級到 .NET 6 後我的解密字串被截斷?

為什麼升級到 .NET 6 後我的解密字串被截斷?

Patricia Arquette
發布: 2025-01-01 01:28:13
原創
477 人瀏覽過

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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板