.NET 6 へのアップグレード時の復号化の問題: 文字列暗号化クラス
.NET 5 プロジェクトでは、ソリューションとして提供されたものはうまく機能しました。ただし、.NET 6 にアップグレードすると、復号化された文字列が特定の時点で切断されました。
問題分析
根本的な原因は、.NET 間の破壊的な変更にあります。 NET 5 および .NET 6。具体的には、DeflateStream、GZipStream、および CryptoStream の動作が他の Stream の動作と異なっています。
解像度
この変更は、暗号化クラスの Decrypt メソッドに影響します。以前は、cryptoStream.Read を呼び出す場合、バッファがいっぱいになるか、ストリームが最後に到達したときにのみ操作が完了すると予想されていました。ただし、.NET 6 では、1 バイトだけが読み取られた場合や、基になるストリームが 0 を返し、これ以上データが利用できない場合でも、cryptoStream.Read が完了するようになりました。
したがって、Decrypt メソッドを次のように更新する必要があります。この行為に適切に対処してください。解決策の 1 つは、cryptoStream.Read が実際に読み取るバイト数をチェックし、すべてのデータが読み取られることを確認することです:
var plainTextBytes = new byte[cipherTextBytes.Length]; var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
あるいは、CopyTo または StreamReader を使用して、より効率的で簡潔なコードを作成できます:
using (var plainTextStream = new MemoryStream()) { cryptoStream.CopyTo(plainTextStream); var plainTextBytes = plainTextStream.ToArray(); return Encoding.UTF8.GetString(plainTextBytes, 0, plainTextBytes.Length); }
using (var plainTextReader = new StreamReader(cryptoStream)) { return plainTextReader.ReadToEnd(); }
以上が.NET 5 から .NET 6 にアップグレードした後、文字列の復号化が中断されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。