我嘗試使用 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))
需要幫忙!!
uj5u.com熱心網友回復:
該演算法不執行純 XOR,而是有條件地將值映射到另一個值,從而導致不再是雙射的關系。
為了說明這一點。查看此腳本輸出的內容:
keyword = "MELLON"
print(xor("Onions", keyword) == xor("OTGEHs", keyword))
它會輸出True!
所以這意味著你有兩個詞被加密到同一個字串。這也意味著,如果你需要做相反的事情,沒有辦法知道其中哪個是真正的原詞。
如果您希望解密成為可能,請確保僅使用導致雙射映射的操作。例如,如果您只使用 XOR,不加或減值,就可以了。
這是一種只允許使用拉丁字母的小寫和大寫字母的方法(對于兩個引數):
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/409742.html
標籤:
上一篇:除了python中的Web錯誤訊息,我如何處理Selenium嘗試?
下一篇:while回圈列印不正確的問題
