在java中使用两个字符串的XOR操作

2022-08-31 17:30:16

如何在java中对两个字符串进行按位XOR操作。


答案 1

你想要这样的东西:

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", "");

    }
}

完成 base64 编码是因为对字符串的字节进行异或处理可能不会为字符串返回有效字节。


答案 2

注意:这仅适用于低字符,即低于0x8000,这适用于所有ASCII字符。

我会为每个charAt()做一个XOR来创建一个新的字符串。喜欢

String s, key;

StringBuilder sb = new StringBuilder();
for(int i = 0; i < s.length(); i++)
    sb.append((char)(s.charAt(i) ^ key.charAt(i % key.length())));
String result = sb.toString();

回应@user467257的评论

如果您的输入/输出是 utf-8,并且您是 “a” 和 “æ”,则剩下一个由一个字符(十进制 135,一个延续字符)组成的无效 utf-8 字符串。

它是正在被异或的值,但是字节值和这会产生一个字符,该字符是UTF-8编码的。char

public static void main(String... args) throws UnsupportedEncodingException {
    char ch1 = 'a';
    char ch2 = 'æ';
    char ch3 = (char) (ch1 ^ ch2);
    System.out.println((int) ch3 + " UTF-8 encoded is " + Arrays.toString(String.valueOf(ch3).getBytes("UTF-8")));
}

指纹

135 UTF-8 encoded is [-62, -121]