如何基于原密钥与sorted方法还原排序列的换位密码
带列字母序排序的换位密码解密:列还原方案
加密逻辑回顾
我们的任务是实现一种基于密钥列排序的换位密码,加密时会将矩阵列按密钥字符的字典序重新排列。以下是完整加密流程示例:
原始矩阵(密钥:Banner)
| B | A | N | N | E | R | <== 原始密钥 ------------------------------------------------------------------- | F | L | A | M | I | N | | G | O | _ | I | S | _ | | A | _ | B | I | R | D |
按密钥字母序重排后的矩阵
| A | B | E | N | N | R | <== 字母序排序后的密钥 ------------------------------------------------------------------- | L | F | I | A | M | N | | O | G | S | _ | I | _ | | _ | A | R | B | I | D |
最终密文
按列从上到下、从左到右读取矩阵,得到密文:
LO_FGAISRA_BMIIN_D
加密代码片段
以下是实现上述加密逻辑的Python代码(number_of_columns 为密钥长度):
cipher_key_order = sorted(range(len(cipher_key)) , key=lambda alphabet: cipher_key[alphabet]) i = 0 encrypted_matrix = [[" " for column in range(0, number_of_columns)] for row in range(0, number_of_rows)] for col in range(number_of_columns): for row in range(number_of_rows): encrypted_matrix[row][col] = original_matrix[row][cipher_key_order[i]] i += 1
核心问题
给定原加密密钥,如何在不将密钥持久化存储到代码或设备本地的前提下,优先使用sorted()等方法将加密后的矩阵列还原至原始位置?
解决方案
要还原列的原始顺序,核心是推导加密时列排序的逆映射关系——即从“排序后的列索引”回溯到“原始列索引”的对应规则。
1. 生成加密时的列排序映射
加密时,cipher_key_order是原始列索引按密钥字符排序后的结果。以密钥Banner(小写为banner)为例,索引0-5对应字符b,a,n,n,e,r,排序后的索引顺序为[1,0,4,2,3,5](字符顺序:a(1) < b(0) < e(4) < n(2) < n(3) < r(5))。
2. 推导解密用的逆映射
通过对加密时的排序结果再次排序,并记录原始位置,即可得到逆映射:
# 临时获取密钥生成解密用的列顺序(密钥仅临时使用,不存储) decipher_order = sorted(range(len(cipher_key)), key=lambda x: cipher_key_order[x])
比如上述例子中,cipher_key_order = [1,0,4,2,3,5],对其索引排序后,得到的decipher_order为[1,0,3,4,2,5]——这就是将加密矩阵列还原回原始顺序的索引规则。
3. 还原原始矩阵
利用decipher_order重新排列加密矩阵的列,即可得到原始矩阵:
# 假设encrypted_matrix为加密后的矩阵 decrypted_matrix = [[" " for _ in range(number_of_columns)] for _ in range(number_of_rows)] for col in range(number_of_columns): original_col = decipher_order[col] for row in range(number_of_rows): decrypted_matrix[row][col] = encrypted_matrix[row][original_col]
关键说明
- 密钥仅在生成映射时临时使用,无需持久化存储到代码或设备中;
- 全程依赖
sorted()函数完成映射的生成与逆推,完全符合需求。
内容的提问来源于stack exchange,提问作者Flamingoboski
相关产品推荐
相关产品推荐

