XOR-解释3行

时间:2018-11-26 13:15:52

标签: java encryption xor rawstring

我们正在做一个学校项目,需要逐行解释代码。我们需要解释以下3行:

// TODO: This is where the magic of XOR is happening. Are you able to explain what is going on?
for (int i = 0; i < rawString.length(); i++) {
    thisIsEncrypted.append((char) (rawString.charAt(i) ^ key[i % key.length]));
}

有人可以帮助我们吗?这是我们需要完成的最后几行。

先谢谢您! :-)

最好的问候, 卡斯珀

1 个答案:

答案 0 :(得分:0)

如果您查看按位运算XOR,它将执行以下操作:

0^0 = 0
1^0 = 1
0^1 = 1
1^1 = 0

这对于加密非常有用,因为如果您有:

original_value ^ key = encrypted_value

然后可以使用相同的密钥通过异或将加密的值转换回原始值:

encrypted_value ^ key = original_value

因此,在您的示例中,您有一个原始字符串,然后是加密字符串,并且要对原始脚本中的每个字符进行加密,它使用XOR和密钥中的字符进行加密。由于密钥长度与原始字符串长度不同,因此使用模数(%)来获取密钥的相应位置。例如,如果它们的键长为3个字符,则原始字符串中的每三个字符都将使用键中的相同字符进行编码。

基本上,进行相反的调用会将您的加密字符串转换回原始字符串。举例说明:

    String rawString="Give me A on my homework!";
    char[] key="OH no!".toCharArray();
    StringBuilder thisIsEncrypted=new StringBuilder();

    for (int i = 0; i < rawString.length(); i++) {
        thisIsEncrypted.append((char) (rawString.charAt(i) ^ key[i % key.length]));
    }

    // Now we have encrypted it - lets decrypt

    rawString=thisIsEncrypted.toString();
    thisIsEncrypted=new StringBuilder();
    for (int i = 0; i < rawString.length(); i++) {
        thisIsEncrypted.append((char) (rawString.charAt(i) ^ key[i % key.length]));
    }
    System.out.println("This was encrypted and then decrypted: "+thisIsEncrypted);