[英]XOR Cipher in Python: Two Methods With Two Results?
最近,我一直在探索Python中的XOR密码。 我有两种“工作”方法:
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
作为我的钥匙:
XORcipher = Usx!un!dobsxqu!uihr!ldrr`fd!trhof!YNS!dobsxquhno /
和
XORcipher2 = fAKF \\ V \\ P @ JBGGZZA_VA @ STWG @ [] Uj |`W] QAKCFZ]]
如果有人可以帮助我更好地理解这些结果,我将不胜感激!
对于第一个功能,始终使用键中的最后一个字符。 这是因为每次迭代时,它都会在for循环中分配给character
,并丢弃最后一个字符,直到您迭代到最后为止。
对于第二个,采用纯文本"abc"
和键"42"
。 "a"
用"4"
加密。 在使用cycle()
,再次将"b"
与"2"
和"c"
与"4"
一起使用,因此它可以返回到开头。
与所述第一功能,它是"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)
在第一种情况下,对于明文的每个字母,您要对键的每个字符执行异或运算。 如果执行XORcipher2('foo', 'bar')
则序列为:
chr(ord('f') ^ ord('b')) # '\x04'
chr(ord('\x04') ^ ord('a')) # ´e´
chr(ord('e') ^ ord('r')) # '\x17'
output += '\x17'
chr(ord('o') ^ ord('b')) # '\r'
chr(ord('\r') ^ ord('a')) # 'e'
chr(ord('l') ^ ord('r')) # '\x1e'
output += '\x1e'
chr(ord('o') ^ ord('b'))
chr(ord('\r') ^ ord('a'))
chr(ord('l') ^ ord('r'))
output += '\x1e'
可能您真正想要的是(假设您希望使用itertools
替代算法):
def XORcipher(plaintext, key):
output = ""
for i, character in enumerate(plaintext):
output += chr(ord(character) ^ ord(key[i % len(key)]))
return output
证明:
>>> XORcipher('foo', 'bar')
'\x04\x0e\x1d'
>>> XORcipher2('foo', 'bar')
'\x04\x0e\x1d'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.