ホームページ > バックエンド開発 > C++ > .NET 6 の復号化で .NET 5 で暗号化された文字列が切断されるのはなぜですか?

.NET 6 の復号化で .NET 5 で暗号化された文字列が切断されるのはなぜですか?

Susan Sarandon
リリース: 2025-01-01 14:47:10
オリジナル
1039 人が閲覧しました

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

.Net 6 の復号化カットオフの問題のトラブルシューティング

.Net 5 から .Net 6 にアップグレードすると、文字列が次の方法で暗号化されるという問題が発生します。質問で提供されたものと同様の暗号化クラスは、復号化中に切断されます。この問題は .Net 6 を使用している場合にのみ発生し、次の動作が発生します:

入力: "12345678901234567890"

.NET 5 出力: "12345678901234567890"

.NET 6 出力: "1234567890123456"

長さの違いは顕著であり、原因は、次のような .Net 6 の重大な変更にあります。のようなストリームの動作CryptoStream.

.Net 6 の重大な変更

.Net 6 以降、Read() または ReadAsync() を使用したスト​​リームからの読み取りは、次のいずれかの時点で完了するようになりました。次の条件が満たされています:

  1. 少なくとも 1 バイトが
  2. 基になるストリームは読み取り呼び出しから 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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート