在JAVA中对两个字符串进行异或运算

3

我正在尝试加密一个字符串,其中的一部分是将文本与IV字符串进行XOR运算。 在遇到一些困难后,我最终在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时,我得到:"aaaaaaaaaaaa"。

其次,两个相同字符串的结果变成了"aaaa...."——一串"a"....

因此,这两个问题是:

  1. 为什么结果字符串会变得更长?
  2. 为什么两个相同字符串之间进行XOR的结果包含一串"a"......?

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

谢谢!


为什么要使用 sun.misc.BASE64Decoder - trutheality
我不是。它随着代码一起提供,所以我把它留在那里,直到确定我不需要它为止。 - Dana Root
也许这可以帮到你:https://dev59.com/fHM_5IYBdhLWcg3w2W9g - yegor256
1个回答

2
字符串变长是因为除了使用密钥进行异或外,它还被Base64编码了。
将调用base64Encode(...)替换为new String(...),并将base64Decode(s)替换为s.getBytes(),以获取原始的异或字符串。但请注意,编码后的字符串在打印时不会显示良好。一个与自身异或的字符串将包含\0字符,这将作为空格打印。
即使进行了这种更改,根据平台默认字符集,getBytes() 仍可能返回比字符串长度更长的字节数组。例如,UTF-8会将大于等于128的字符编码为两个或三个字节。使用ISO-8859-1作为具有字符和字节之间一对一对应关系的字符集。同样,new String(...) 可能无法产生预期的字符,因为给定的字节对于平台默认编码无效。

我按照你告诉我的做了,它起作用了,但是在30轮之后出了问题。我想添加截图,但不确定如何在这里操作,所以我上传了一个带有截图的zip文件: http://www.2shared.com/file/O4B5MctP/steps.html 您可以在那里看到回合数。 大约在第50轮时,它变得太慢了,然后我遇到了一些内存故障——这就是我首先提出这个问题的原因。有什么想法吗?顺便说一下,IV在CBC加密方案中不断变化(XOR的结果成为新的IV)。 - Dana Root
你能检查一下使用相同密钥加密和解密字符串是否会得到原始字符串吗?如果失败了,你可能需要在 getBytes()new String() 方法中指定字符集 "ISO-8859-1"。请参考JavaDoc了解如何操作。 - Christian Semrau
感谢您的帮助。它确实产生了原始字符串。 - Dana Root
@DanaRoot,我的建议解决了你的问题吗?如果是这样,你应该接受我的答案。如果不是,你可以提供更多细节,例如你是否在其他地方找到了原因。由于这是作业,你可能对此不感兴趣,这也没关系。 - Christian Semrau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接