XOR解密两个明文字符串

时间:2016-10-01 01:11:08

标签: java encryption binary xor

我在AP Java类中被分配以解密以下内容: 的 umzDlBF8aFix

使用以下键: 的 oE2dpffzEiFD

唯一的问题是我不知道怎么做XOR来解密这些。我已经把它们变成二进制了:

key: 101000 | 000100 | 110110 | 011101 | 101001 | 011111 | 110011 | 000100 | 100010 | 000101 | 000011

密文: 110110 | 100110 | 110011 | 100101 | 000001 | 111100 | 011010 | 000101 | 100011 | 110001

但我不知道该怎么做。如果你可以帮助我,那就太好了!代码也很好,但不需要。

万分感谢!

3 个答案:

答案 0 :(得分:0)

XOR运算符具有T XOR K XOR K == T的属性,因此如果要使用密钥K加密明文T,则应用操作C = T XOR K,以便解密文本你只需要再次应用相同的操作(T = C XOR K)。您可以使用for循环或函数式编程映射将XOR操作应用于明文中的每个字节。

编辑:如果你需要它,编程语言中的XOR运算符用字符“^”表示,所以A ^ B表示A XOR B.

EDIT2:简单证明T XOR K XOR K == T,这样你就不必接受它就像魔术一样:

  • K XOR K明显等于0
  • T XOR 0明显等于T
  • 由于XOR运算符与二进制数相关联,因此我们可以将T XOR K XOR K写为T XOR(K XOR K)== T XOR 0 == T

答案 1 :(得分:0)

您无需将其转换为二进制。 XOR是一个按位运算,因此你可以将两个字节一起异或,就像将一个字节的每个位与另一个字节的相应位进行异或运算一样。

只需编写一个从零开始到(并排除)密码长度的循环,在密码中读取密码中的每个字符,将其与密钥中的相应字符进行异或,并将结果附加到StringBuilder。然后在StringBuilder上调用.toString()以获得结果。

如果您的编译器抱怨它不能XOR字符,那么将每个char强制转换为byte,在字节之间执行XOR,然后将结果转换为char。< / p>

String类有charAt()方法,允许您从字符串中的特定索引获取字符。或者,您可以首先获取每个字符串的内容作为char数组。 (还有另一个功能。)

作为奖励,您可以将其设置为使密钥的长度不必与密码相同。您可以维护一个单独的索引来寻址密码的字符,当此索引达到密码的长度时,您可以将其设置回零,从而开始从头开始读取密码。

答案 2 :(得分:0)

正如其他人所说,&#34; xor&#34;是一种很棒的加密机制,因为加密和解密操作完全相同。如果您只使用密钥的每个部分一次,则可以使用最安全的加密算法。

如果您重复使用密钥的任何部分,它将变成最糟糕的加密机制之一,因为这样很容易破解。

您遇到的问题是 - 如何从字符转到要加密的值。 您可以使用Unicode字符值,但是您的密文和密钥会导致伪造的结果。使用Unicode的问题还在于你可能在加密/解密后得到不可打印的字符,这通常不是问题,但在教科书示例中很难打印不可打印的字符。

为了解密你的文字,我假设字符的翻译是这样的。

  • A - Z =&gt; 0 - 25
  • a - z =&gt; 26 - 51
  • 0 - 9 =&gt; 52 - 61

(我不需要猜测62/63会是什么,但空间和点数会很好猜测。)

使用该假设和xor,我会使用您的密文umzDlBF8aFix和您的密钥oE2dpffzEiFD,最后得到明文GiFeMeaPenny

因为这是可读的英语 - &#34; 给我一分钱&#34; - 看起来上面的假设似乎是合理的。

相关问题