CTF中那些古典密码
字数 1616 2025-08-09 18:44:06
CTF中的古典密码学详解
一、凯撒密码(Caesar Cipher)
基本原理
凯撒密码是一种通过字母位移实现的替换密码,将字母表中的每个字母按照固定的偏移量进行替换。
加密方法
- 明文:"Hello world",偏移量为3
- 加密过程:A→D, B→E, ..., H→K, e→h, l→o等
- 密文:"Khoor zruog"
特殊变种
- 偏移量为10:Avocat
- 偏移量为13:ROT13(自反密码,加密解密使用相同算法)
- 偏移量为-5:Cassis
- 偏移量为-6:Cassette
在线解密工具
https://www.qqxiuzi.cn/bianma/kaisamima.php
二、培根密码(Bacon's Cipher)
基本原理
将每个字母转换为5个a/b(或A/B)组成的特定编码组合。
特点
- 密文仅由a/b或A/B组成
- 不区分大小写
示例
"Hello" → "aabbbAABAAABABBABABBABBBA"
在线解密工具
https://tool.bugku.com/peigen/
三、摩斯密码(Morse Cipher)
基本原理
通过不同排列的短信号(·)和长信号(-)表示字母、数字和标点符号。
特点
- 广泛应用于电报通信
- 每个字符由1-5个信号组成
- 字符间用空格分隔,单词间用/分隔
示例
"Hello" → "···· · ·-·· ·-·· ---"
在线解密工具
moersima.00cha.net
四、栅栏密码(Rail-fence Cipher)
1. Z型栅栏密码
加密方法
- 将明文按N行排列成Z字形
- 按列从上到下读取形成密文
示例
- 明文:"Helloworld"
- N=2:"Hloolelwrd"
- N=3:"Hlodeorlwl"
2. W型栅栏密码
加密方法
- 将明文按N行排列成W字形
- 按行读取形成密文
在线解密工具
- Z型:https://www.qqxiuzi.cn/bianma/zhalanmima.php
- W型:http://www.atoolbox.net/Tool.php?Id=777
五、仿射密码(Affine Cipher)
数学原理
- 加密函数:E(x) = (ax + b) mod 26
- 解密函数:D(x) = a⁻¹(x - b) mod 26
- 其中a与26互质
示例
a=5, b=8;明文"AFFINECIPHER"
Python解密脚本
def get(a, b):
if b == 0:
return 1, 0
else:
k = a // b
remainder = a % b
x1, y1 = get(b, remainder)
x, y = y1, x1 - k * y1
return x, y
s = input("请输入解密字符:").upper()
a = int(input("请输入a:"))
b = int(input("请输入b:"))
# 求a关于26的乘法逆元
x, y = get(a, 26)
a1 = x % 26
l = len(s)
for i in range(l):
cipher = a1 * (ord(s[i])-65 - b) % 26
res = chr(cipher + 65)
print(res, end='')
六、猪圈密码(Pigpen Cipher)
基本原理
- 基于格子的简单替代密码
- 每个字母对应特定的符号或格子图案
特点
- 符号由直线和点组成
- 有固定的对应关系表
在线解密工具
http://ctf.ssleye.com/pigpen.html
七、维吉尼亚密码(Vigenère Cipher)
基本原理
- 使用多个凯撒密码组成的密码表
- 需要密钥和明文两个元素
加密步骤
- 将密钥循环扩展至与明文等长(密钥流)
- 对每个字符:密文 = (明文字符 + 密钥字符偏移量) mod 26
示例
- 明文:"ATTACKDAWN"
- 密钥:"LEMON"
- 密钥流:"LEMONLEMONLE"
- 密文:"LXFOPVEFRNHR"
特点
- 比简单凯撒密码更安全
- 可使用维吉尼亚方阵进行加密解密
总结与识别特征
| 密码类型 | 主要识别特征 |
|---|---|
| 凯撒密码 | 字母替换,固定偏移 |
| 培根密码 | 仅含a/b或A/B字符 |
| 摩斯密码 | 由·和-组成的序列 |
| 栅栏密码 | 字符重排,长度不变 |
| 仿射密码 | 数学公式加密,需参数a,b |
| 猪圈密码 | 特殊符号或格子图案 |
| 维吉尼亚 | 需要密钥,多表替换 |
练习建议
- 熟悉每种密码的典型特征
- 掌握基本的加密解密流程
- 积累常见密码的识别经验
- 准备线下赛时需提前下载解密脚本(比赛通常禁止联网)