ホームページ  >  記事  >  Java  >  バイト配列と文字列の間でデータを暗号化する際の変換の問題を回避するにはどうすればよいですか?

バイト配列と文字列の間でデータを暗号化する際の変換の問題を回避するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-19 09:15:03253ブラウズ

How Do I Avoid Conversion Issues When Encrypting Data Between Byte Arrays and Strings?

暗号化におけるバイト配列と文字列の間の変換の問題に対処する

暗号化のコンテキストでは、バイト配列を文字列に変換したり逆に変換したりすると、値の不一致が発生することが多く、課題が生じる可能性があります。そして復号化エラー。ここでは、これらの問題の調査と詳細な解決策を説明します。

次の暗号化シナリオを考えてみましょう:

public class NewEncrypter {

    // Encryption and decryption are performed on byte arrays, not strings
    public byte[] encrypt(String input) throws Exception {
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return cipher.doFinal(input.getBytes("UTF-16"));
    }

    public String decrypt(byte[] encryptionBytes) throws Exception {
        cipher.init(Cipher.DECRYPT_MODE, key);
        return new String(cipher.doFinal(encryptionBytes), "UTF-16");
    }
}

ただし、暗号化されたデータを文字列として保存することは、人間が判読できるようにすることを目的としているため、推奨されません。任意のバイナリ データではなく、テキストです。それが避けられない場合は、バイトと文字の間の 1 対 1 マッピングのエンコーディングを使用することが重要です。

ISO-8859-1 エンコーディング

この特定のシナリオの場合、ISO-8859-1 エンコーディングは次のとおりです。推奨:

    String decoded = new String(encryptedByteArray, "ISO-8859-1");
    byte[] encoded = decoded.getBytes("ISO-8859-1");

一般的なエンコーディングの落とし穴の回避

UTF-16 エンコーディングでは、次の理由で問題が発生する可能性があります。

  • String.getBytes(" UTF-16") はバイトオーダーマーカーを追加します文字。
  • すべてのバイト シーケンスを UTF-16 文字にマッピングできるわけではありません (例: 無効な文字マッピングを持つ 4 バイト シーケンス)。

代替エンコーディング

ISO-8859-1 が要件を満たしていない場合は、使用を検討してください。 16 進数または Base64 エンコーディング。ただし、これらは標準 API で定義されていないため、追加のヘルパー ライブラリが必要です。

これらのガイドラインに従い、適切なエンコードを使用することで、暗号化プロセスにおけるバイト配列と文字列の不一致を解決できます。

以上がバイト配列と文字列の間でデータを暗号化する際の変換の問題を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。