将XOR改为XNOR

3 投票
3 回答
28868 浏览
提问于 2025-04-17 18:32

我正在处理一个使用XNOR加密的文件,但我不知道它的密钥是什么。我想修改一个叫做xortool的工具,使它能够支持XNOR加密,这个工具可以在这里找到:https://github.com/hellman/xortool

看起来,代码里只有两行使用了'^'这个运算符。所以我尝试把它们改成用~运算符来实现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 个回答

1

从最大的值中减去。

如果你在处理8位的值,这样做就可以了:

0xff - (0xf0 ^ 0x0f)

3

这个问题是关于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
9

把所有的 a ^ b 替换成 ~(a ^ b),这样就把异或操作(XOR)变成了同或操作(XNOR)。记得把“非”操作符放在正确的位置,这样才能确保操作的顺序是对的!

根据你的具体代码示例:

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

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

撰写回答