2

エンコーディングで文字をバイトに変換し、単項ビットごとの補数で反転するこのようなコードがあります〜最後に文字列に変換します。

その後、同様の方法で復号化したいと考えています。問題は、2 つの類似した入力文字列 (しかし同じではない) に対して、同じハッシュコードを持つ同じエンコードされた文字列を取得することです。

バイトが負であるため、String(bytes) メソッドは情報を失いますか、それとも暗号化部分を変更せずに何らかの方法で取得できますか?

ありがとう

static String encrypt(String s){
        byte[] bytes=s.getBytes();
        byte[] enc=new byte[bytes.length];

        for (int i=0;i<bytes.length;i++){

            enc[i]=(byte) ~bytes[i];
        }


        return new String(enc);
    }

 static String decrypt(String s){
 ...
4

2 に答える 2

7

を使用して、任意のバイナリ データをエンコードしないでください。new String(...)それはその目的ではありません。

さらに、デフォルトのプラットフォーム エンコーディングを使用することはほとんどありません。これは、エンコーディングを指定せずString.getBytes()に呼び出したときに得られるものです。new String(byte[])

一般に、暗号化はバイナリ データをバイナリ データに変換します。したがって、文字列を文字列に暗号化する通常のプロセスは次のとおりです。

  • 文字列を既知のエンコーディング (UTF-8 など) でバイトに変換します。
  • バイナリ データを暗号化する
  • base64 を使用して、暗号化されたバイナリ データを文字列に変換します。

Base64 は、任意のバイナリ データをロスレス方式で ASCII データとしてエンコードするために使用されます。復号化は、手順を逆にするだけです。

  • base64 テキストをバイト配列に戻す
  • バイト配列を復号化する
  • 復号化されたバイト配列を UTF-8 を使用して文字列としてデコードします

(あなたが現在持っているものは実際には暗号化ではないことに注意してください - それはせいぜい難読化です.)

于 2013-06-26T14:28:14.177 に答える
4

任意のバイトデータを効果的にString.

それはそのコンストラクターの目的ではありません。

を受け取るStringコンストラクタbyte[]は、プラットフォームのデフォルト エンコーディングのテキストを に変換するためのものですString。あなたが持っているのはテキストではないので、動作は「悪い」でしょう。

たとえば、プラットフォームのデフォルトのエンコーディングが 8 ビット エンコーディング (ISO-8859-* など) の場合、ランダムな文字のみが取得されます。

プラットフォームのデフォルトのエンコーディングが UTF-8 の場合、おそらくランダムな文字と、不正な形式のバイト シーケンスの置換文字が得られます。

要約すると、そうしないでください。あなたが達成しようとしていることは明らかではないので、代わりに何をすべきかはわかりません。

于 2013-06-26T14:27:32.410 に答える