最近,我一直在探索Python中的异或密码。我有两种“工作”方法:
def XORcipher(plaintext, key):
output = ""
for character in plaintext:
for letter in key:
character = chr(ord(character) ^ ord(letter))
output += character
return output
和
def XORcipher2(plaintext, key):
from itertools import izip, cycle
return ''.join(chr(ord(x) ^ ord(y)) for (x,y) in izip(plaintext, cycle(key)))
这两个都能够加密给定的字符串并解密回来。我似乎无法理解为什么他们给出不同的结果。
使用23
作为我的 key :
XORcipher = Usx!un!dobsxqu!uihr!ldrr`fd!trhof!YNS!dobsxquhno/
和
XORcipher2 = fAKF\V\P@JBGGZZA_VA@STWG@[]Uj|`W]QAKCFZ]]
如果有人可以帮助我更好地理解这些结果,我将不胜感激!
最佳答案
对于第一个函数,始终使用键中的最后一个字符。这是因为每次迭代时它都会在 for 循环中分配给 character
,并丢弃最后一个字符,直到迭代到最后。
对于第二个,采用明文“abc”
和 key “42”
。 "a"
使用 "4"
加密。 "b"
与 "2"
和 "c"
再次与 "4"
一起使用,就像您使用 一样Cycle()
所以它会回到开头。
对于第一个函数,它是 "a"
与 "2"
、"b"
与 "2"
和 "c"
以及 "2"
。
要扩展列表理解,将是这样的:
from itertools import izip, cycle
def list_comp(plaintext, key):
return ''.join(chr(ord(x) ^ ord(y)) for (x,y) in izip(plaintext, cycle(key)))
def not_list_comp(plaintext, key):
temp = []
for x, y in izip(plaintext, cycle(key)):
temp.append(chr(ord(x) ^ ord(y)))
return ''.join(temp)
关于python - Python 中的异或密码 : Two Methods With Two Results?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28223911/