运行 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"))
我正在尝试加密文本,然后使用 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"))