运行 str.replace 循环中的 XOR 加密不会更改某些字符

Running XOR encryption in a loop with str.replace doesn't change some characters

我正在尝试加密文本,然后使用 XOR 对其进行解密。它改变了大部分字母,但它跳过了一些。当我更改 "key" 时,它会跳过相同的字母。如果我尝试其他文本,它也会跳过一些字母,但在不同的地方。

我试着改了文中的一个字母:
"there is something wrong with my code"
"îòere ós sõmeîòóng wrõng wóîò mã ùõþe"

所以它不会加密字母 "e" 但是当我将一个 "e" 更改为 "X" 时它起作用并加密字母 "e".

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)

如果我尝试 key = 153,我会得到 "íñere ðs sömeíñðng wröng wðíñ mà úöýe"
如果我尝试 key = 154 我会得到 "îòere ós sõmeîòóng wrõng wóîò mã ùõþe".

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

请注意,当您 运行 循环时没有改变的字符是在您的字符串中出现偶数次的字符。相同的 XOR 运算用于加密和解密字符,因为将一个数字与另一个数字进行两次 XOR 运算得到相同的数字。您缺少的是 Python 的 str.replace() 将第一个字符串的 all 次替换为第二个字符串。当你遇到第一个 'e' 时,字符串中的所有 'e' 都被替换为 key ^ ord('e') 而不仅仅是你刚刚遇到的那个。 't' 等其他字符也不止一次被异或,但您没有注意到它们,因为与数字异或 3 次与异或 1 次相同。

为了更轻松地迭代和操作字符,您应该使用可变序列类型,例如 bytearray:

text = "there is something wrong with my code"
key = 154
print(key)
ba = bytearray(text, "latin_1")

for i in range(0, len(ba)):
    ba[i] = ba[i] ^ key

print(ba.decode("latin_1"))

for i in range(0, len(ba)):
    ba[i] = ba[i] ^ key

print(ba.decode("latin_1"))