3

文字列を暗号化しようとしています。その一部は、テキストを IV 文字列で XOR することです。いくつかの困難があった後、私はスタックオーバーフローになり、男が次のコードを与えました:

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;

public class StringXORer {

public String encode(String s, String key) {
    return base64Encode(xorWithKey(s.getBytes(), key.getBytes()));
}

public String decode(String s, String key) {
    return new String(xorWithKey(base64Decode(s), key.getBytes()));
}

private byte[] xorWithKey(byte[] a, byte[] key) {
    byte[] out = new byte[a.length];
    for (int i = 0; i < a.length; i++) {
        out[i] = (byte) (a[i] ^ key[i%key.length]);
    }
    return out;
}

private byte[] base64Decode(String s) {
    try {
        BASE64Decoder d = new BASE64Decoder();
        return d.decodeBuffer(s);
    } catch (IOException e) {throw new RuntimeException(e);}
}

private String base64Encode(byte[] bytes) {
    BASE64Encoder enc = new BASE64Encoder();
    return enc.encode(bytes).replaceAll("\\s", "");

}
}

結果の文字列が長くなるという 2 つの問題を除いて、動作しているように見えました。「abcdefgh」と「abcdefgh」の間で XOR を実行しようとすると、「aaaaaaaaaaaa」が得られました。次に、2 つの同一の文字列の結果は "aaaa...." - "a" の文字列....

したがって、2つの質問は次のとおりです。

  1. 結果の文字列が長くなるのはなぜですか?
  2. 同一文字列間の XOR の結果が "a" のリストで構成されるのはなぜですか?

これは宿題です。助けていただければ幸いです。

ありがとう!

4

1 に答える 1

2

キーとの XOR 演算に加えて、Base64でエンコードされているため、文字列が長くなります。

元の XOR された文字列を取得するために、への呼び出しをbase64Encode(...)new String(...)に置き換えます。ただし、エンコードされた文字列は印刷すると見栄えがよくないことに注意してください。それ自体と XOR された文字列は文字で構成され、空白として出力されます。base64Decode(s)s.getBytes()\0

その変更後でもgetBytes()、プラットフォームのデフォルトの文字セットによっては、文字列の長さよりも長いバイト配列を返す可能性があります。たとえば、UTF-8 は文字 >= 128 を 2 バイトまたは 3 バイトとしてエンコードします。ISO-8859-1 を、文字 <= 255 とバイトの 1 対 1 対応の文字セットとして使用します。同様に、new String(...)指定されたバイトがプラットフォームの既定のエンコーディングに対して有効でないため、期待される文字を生成できない可能性があります。

于 2012-04-18T19:27:20.900 に答える