JAVA中的两个字符串异或

JAVA中的两个字符串异或,java,string,encryption,xor,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 ba

我试图加密一个字符串,其中一部分是用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", "");

}
}
导入sun.misc.base64解码器;
导入sun.misc.base64编码器;
导入java.io.IOException;
公共类StringXORer{
公共字符串编码(字符串s、字符串键){
返回base64Encode(xorWithKey(s.getBytes(),key.getBytes());
}
公共字符串解码(字符串s、字符串键){
返回新字符串(xorWithKey(base64Decode,key.getBytes());
}
专用字节[]xorWithKey(字节[]a,字节[]key){
byte[]out=新字节[a.length];
for(int i=0;i
除了两个问题外,它似乎有效: 结果字符串变长。当我尝试在“abcdefgh”和“abcdefgh”之间进行异或运算时,我得到了:“aaaaaaaaaaaa”。 第二,两个相同字符串的结果变为“aaaa…”,即“a”的字符串

因此,这两个问题是:

  • 为什么结果字符串变长了
  • 为什么相同字符串之间的异或结果由“a”的列表组成
  • 这是作业,谢谢你的帮助


    塔克斯

    字符串变得更长,因为除了用键对其进行XORing外,还对其进行了编码

    新字符串(…)
    替换对
    base64Encode(…)
    的调用,用
    s.getBytes()
    替换对
    base64Decode(…)
    的调用,以获取原始XORed字符串。但是请注意,编码的字符串在打印时看起来不太好。与自身异或的字符串将由
    \0
    字符组成,打印为空白


    即使在该更改之后,也可能返回比字符串长度更长的字节数组,具体取决于平台默认字符集。例如,UTF-8将大于等于128的字符编码为两个或三个字节。使用ISO-8859-1作为具有1对1字符对应关系的字符集为什么。。。您正在使用sun.misc.Base64解码器吗?我没有。它带有代码,所以我把它放在那里,直到确定我不需要它。也许这会对你有所帮助:我做了你告诉我的,它工作了,但在30回合后就坏了。我想添加截图,但不知道如何在这里做到这一点,所以我上传了带有截图的zip文件:你们可以在那个里看到整数。大约在第50轮,它变得太慢了,在我出现一些记忆故障之后的某个地方——这就是为什么我首先问这个问题的原因。知道那里发生了什么吗?顺便说一句,IV和CBC加密方案一样不断变化(XOR的结果变成新的IV)。你能检查一下用相同的密钥加密然后解密一个字符串会产生原始字符串吗?如果失败,您可能需要使用
    getBytes()
    newstring()
    方法指定字符集
    “ISO-8859-1”
    。请参考JavaDoc以了解如何做到这一点。它确实会生成原始字符串。谢谢你的帮助。@DanaRoot我的建议解决了你的问题吗?如果是这样,你应该接受我的回答。如果没有,您可以提供更多详细信息,例如,您是否将原因定位在其他地方。因为这是家庭作业,你自己可能不感兴趣,这也没关系。