为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕妹3242003 2021-12-29 20:09:44
我正在尝试加密文本,然后使用 XOR 对其进行解密。它改变了大部分字母,但跳过了一些。当我更改“键”时,它会跳过相同的字母。如果我尝试另一个文本,它也会跳过一些字母,但在不同的地方。我试图更改文本中的一个字母:“我的代码有问题”“îòere ós sõmeîòóng wrõng wóîò mã ùõþe”所以它不会加密字母“e”,但是当我将一个“e”更改为“X”时,它会起作用并加密字母“e”。text = "there is something wrong with my code"key = 154print(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”。
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

请注意,运行循环时未更改的字符是在字符串中出现偶数次的字符。相同的 XOR 操作用于加密和解密字符,因为将一个数字与另一个数字进行两次异或会得到相同的数字。您缺少的是 Python用第二个字符串str.replace()替换所有出现的第一个字符串的事实。当您遇到第一个 '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"))


查看完整回答
反对 回复 2021-12-29
  • 1 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号