java - JAVA中不同长度的XOR Hex String

标签 java cryptography

我有两个字符串

String s1="426F62";
String s2="457665";

字符串以十六进制表示。我想对它们进行异或。通常逐个字符进行异或运算会为除 F XOR 6 之外的其他人提供正确的结果。(它给出 112,答案应该是 9)

请告诉我在JAVA中的正确实现方式

编辑:转换为 int 和 xoring 有效。但是当两个字符串的长度不同时如何异或。

最佳答案

与其对 Unicode 表示进行异或运算,只需将每个字符转换为它所代表的十六进制数字,对这些进行异或运算,然后再将其转换回十六进制。你仍然可以一次做一个字符:

public String xorHex(String a, String b) {
    // TODO: Validation
    char[] chars = new char[a.length()];
    for (int i = 0; i < chars.length; i++) {
        chars[i] = toHex(fromHex(a.charAt(i)) ^ fromHex(b.charAt(i)));
    }
    return new String(chars);
}

private static int fromHex(char c) {
    if (c >= '0' && c <= '9') {
        return c - '0';
    }
    if (c >= 'A' && c <= 'F') {
        return c - 'A' + 10;
    }
    if (c >= 'a' && c <= 'f') {
        return c - 'a' + 10;
    }
    throw new IllegalArgumentException();
}

private char toHex(int nybble) {
    if (nybble < 0 || nybble > 15) {
        throw new IllegalArgumentException();
    }
    return "0123456789ABCDEF".charAt(nybble);
}

请注意,无论字符串有多长(只要它们的长度相同),这都应该有效,并且永远不需要担心负值 - 您总是会得到每对字符的异或结果。

关于java - JAVA中不同长度的XOR Hex String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9840675/

相关文章:

java - Eclipse 中 C 代码的语法树

java - 空 Java 字符串的大小

java - 使用指定键合并嵌套 map

C# 我如何进行加密?

java - 生成SER证书文件

java - Apache POI XSLF 将图像替换为另一个图像

java - 使用 postman 方式获得 200,但使用放心邮寄方式获得 400

java - 如何从 AES-256 切换到 AES-128?

iphone - 函数 'sqlite3_key' 的隐式声明?

java - 是否可以在不提供整个转换的情况下检查特定密码 block 模式支持?