将XOR更改为XNOR

时间:2013-03-09 20:49:17

标签: python bit-manipulation bitwise-operators xor bitwise-xor

我正在处理其密钥未知的XNOR加密文件。我想修改这里提供的xortool:https://github.com/hellman/xortool以用于XNOR加密。

显然,只有两行使用'^'运算符。所以我尝试使用〜运算符将它们更改为xnor。但我无法获得所需的输出。我怎么能做到这一点?

编辑:代码仅在xortool.py

的第248行使用'^'运算符
key_possible_bytes[offset] += chr(ord(char) ^ most_char)

并在routine.py中的第75行

 ret[index] = (chr(ord(char) ^ ord(key[index % len(key)])))

所以我在他们两个之前加了一个〜运算符。

3 个答案:

答案 0 :(得分:6)

a ^ b的所有实例替换为~(a ^ b),以将XOR操作更改为XNOR操作。务必将not操作符插入正确的位置,以确保正确的操作顺序!

使用您的特定代码示例:

key_possible_bytes[offset] += chr( ~(ord(char) ^ most_char) )

ret[index] = (chr( ~(ord(char) ^ ord(key[index % len(key)])) ))

答案 1 :(得分:0)

从最大值中减去。

如果你是'xoring' 8位值,这将完成工作:

0xff - (0xf0 ^ 0x0f)

答案 2 :(得分:0)

这个问题是针对 Python 中的按位运算符,但对于那些(像我一样)处理布尔值的人来说,上述版本的 XNOR 没有按预期工作:

In [1]: for i in [True, False]:
   ...:     for j in [True, False]:
   ...:         print(i, j, ' = ', ~(i^j))
   ...: 
True True  =  -1
True False  =  -2
False True  =  -2
False False  =  -1

相反,您需要使用 not 而不是 ~

In [2]: for i in [True, False]:
   ...:     for j in [True, False]:
   ...:         print(i, j, ' = ', not (i^j))
   ...: 
True True  =  True
True False  =  False
False True  =  False
False False  =  True