暗号化されたバイト配列を文字列に変換できないのはなぜですか?

Susan Sarandon
リリース: 2024-11-16 15:02:02
オリジナル
178 人が閲覧しました

Why Can't I Just Convert My Encrypted Byte Array to a String?

暗号化中のバイト配列から文字列への変換の課題

暗号化操作にバイト配列と文字列の両方が含まれる場合、これらの形式間の変換では、不一致が生じ、復号化プロセスに影響を与えます。これらの違いの背後にある理由を調べ、考えられる解決策を検討してみましょう。

エンコーディングと不一致

バイト配列から文字列に変換する場合、エンコーディングの選択は重要な役割を果たします。 UTF-8、UTF-16 などのエンコーディングでは、バイトと文字間の 1 対 1 の対応が維持されない場合があります。これは、同じバイト シーケンスがさまざまなエンコーディングで異なる文字を表す可能性があり、不一致が生じる可能性があることを意味します。

UTF-16 の落とし穴

具体的には、UTF-16 を使用する場合、次の 2 つの点が発生します。主要な要素が変換の問題の原因となる可能性があります:

  1. バイト オーダー マーク: String.getBytes("UTF-16") は、バイトに影響を与えるバイト オーダー マーカー文字を出力に追加します。この問題を回避するには、代わりに UTF-16LE または UTF-16BE を使用する必要があります。
  2. Unicode 範囲を超える: UTF-16 は、4 バイト シーケンスを使用して U FFFF を超える Unicode 文字に対応します。ただし、このシーケンス内の最初の 2 バイトは UTF-16 文字をエンコードできないため、変換中に不一致が発生する可能性があります。

推奨アプローチ

これらのエンコードを回避するには関連の課題があるため、通常は、暗号化されたデータを文字列ではなくバイト配列に保存することをお勧めします。バイナリ データは byte[] として処理するのが最適です。ただし、文字列の保存が必要な場合は、1 対 1 のバイト文字マッピングを使用するエンコーディングを選択することが重要です。この目的で推奨されるエンコーディングの 1 つは、ISO-8859-1:

String decoded = new String(encryptedByteArray, "ISO-8859-1");
byte[] encoded = decoded.getBytes("ISO-8859-1");
ログイン後にコピー

です。あるいは、16 進数や Base64 などの他のエンコーディングでもデータの整合性を維持できますが、これらを実装するには外部ライブラリが必要です。

以上が暗号化されたバイト配列を文字列に変換できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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