如何解密使用 XOR 加密的字符串

how to decrypt a string that is encrypted using XOR

我尝试使用 XOR 运算符加密字符串并以字母形式输出。现在,当我试图解密它时,我不会再得到该字符串。 加密密码:

string= "Onions"
keyword = "MELLON"

def xor(string, key):
    st=[]
    ke=[]
    xored=[]

    for i in string:
        asc= (ord(i))
        st.append(int(asc))
    print(st)

    for i in key:
        asc= (ord(i))
        ke.append(int(asc))
    print(ke)

    for i in range(len(string)):
        s1=st[i]
        k1=ke[i]
        abc = s1^k1
        le = ord('A')+abc
        ch = chr(le)
        if le> 90:
            le= le-26
            ch = chr(le)
        print(s1,k1)
        print('XOR =',abc)
        print(ch)
        xored.append(ch)
    print(xored)
    return("" . join(xored))

需要帮助!!

该算法不执行纯 XOR,而是将值 有条件地 映射到另一个值,从而导致不再是 bijective.[=14= 的关系]

来说明这一点。查看此脚本输出的内容:

keyword = "MELLON"
print(xor("Onions", keyword) == xor("OTGEHs", keyword))

会输出True!

所以这意味着您有两个加密为 相同 字符串的单词。这也意味着,如果你需要反过来,就没法知道这其中哪个才是真正的原词。

如果您希望解密成为可能,请确保仅使用导致双射映射的操作。比如你只用异或运算,不加减值就可以了。

这是一种只允许使用拉丁字母表的小写和大写字母的方法(对于两个参数):

def togglecrypt(string, key):
    mapper = "gUMtuAqhaEDcsGjBbreSNJYdFTiOmHKwnXWxzClQLRVyvIkfPpoZ"

    res = []
    for i, ch in enumerate(string):
        shift = mapper.index(key[i % len(key)]) % 26
        i = mapper.index(ch)
        if i < 26:
            j = 26 + (i + shift) % 26
        else:
            j = (i - shift) % 26
        res.append(mapper[j])
    return("".join(res))

keyword = "MELLON"
encoded = togglecrypt("Onions", keyword)
print(encoded)  # TdsDAn
print(togglecrypt(encoded, keyword))  # Onions