--- title: 置换密码 - 等待完善 createTime: 2025/10/29 13:50:49 permalink: /theory/cryptography/permutation-encryption/ --- # 置换密码(Permutation / Transposition Ciphers) 置换密码的核心思想不是“把字母换成别的字母”(替换),而是**重新排列明文字符的位置**。也就是说: - 明文字母的集合不变,顺序发生了改变; - 由于字母频率不变,置换密码依然会暴露统计特征,但单词的结构与位置模式被打散。 与“替换密码”相比,置换密码更像是“洗牌”:把原本顺序排列的牌重新打乱。单独使用时并不安全,但与替换联合使用(乘积密码)能显著增强安全性。 ```mermaid flowchart LR P[明文] --> A{根据密钥生成位置} A --> B[重新排列字符] B --> C[密文] ``` ## 一、栅栏密码(Rail Fence Cipher) **工作原理**: 将明文按“Z字形”写入若干行(称为“栅栏/轨道”),再按行依次读出即得到密文。轨道数即为密钥。 **示意**(以 3 轨为例): ``` 轨1: 0 4 8 ... 轨2: 1 3 5 7 9 ... 轨3: 2 6 ... ``` **示例**: 明文:`HELLOWORLD` 轨道数:`3` - 轨1(索引 0,4,8):`H O L` - 轨2(索引 1,3,5,7,9):`E L W R D` - 轨3(索引 2,6):`L O` 密文为各轨串联:`HOL` + `ELWRD` + `LO` → `HOLELWRDLO` **数学表示**: 设明文 $P = p_0 p_1 \dots p_{n-1}$,根据密钥生成一个位置序列 $s_0, s_1, \dots, s_{n-1}$(即置换次序),则: $$ C_j = p_{s_j}, \quad j = 0,1,\dots,n-1 $$ 解密使用逆序列 $t = s^{-1}$: $$ p_i = C_{t_i}, \quad i = 0,1,\dots,n-1 $$ **特点**: - 实现简单,直观“打乱顺序” - 频率不变,难以抵抗纯统计分析;但位置模式被破坏,较难直接猜词 - 作为教学与与替换密码的组合(乘积密码)更有价值 ## 二、列移位置换(Columnar Transposition) **工作原理**: 选择一个关键词,将明文按列填入表格,再按关键词的字母排序对列进行重排,最终按列或按行读出密文。 ```mermaid flowchart LR A[明文填入表格] --> B{按关键词排序列} B --> C[重排读取] C --> D[密文] ``` **简例(概念演示)**: 明文:`ATTACKATDAWN` 关键词:`ZEBRA`(按字母表排序为 `A B E R Z`) 1) 将明文逐行填入 5 列表格; 2) 按关键词排序(A→B→E→R→Z)重排列; 3) 按重排后的列依次读出密文。 (实际实现时需要处理明文长度不足一整行的填充策略,如使用 `X` 或留空。) **数学表示(一般置换模型)**: 关键词决定一个列置换 $\pi$,其作用是重新排列列索引。若把明文按列读取为序列 $P$,加密可抽象为: $$ C = \operatorname{Permute}_{\pi}(P), \quad P = \operatorname{Permute}_{\pi^{-1}}(C) $$ **特点**: - 比栅栏更灵活,关键词让置换更“难猜” - 仍保留频率分布,易受已知明文/选择明文的结构分析攻击 - 常与替换结合形成更强的乘积密码(如 ADFGX/ADFGVX 密码) ## 三、联合与加固:置换 × 替换 将“替换”与“置换”组合(先替换后置换,或多轮交替)能显著增强安全性: - 替换打乱统计特征(字母频率分布变平) - 置换打乱位置结构(模式与相邻关系被破坏) 这种思路在现代密码设计中仍然常见(“混淆与扩散”理念),尽管算法形式已经大为不同。 ## 四、安全性与弱点(直观理解) - 单独的置换密码不改变字母频率,抵抗统计攻击能力有限 - 容易受到已知明文/选择明文攻击(通过结构猜测置换) - 多轮、复杂置换能提高攻击成本,但不建议单独用于实际安全场景 ## 五、小练习(可选) 试着把你自己的名字用 3 轨栅栏加密;然后写出解密过程(先确定轨道索引,再按逆序重建原文)。 ## 附件: 具体的使用样例代码请参考:[https://gitea.simengweb.com/si-meng-spec/cryptography-example-code](https://gitea.simengweb.com/si-meng-spec/cryptography-example-code)