Python新手求助:如何实现字典反向映射的密文解密(支持整句)
解决Python密文解密问题
首先,你的加密字典是明文到密文的映射(比如{'A': 'o78t6df'}),解密需要先反转字典,把密文作为键、明文作为值。下面分两种常见场景给出代码:
场景1:每个明文对应的密文长度固定
比如所有密文都是7位(和你例子里的格式一致),可以按固定长度切割密文后逐个匹配:
# 假设原加密字典(替换成你实际的字典) dic = {'A': 'o78t6df', 'B': 'k9p2sxq', 'C': 'm4r7vbn'} # 反转字典,生成密文到明文的映射 reverse_dic = {v: k for k, v in dic.items()} choice_start = input("输入'e'加密,'d'解密:").strip() if choice_start == 'e': # 你已实现的加密逻辑保留此处 plaintext = input("输入明文:").strip() ciphertext = ''.join([dic[c] for c in plaintext if c in dic]) print(f"密文:{ciphertext}") elif choice_start == 'd': ciphertext = input("输入密文:").strip() # 密文片段长度(和你加密时的单个密文长度保持一致) chunk_len = 7 plaintext = '' # 按固定长度切割密文并匹配 for i in range(0, len(ciphertext), chunk_len): chunk = ciphertext[i:i+chunk_len] # 找不到匹配时用[片段]标记,也可改成直接保留原片段 plaintext += reverse_dic.get(chunk, f'[{chunk}]') print(f"明文:{plaintext}")
场景2:密文长度不固定(不同明文对应不同长度的密文)
这种情况需要用最长匹配逻辑,优先尝试匹配最长的密文片段,避免短片段误匹配:
# 假设原加密字典(替换成你实际的字典) dic = {'A': 'o78t6df', 'a': 'o78', 'B': 'k9p2sxq'} reverse_dic = {v: k for k, v in dic.items()} # 获取所有密文长度,按从大到小排序,优先匹配长片段 cipher_lengths = sorted([len(v) for v in reverse_dic.keys()], reverse=True) choice_start = input("输入'e'加密,'d'解密:").strip() if choice_start == 'e': # 你已实现的加密逻辑保留此处 plaintext = input("输入明文:").strip() ciphertext = ''.join([dic[c] for c in plaintext if c in dic]) print(f"密文:{ciphertext}") elif choice_start == 'd': ciphertext = input("输入密文:").strip() plaintext = '' idx = 0 total_len = len(ciphertext) while idx < total_len: matched = False # 从最长的密文长度开始尝试匹配 for length in cipher_lengths: if idx + length > total_len: continue chunk = ciphertext[idx:idx+length] if chunk in reverse_dic: plaintext += reverse_dic[chunk] idx += length matched = True break # 无匹配时跳过当前字符,可根据需求调整处理逻辑 if not matched: plaintext += ciphertext[idx] idx += 1 print(f"明文:{plaintext}")
注意事项
- 反转字典前要确保没有重复的密文值,否则后出现的会覆盖先出现的,导致解密错误
- 若密文存在无法匹配的片段,可根据需求修改错误处理逻辑(比如抛出提示、保留原片段等)
内容的提问来源于stack exchange,提问作者Gimojy
相关产品推荐
相关产品推荐

