Python中的XOR密码:有两个结果的两种方法?

时间:2015-01-29 20:23:38

标签: python encryption xor

最近,我一直在探索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!未!dobsxqu!uihr!ldrr`fd!trhof!YNS!dobsxquhno /

  

XORcipher2 =       fAKF符\ v \ 2P @ JBGGZZA_VA @ STWG @ [] Uj的|`W] QAKCFZ]

如果有人能帮助我更好地理解这些结果,我将不胜感激!

2 个答案:

答案 0 :(得分:1)

对于第一个函数,密钥中的最后一个字符始终使用。这是因为每次迭代时它都会在for循环中分配给character,并抛弃最后一个字符,直到你迭代到最后。

对于第二个,请使用明文"abc"和密钥"42""a"已使用"4"进行加密。使用"b"的{​​{1}}和使用"2"的{​​{1}} "c"再次使用"4",因此它会回到开头。

使用第一个函数,cycle()"a""2""b""2""c"

为了扩展列表理解,它将是:

"2"

答案 1 :(得分:0)

在第一种情况下,对于明文的每个字母,您正在使用密钥的每个字符执行xor。如果您执行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'