升級到.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中文網其他相關文章!