python - Python 中的异或密码 : Two Methods With Two Results?

标签 python encryption xor

最近,我一直在探索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/

相关文章:

python - 将 numpy float64 稀疏矩阵转换为 pandas 数据框

python - 仅允许 pandas 数据框中的两列之间进行一对一映射

python - 获取 zeep.exceptions.ValidationError : Missing element for method that worked with suds

python - 比较子列表并合并它们

php - WSSE - XML SOAP 安全和 key 加密和存储 (EncryptedData/EncryptedKey)

html - 如何使html文件加密?

java - 使用java解密图像

python - 使用 XOR 运算符确定整数列表中是否存在重复项

boolean - 将 4 个与非门简化为 1 个异或门 boolean 代数?

Java 在 XOR 模式下绘制组件不绘制任何内容