.Net 6 の復号化カットオフの問題のトラブルシューティング
.Net 5 から .Net 6 にアップグレードすると、文字列が次の方法で暗号化されるという問題が発生します。質問で提供されたものと同様の暗号化クラスは、復号化中に切断されます。この問題は .Net 6 を使用している場合にのみ発生し、次の動作が発生します:
入力: "12345678901234567890"
.NET 5 出力: "12345678901234567890"
.NET 6 出力: "1234567890123456"
長さの違いは顕著であり、原因は、次のような .Net 6 の重大な変更にあります。のようなストリームの動作CryptoStream.
.Net 6 の重大な変更
.Net 6 以降、Read() または ReadAsync() を使用したストリームからの読み取りは、次のいずれかの時点で完了するようになりました。次の条件が満たされています:
復号化コードへの影響
提供されたコードでは、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 中国語 Web サイトの他の関連記事を参照してください。