我正在尝试加密一个字符串,其中一部分是用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 ....
所以这两个问题是:
这是家庭作业,感谢任何帮助。
感谢名单!
答案 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(...)
可能无法生成预期的字符,因为给定的字节对于平台默认编码无效。