3

我正在尝试加密一个字符串,其中一部分是用 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”之间进行异或时,我得到:“aaaaaaaaaaaa”。其次,两个相同字符串的结果变为“aaaa....” - 字符串“a”s....

所以这两个问题是:

  1. 为什么结果字符串变长了?
  2. 为什么相同字符串之间的异或结果由“a”列表组成......?

这是作业,感谢任何帮助。

谢谢!

4

1 回答 1

2

字符串变长了,因为除了与密钥进行异或之外,它还经过Base64编码。

替换对base64Encode(...)withnew String(...)base64Decode(s)with的调用s.getBytes()以获得原始的 XORed 字符串。但请注意,编码后的字符串在打印时看起来不太好。与自身进行异或的字符串将由\0字符组成,这些字符被打印为空格。

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

于 2012-04-18T19:27:20.900 回答