如何解密使用 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
我尝试使用 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