You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python字典与replace方法问题:加密文本解密结果错误

Tkinter文本加密解密功能修复

问题根源

  1. 解密函数未使用反向映射字典:预先定义的sec字典是words的反向映射,但解密函数sec_to_word完全没有用到它,反而错误遍历原加密字典words,导致映射逻辑混乱。
  2. 替换顺序引发错误替换:原解密函数通过replace全局替换字符,且遍历顺序是原加密字典的键,导致多次替换叠加。比如解密yhhy时,先把所有y替换成h(变成hhhh),随后又把所有h替换成n,最终得到nnnn。
  3. 冗余错误的嵌套循环:for char in words[chars]完全无意义,因为words[chars]是单个字符,循环只会执行一次,徒增代码复杂度。

修复后的代码

from tkinter import Tk, Button, Label, Entry

# 加密映射字典
words ={'q':'0','w':'1','e':'2','r':'3','t':'4','y':'5','u':'%','i':'7','o':'8',
    'p':'9','a':'q','s':'w','d':'e','f':'r','g':'t','h':'y','j':'u','k':'i',
    'z':'a','x':'s','c':'d','v':'f','b':'g','n':'h','m':'j','l':'o',
    '1':'z','2':'x','3':'c','4':'v','5':'b','6':'m','7':'.','8':'#','9':'@','0':'!',
    '@':'$','#':':','!':'&',':':'*','.':'n',' ':'6'}

# 解密反向映射字典
sec ={'0':'q','1':'w','2':'e','3':'r','4':'t','5':'y','%':'u','7':'i','8':'o',
    '9':'p','q':'a','w':'s','e':'d','r':'f','t':'g','y':'h','u':'j',
    'o':'l','a':'z','s':'x','d':'c','f':'v','g':'b','j':'m',
    'z':'1','x':'2','c':'3','v':'4','b':'5','m':'6','.':'7','#':'8','@':'9','!':'0',
    '$':'@',':':'#','&':'!','*':':','6':' ','n':'.','h':'n','i':'k'}

def word_to_sec():
    input_text = word_to_sec_ent.get()
    # 逐个字符处理,避免全局replace导致的二次替换问题
    output = []
    for char in input_text:
        # 若字符不在字典中,保留原字符
        output.append(words.get(char, char))
    output_str = ''.join(output)
    config_lbl.config(text= f'word to sec: {output_str}')
    return output_str

def sec_to_word():
    input_text = sec_to_word_ent.get()
    # 使用反向字典sec,逐个字符处理
    output = []
    for char in input_text:
        # 若字符不在字典中,保留原字符
        output.append(sec.get(char, char))
    output_str = ''.join(output)
    config_lbl.config(text= f'sec to word: {output_str}')
    return output_str

window = Tk()
window.title('sec_maker           made by: parsa')

word_to_sec_lbl = Label(window,text= '输入文本转换为加密格式:          ')
word_to_sec_lbl.grid(row=1,column=1)
word_to_sec_ent = Entry(window)
word_to_sec_ent.grid(row=2,column=1)
word_to_sec_btn = Button(window,text='转换为加密格式',command=word_to_sec)
word_to_sec_btn.grid(row=3,column=1)

sec_to_word_lbl = Label(window,text= '输入加密格式转换为文本:')
sec_to_word_lbl.grid(row=1,column=3)
sec_to_word_ent = Entry(window)
sec_to_word_ent.grid(row=2,column=3)
sec_to_word_btn = Button(window,text='转换为文本',command=sec_to_word)
sec_to_word_btn.grid(row=3,column=3)

config_lbl = Label(window,text='输出: ')
config_lbl.grid(row=4,column=2)

window.mainloop()

关键修改说明

  • 加密函数优化:将全局replace循环改为逐个字符遍历,通过words.get(char, char)获取加密字符,避免因替换后的字符与原字典键重复导致的二次替换问题。
  • 解密函数重构:使用预先定义的sec反向字典,同样采用逐个字符遍历的方式,直接从字典中查找原字符,彻底解决顺序替换引发的错误。
  • 容错处理:通过dict.get()方法,当输入字符不在映射字典中时,保留原字符,提升程序鲁棒性。

内容的提问来源于stack exchange,提问作者parsa ataei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:40:28