Python 使用str.replace在循环中运行XOR加密不会';不要改变一些字符

Python 使用str.replace在循环中运行XOR加密不会';不要改变一些字符,python,string,loops,encryption,str-replace,Python,String,Loops,Encryption,Str Replace,我正在尝试对文本进行加密,然后使用XOR对其进行解密。它改变了大多数字母,但跳过了一些。当我更改“键”时,它会跳过相同的字母。如果我尝试另一个文本,它也会跳过一些字母,但位置不同 我试图更改文本中的一个字母: “我的代码有问题” “我是我的朋友,我是我的朋友” 所以它不会加密字母“e”,但当我把一个“e”改为“X”时,它会工作并加密字母“e” 如果我尝试key=153我会得到“íñereðsömeíñngwröngwðñmúýe” 如果我尝试key=154我会得到“我是谁?” 如您所见,它不会更

我正在尝试对文本进行加密,然后使用XOR对其进行解密。它改变了大多数字母,但跳过了一些。当我更改“键”时,它会跳过相同的字母。如果我尝试另一个文本,它也会跳过一些字母,但位置不同

我试图更改文本中的一个字母:
“我的代码有问题”
“我是我的朋友,我是我的朋友”

所以它不会加密字母“e”,但当我把一个“e”改为“X”时,它会工作并加密字母“e”

如果我尝试
key=153
我会得到
“íñereðsömeíñngwröngwðñmúýe”

如果我尝试
key=154
我会得到
“我是谁?”


如您所见,它不会更改字母“e、r、n、g、w、m”。

请注意,运行循环时未更改的字符是字符串中出现偶数次的字符。相同的XOR操作用于加密和解密字符,因为将一个数字与另一个数字进行两次XOR运算会得到相同的数字。您缺少的是一个事实,Python用第二个字符串替换第一个字符串的所有出现。当您遇到第一个“e”时,字符串中的所有“e”都将替换为
key^ord('e')
而不仅仅是您刚才遇到的。像“t”这样的其他字符也会多次被XORD,但您不会注意到它们,因为用数字3次XORing与用数字1次XORing相同

要更轻松地对字符进行迭代和操作,应使用可变序列类型,如:

text=“我的代码有问题”
键=154
打印(键)
ba=bytearray(文本,“拉丁语1”)
对于范围(0,len(ba))中的i:
ba[i]=ba[i]^key
印刷(文学士解码(“拉丁语1”))
对于范围(0,len(ba))中的i:
ba[i]=ba[i]^key
印刷(文学士解码(“拉丁语1”))

调试提示:在for循环的每次迭代中打印
文本。应该很清楚出了什么问题
text = "there is something wrong with my code"
key = 154
print(key)
längd = (len(text))
for a in range(0,längd):
    b = ord(text[a])
    ny = b ^ key
    ny2 = chr(ny)
    text = text.replace(text[a],ny2)

print(text)
for a in range(0,längd):
    b = ord(text[a])
    ny = b ^ key
    ny2 = chr(ny)
    text = text.replace(text[a], ny2)

print(text)