Python如何实现按字母序替换字符的无依赖加密解密功能
基于最近字母序匹配的字符替换加密实现
需求迭代说明
- 初始方案设想为凯撒类偏移加密:每个字母替换为字母表中向后偏移n位的对应字母,曾考虑用sort排序实现字母序逻辑,不确定可行性后调整需求:将每个待替换字母替换为字母序最接近的对应字母
- 第一版实现为手动指定索引交换字符(例如直接交换
msg[0]与msg[5]),需要人工固定交换位置,无法自动化处理,不符合要求。
第一版手动交换实现代码
key = 4 msg = ['A', 'C', 'T', 'I', 'O', 'N'] def cipher_cesar(msg,key): msg[0],msg[5] = msg[5], msg[0] print(msg) answer = int(input("insert the key to find word")) if answer == key: return decipher_cesar(msg,answer) def decipher_cesar(msg,key): msg[5],msg[0] = msg[0], msg[5] print(msg) print(cipher_cesar(msg,key))
该版本逻辑为固定位置交换字符,输入正确密钥即可解密还原,但无法满足「所有字母自动替换为字母序最接近的字母」的要求。
现有尝试的问题
后续尝试使用ord()函数获取字符ASCII码实现匹配,但代码仅能处理列表首个字符,无法完成全列表自动替换,即无法遍历每个字符,自动匹配列表内与其字母序差值最小的字符完成替换,对应尝试代码如下:
m = ['A', 'C', 'T', 'I', 'O' , 'N'] mzero = m[0] for i in range(len(m)-1): listes = [] result = ord(mzero) - ord(m[i+1]) print(f'result of {ord(mzero)} - {ord(m[i+1])}:', result) listes.append(abs(result)) print(listes) if ord(mzero) - ord(m[i]) == min(listes): mzero, m[i] = m[i], mzero print(m) print('The closest value is :', min(listes))
实现约束与方案
- 禁止引入numpy等任何第三方库,仅使用Python原生语法实现
- 无需手动指定字符交换位置,全列表自动完成匹配替换
- 加密解密逻辑可逆,输入正确密钥即可还原原始消息
核心匹配逻辑(原参考教程内容翻译整理):
- 遍历列表中每一个字符,对当前字符,遍历列表内其余所有字符,用
ord()计算两个字符的ASCII码差值,取绝对值 - 筛选出差值最小的字符作为替换项;若存在多个差值相同的字符,可结合密钥值选定固定偏移方向的字符,避免匹配冲突
- 加密时记录原字符与替换字符的映射关系,解密时按照映射反向替换即可还原内容
内容的提问来源于stack exchange,提问作者MrTiredVeryTired
相关产品推荐
相关产品推荐

