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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:05:18