古典密码之棋盘密码(ADFGVX,ADFGX,Polybius)
下面为你详细介绍古典密码中的棋盘密码系列,包括:
-
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 方阵变体(5x5):
用 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字母+数字 | 一战德军升级版 |
如果你想要具体的加解密演示(含转置)、GUI 工具界面、JavaScript 或 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)?告诉我你偏好的形式,我可以帮你定制。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)