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

Transposition Cipher代码无法正常运行,请求大key兼容问题排查

换位密码(Transposition Cipher)代码修复与优化建议

问题诊断

你的代码存在两个核心问题,导致key较大时加密不完整且解密失效:

  1. 加密逻辑错误:原函数仅通过间隔key位交换两个字符,这种操作只能覆盖少量字符位置,当key超过文本长度的1/2时,大部分字符根本不会被处理。比如文本长度14,key=5时,仅能交换0↔5、5↔10位置的字符,剩余1-4、6-9、11-13位置完全未改动。
  2. 解密逻辑错误:错误认为解密与加密操作相同,但原加密逻辑并非自逆操作,重复执行无法还原原文本。

修复后的代码(标准列换位实现)

以下是符合标准列换位密码的实现,支持最高256的key,且能正确处理任意有效key值:

def encrypt(text, key):
    text_len = len(text)
    # 处理key为0或大于文本长度的情况,确保key有效
    key = key % text_len if text_len != 0 else 1
    if key == 0:
        key = text_len
    
    # 创建空的列列表
    columns = [''] * key
    # 按列填充字符
    for idx, char in enumerate(text):
        columns[idx % key] += char
    
    # 拼接所有列得到加密文本
    return ''.join(columns)

def decrypt(encrypted_text, key):
    text_len = len(encrypted_text)
    # 同步加密时的key处理逻辑
    key = key % text_len if text_len != 0 else 1
    if key == 0:
        key = text_len
    
    # 计算每列的基础长度和额外字符数
    col_len = text_len // key
    extra_chars = text_len % key
    
    # 拆分加密文本为列
    columns = []
    start = 0
    for i in range(key):
        current_col_len = col_len + 1 if i < extra_chars else col_len
        columns.append(encrypted_text[start:start+current_col_len])
        start += current_col_len
    
    # 按行读取字符还原原文本
    decrypted_text = []
    for i in range(col_len + (1 if extra_chars > 0 else 0)):
        for col in columns:
            if i < len(col):
                decrypted_text.append(col[i])
    
    return ''.join(decrypted_text)

# 测试示例
plaintext = "this is a test"
test_keys = [2, 5, 256]  # 包含小key、大key、超256的key
for key in test_keys:
    print(f"\n=== 测试key={key} ===")
    print(f"原文本: {plaintext}")
    encrypted = encrypt(plaintext, key)
    print(f"加密后: {encrypted}")
    decrypted = decrypt(encrypted, key)
    print(f"解密后: {decrypted}")
    print(f"解密结果正确: {decrypted == plaintext}")

优化建议

  • 输入验证:可以添加对输入文本为空、key为非正整数的处理,抛出异常或给出提示,提升鲁棒性。
  • 性能优化:对于超长文本,使用列表拼接比字符串累加更高效(上述代码已采用)。
  • key范围限制:如果需求明确key最高256,可以在函数开头添加key = max(1, min(key, 256)),确保key始终在1-256之间,同时结合取模处理文本长度的限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:48:17