在JAVA中XOR两个字符串

时间:2012-04-18 19:13:44

标签: java string encryption xor

我正在尝试加密一个字符串,其中一部分是用IV字符串对文本进行异或。 遇到困难后,我最终进入了stackoverflow,其中一个人给出了以下代码:

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时,我得到了:“aaaaaaaaaaa”。 其次,两个相同字符串的结果变成“aaaa ....” - 字符串“a”s ....

所以这两个问题是:

  1. 为什么结果字符串会变长?
  2. 为什么相同字符串之间的XOR结果包含“a”的列表??
  3. 这是家庭作业,感谢任何帮助。

    感谢名单!

1 个答案:

答案 0 :(得分:2)

字符串变长,因为除了使用密钥对其进行异或,它还是Base64编码的。

base64Encode(...)new String(...)base64Decode(s)的电话号码替换为s.getBytes(),以获取原始的XORed字符串。但请注意,编码后的字符串在打印时看起来不太好。与自身进行异或的字符串将由\0个字符组成,并以白色空格打印。

即使在更改之后,getBytes()也可能返回比字符串长度更长的字节数组,具体取决于平台默认字符集。例如。 UTF-8将字符&gt; = 128编码为两个或三个字节。使用ISO-8859-1作为字符集,其中字符&lt; = 255和字节的对应关系为1对1。同样,new String(...)可能无法生成预期的字符,因为给定的字节对于平台默认编码无效。