如何使用字节数组作为键来XOR



我正在尝试使用XOR加密编码字符串,并使用byte array作为键:

String encodedString = myString XOR myKey

我对密码学没有太多经验,所以我还没有找到实现这一目标的方法。

作为此问题的更新,我发现myKey也是字符串,其长度与myString

相同
String encodedString = myString XOR myKey

这是不正确的。Java中的字符串可能具有任何编码。字符串的编码是使用特定字符 intes 的表示表示,即字节数组。

所以您会做:

byte[] encodedString = myString.getBytes(StandardCharsets.UTF_8);

检索字节。

然后,您可以使用索引在encodedString的字节上迭代。您将在二进制密钥中的同一位置将字节放在同一位置,然后将两个字节组合在一起。结果可以放入与encodedString相同大小的新数组中。请注意,Java有点奇怪,因为您可能需要将其铸造回字节值才能做到这一点,即result[i] = (byte) xorResult

通常,如果键中的字节用完,则必须将密钥内的索引再次重置为零。如果发生这种情况,您的加密方案将变得容易受到攻击,因为一次性pad(OTP(是安全的,但是XOR Cipher肯定不是。

解密后,这与加密相同,您可以使用:

将字符串恢复。
String myString = new String(encodedString, StandardCharsets.UTF_8);

显然,如果是字符串,则必须为密钥执行相同的操作。但是请注意,即使键分布在可打印字符上, bit value 也可能不是分布良好。换句话说,作为XOR键的字符串使您容易受到加密分析的影响,尤其是对位和字节的频率分析。


XOR将导致随机字节,因此您可能需要基于64 Encode(加密后(/解码(解密之前(以获取Ciphertext String而不是字节数组。


我故意省略了代码来执行此操作,因为这是一个练习作业,很有趣!

终于得到了!

希望这对别人有用。

这对我有用(2个字符串中的XOR(:

public static 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 static char toHex(int nybble) {
    if (nybble < 0 || nybble > 15) {
        throw new IllegalArgumentException();
    }
    return "0123456789ABCDEF".charAt(nybble);
}

最新更新