【问题标题】:XOR - Explaining of 3 lines [closed]XOR - 解释 3 行 [关闭]
【发布时间】:2019-04-28 03:32:48
【问题描述】:

我们正在做一个学校项目,我们需要逐行解释代码。我们需要解释以下 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]));
}

谁能帮助我们?这是我们需要完成的最后几行。

提前感谢您! :-)

最好的问候, 卡斯帕

【问题讨论】:

  • 你要告诉我们key数组包含什么吗?
  • 我想这个练习的目的是找出那里发生了什么。如果我们告诉你,我们会毁了它。
  • 找出运算符 ^% 做了什么,然后你可能还会知道循环体实际上做了什么......
  • 要了解循环本身,想想(并可能尝试)没有^ key[i % key.length] 部分会发生什么。

标签: java encryption xor rawstring


【解决方案1】:

如果您查看按位运算 XOR,它会这样做:

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

这使得它对加密非常有用,因为如果你有:

original_value ^ key = encrypted_value

然后 encrypted_value 可以通过 XORing 与相同的 key 转换回 original_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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2011-06-10
    • 2011-03-31
    相关资源
    最近更新 更多