Transposition Cipher代码无法正常运行,请求大key兼容问题排查
换位密码(Transposition Cipher)代码修复与优化建议
问题诊断
你的代码存在两个核心问题,导致key较大时加密不完整且解密失效:
- 加密逻辑错误:原函数仅通过间隔
key位交换两个字符,这种操作只能覆盖少量字符位置,当key超过文本长度的1/2时,大部分字符根本不会被处理。比如文本长度14,key=5时,仅能交换0↔5、5↔10位置的字符,剩余1-4、6-9、11-13位置完全未改动。 - 解密逻辑错误:错误认为解密与加密操作相同,但原加密逻辑并非自逆操作,重复执行无法还原原文本。
修复后的代码(标准列换位实现)
以下是符合标准列换位密码的实现,支持最高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
相关产品推荐
相关产品推荐

