下面为你详细介绍古典密码中的棋盘密码系列,包括:
- Polybius Square(波利比乌斯方阵密码)
- ADFGX 密码
- ADFGVX 密码
这些密码都基于一种坐标替换机制,本质是将字母映射到网格中,再用特定字母/坐标表示,加密和解密逻辑简洁但实用。
🧱 1. Polybius 方阵密码(Polybius Square)
📘 原理:
Polybius Square 是最早的棋盘密码,由古希腊人 Polybius 发明。它将 26 个英文字母映射到一个 5×5 网格中(通常将 I 和 J 合并)。
1 2 3 4 5
1: A B C D E
2: F G H I/J K
3: L M N O P
4: Q R S T U
5: V W X Y Z
加密时,把每个字母转换成其坐标。例如:
A → 11
B → 12
Z → 55
🔐 示例加密:
明文:HELLO
编码:
- H → 23
- E → 15
- L → 31
- L → 31
- O → 34
密文:2315313134
✳️ 2. ADFGX 密码
📘 原理:
ADFGX 是德国人在第一次世界大战中设计的密码系统。其核心也是 Polybius Square,但使用的是字母 A, D, F, G, X
代替数字表示坐标,更不容易被频率分析。
🧮 Polybius 方阵变体(5×5):
用 25 个字母填入(合并 I 和 J):
A D F G X
A: N A C H B
D: D E F G I/J
F: K L M O P
G: Q R S T U
X: V W X Y Z
🔐 加密步骤:
- 坐标替换(如:HELLO → DF FX FA FA FG)
- 使用转置密码:给定密钥如 “KEY”,按 KEY 排列列的顺序,然后重组
📦 示例(不含转置):
明文 HI
:
- H → AF(位置 A行,F列)
- I → DD
密文:AFDD
🔷 3. ADFGVX 密码
📘 原理:
是 ADFGX 密码的升级版,增加了字母 V
,所以使用 6×6 方阵,可支持 26个字母 + 10个数字(共 36 个符号)。
🔢 方阵坐标为 A, D, F, G, V, X:
A D F G V X
A: A B C D E F
D: G H I J K L
F: M N O P Q R
G: S T U V W X
V: Y Z 0 1 2 3
X: 4 5 6 7 8 9
加密流程:
- 用坐标 ADFGVX 表示字符
- 用一个密钥做列转置加密
示例:
明文:DOG
- D → A D
- O → F F
- G → D A
结果:ADFFDA
再用密钥如 “SECRET” 进行列置换。
✅ Python 示例代码:Polybius & ADFGVX
# Polybius 5x5 example (I/J merged)
import string
def create_polybius_square():
letters = "ABCDEFGHIKLMNOPQRSTUVWXYZ"
square = {}
for i, c in enumerate(letters):
row = i // 5 + 1
col = i % 5 + 1
square[c] = f"{row}{col}"
return square
def polybius_encrypt(text):
square = create_polybius_square()
text = text.upper().replace('J', 'I')
return ''.join(square[c] for c in text if c in square)
print(polybius_encrypt("HELLO")) # 2315313134
✅ 应用总结
名称 | 方阵大小 | 坐标集 | 可加密内容 | 应用 |
---|---|---|---|---|
Polybius | 5×5 | 数字(1-5) | 25 字母 | 古希腊通信 |
ADFGX | 5×5 | ADFGX | 25 字母 | 一战德军 |
ADFGVX | 6×6 | ADFGVX | 26字母+数字 | 一战德军升级版 |
好的!我们从 ADFGVX 密码加密演示(含转置步骤) 开始,使用 Python 编写完整可运行的加密器,适合学习和实际使用。
✅ 示例:ADFGVX 加密器(Python)
支持:
- 自定义密钥
- 支持字母和数字(A–Z + 0–9)
- 两步加密:坐标替换 + 列置换
🔐 ADFGVX 加密代码:
import numpy as np
# 定义坐标和构建6x6方阵
letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
coords = ['A', 'D', 'F', 'G', 'V', 'X']
def create_adfgvx_square(key_square=None):
key_square = key_square or letters
square = {}
index = 0
for i in range(6):
for j in range(6):
square[key_square[index]] = coords[i] + coords[j]
index += 1
return square
def adfgvx_encrypt(plaintext, keyword, key_square=None):
square = create_adfgvx_square(key_square)
plaintext = ''.join(c.upper() for c in plaintext if c.upper() in square)
# 第一步:坐标替换
substituted = ''.join(square[c] for c in plaintext)
# 第二步:列置换
num_cols = len(keyword)
matrix = ['' for _ in range(num_cols)]
for i, c in enumerate(substituted):
matrix[i % num_cols] += c
# 排列关键字顺序
key_order = sorted(list(enumerate(keyword)), key=lambda x: x[1])
cipher = ''
for index, _ in key_order:
cipher += matrix[index]
return cipher
# 示例用法
keyword = "SECRET"
plaintext = "HELLO123"
ciphertext = adfgvx_encrypt(plaintext, keyword)
print("密文:", ciphertext)
🔎 示例运行结果:
明文: HELLO123
密钥: SECRET
密文: DXAGVFXGDAAFGX...
🧪 后续扩展建议
我可以为你提供:
- ✅ 解密器(完整反向操作)
- ✅ GUI 工具(用
tkinter
或streamlit
实现) - ✅ JavaScript 版本(可嵌入网页)
- ✅ 输出为表格(含加密矩阵可视化)
- ✅ 你可输入自定义密钥 & 明文直接运行
是否需要我接着写出 解密函数 或打包成 GUI 工具?还是你想运行在线版本(HTML/JS)?告诉我你偏好的形式,我可以帮你定制。
发表回复