密码学概述
古典密码
- 单表替换加密
在单表替换加密中,所有的加密方式几乎都有一个共性,那就是明密文一一对应。
在密文长度足够长的时候,可以使用词频分析进行破解。
如:凯撒密码、埃特巴什码、仿射密码
- 多表替换加密
使用多个不同的字母表(替换表)来加密明文,从而增强安全性、抵抗频率分析攻击。
如:维吉尼亚密码
- 奇奇怪怪的加密方式
现代密码
- 对称加密
主要分为两种方式:
分组密码,又称为块密码。(所谓块加密就是每次加密一块明文)
序列密码,又称为流密码。(流密码的密钥派生自一个较短的密钥,派生算法通常为一个伪随机数生成算法。)
以 DES,AES,RC4 为代表。
- 非对称加密
以 RSA,ELGamal,椭圆曲线加密为代表。
- 哈希函数
以 MD5,SHA-1,SHA-512等为代表。
- 数字签名
以 RSA 签名,ELGamal 签名,DSA 签名为代表。
古典密码
base加密
base64

原理:把3个8位字节转为4个6位的字节,之后在6位的前面补两个0。
当六位全为 1时:111111 对应 ascii 值 63
|
|
通常使用在线网站进行base64加解密。
例题:base64、base64(2)
- base64
flag{do_you_know_base64_encode}
- base64(2)
需要使用题目所给的码表,填到cyberchef的Alphabet中即可
flag{hello_world_base64!}
base32
例题:base32
flag{hello_base32}
base16
例题:base16
flag{easy0_b4sel6!}
凯撒密码
凯撒密码就是把字幕按照顺序移位,key就是移动的位数
例题:凯撒大帝
建议使用https://ctf.bugku.com/tool/caesar的枚举功能
flag{normal_caesar}
维吉尼亚密码
维吉尼亚密码(Vigenère Cipher)是一种经典的多表替换密码,通过动态改变凯撒移位量,大幅提升了古典密码的安全性。
它本质是多个凯撒密码的组合:
- 用一个密钥词(如
LEMON)控制每一位的移位量。 - 每个密钥字母对应一个移位值(A=0, B=1, …, Z=25)。
- 加密时,明文 + 密钥(模 26);解密时,密文 − 密钥(模 26)。
加密步骤(示例)
以明文 ATTACK、密钥 LEMON 为例:
- 对齐:密钥重复至与明文等长
|
|
- 转数字(A=0)
|
|
- 相加并模 26
|
|
- 结果:密文
LXFOPV
例题:Vigenere
https://ctf.bugku.com/tool/vigenere
flag{easy_Vigenere}
摩斯密码
应该没人不知道把,略
培根密码
培根密码常用两种不同元素代指二进制中的0和1,甚至可以是两种字体、字号、粗细、大小写等
例题:培根
flag{bacniancpher}
其他密码
base100
https://ctf.bugku.com/tool/base100
例题:一百
flag{b@se_loo}
核心价值观编码
例题:社会主义核心价值观
https://ctf.bugku.com/tool/cvecode
flag{hacking_is_a_journey_not_a_destination}
与佛论禅
例题:与佛论禅
flag{stay_curious_and_keep_experimenting}
盲文
https://www.lddgo.net/common/braille
手机键盘密码
通常以两个数字为一组,第一个数字是所在格子,第二个数字是在当前各自的第几个字母

如 23指的是 C 61指的是M
电脑键盘密码
通常是若干个字符为一组,实际明文指的是在键盘上被这些字符所包裹的那个字符,如:
|
|
古埃及象形文字

提瓦特文

标准银河文字

颜文字(AA编码)
例题:颜文字
http://www.hiencode.com/aaencode.html
flag{js_da_fa_hao}
Brainfuck
例题:brainfuck
https://ctf.bugku.com/tool/brainfuck
flag{99754106633f94d350db34d548d6091a}
jsfuck
例题:jsfuck
http://www.hiencode.com/jsfuck.html
flag{3e8b4c45d}
现代密码
RC4
RC4 是一种流密码,属于对称加密算法,特点是极快、极简单、历史极长。
- 用一个密钥生成一串伪随机密钥流
- 明文与密钥流做异或(XOR) 得到密文
- 解密一模一样:密文再异或一次密钥流就还原
例题:RC4
http://www.hiencode.com/rc4.html
flag{knowledge_gained_is_power_unlocked}
DES
- DES 是经典的分组密码
- 把明文每 64 位(8 字节)分成一组
- 用 56 位密钥 对每组做复杂的置换、代换(16 轮加密)
- 输出也是 64 位一组的密文
ECB模式
ECB即 Electronic CodeBook 电子密码本模式
规则:
- 把明文切成 64 位一组
- 每组独立用 DES 加密
- 最后把密文组拼起来
例如:
明文:AAAAAAAA BBBBBBBB AAAAAAAA
用 DES+ECB 加密:
- 第 1 组
AAAAAAAA→ 密文X - 第 2 组
BBBBBBBB→ 密文Y - 第 3 组
AAAAAAAA→ 密文 还是 X
特点:相同明文块 → 相同密文块
例题:DES
https://www.toolhelper.cn/SymmetricEncryption/DES
选择模式ECB,填充模式PKCS7,格式Hex
flag{collaboration_creativity_and_coding}
CBC模式
CBC 即 Cipher Block Chaining 密码分组链接模式
- 当前明文块 先和 前一个密文块 异或
- 再用 DES 加密
因为每一组都依赖前一组(类似区块链),
所以:相同明文,在不同位置 → 密文一定不同
CFB/OFB/CTR模式
- CFB:流密码、串行、有错误传播
- OFB:流密码、无错误传播
- CTR:流密码、并行最快、现代最爱
AES
例题:AES
https://www.toolhelper.cn/SymmetricEncryption/AES
模式CFB,填充None,格式Hex
flag{every_line_of_code_counts}
RSA
RSA解密常用下面的工具进行:
https://pan.baidu.com/s/1sIcFvRvrPWpKVBA-r7b7EA?pwd=ruzh
知识铺垫
RSA 是非对称加密:
- 有公钥(随便给别人)
- 有私钥(自己藏好)
- 用公钥加密 → 只能私钥解密
- 用私钥签名 → 只能公钥验证
安全来自:大数分解很难(两个大质数相乘容易,反过来拆很难)。
原理:
- 选两个不同质数 p、q
- 算 n = p × q
- 算欧拉函数 φ(n) = (p-1)(q-1)
- 选公钥指数 e:1 <e < φ(n),且与 φ(n) 互质(常用 e=65537)
- 算私钥指数 d:d 是 e 在模 φ(n) 下的逆元即:(e × d) mod φ(n) = 1
- 公钥:(e, n)
- 私钥:(d, n)
加密:$ C=M^emod\ n $
解密:$ M=C^d mod\ n $
简单示例
我们用很小的质数演示:
① 选质数
p = 11q = 17
② 算 n
n = 11 × 17 = 187
③ 算 φ(n)
φ(n) = (11-1)(17-1) = 10 × 16 = 160
④ 选 e
e 要和 160 互质,随便选一个:e = 3(满足 gcd (3,160)=1)
⑤ 算 d
求 d 使 (3×d) mod 160 = 1得:d = 107
加密 / 解密演示:
设明文 M = 5(必须小于 n)
加密(公钥 3, 187)
C = 5³ mod 187 = 125
解密(私钥 107, 187)
M = 125¹⁰⁷ mod 187 = 5
成功还原!
dpdq泄露
例题:dqdp泄露
打开上面给出的工具,进入IDE选项卡,在【脚本】中选择基础脚本-dpdp泄露.py
更改脚本中的几个数值,然后右键运行即可。
即下面的脚本:
|
|
noxCTF{W31c0m3_70_Ch1n470wn}
dp 泄露
打开工具
填入已知的e、n、c
右键选择分解模数(N),在弹出的N分解工具中输入框填写N的值,点击下面的本地DB查询按钮
将得到的p和q复制到左边的$ Prime(P,Q) $框中,只填写数值,中间用英文逗号隔开
右键,计算私钥(D)
右键,计算明文(M)
点击工具栏中的【常规】- (M)数字»字符,得到flag

flag{wow_leaking_dp_breaks_rsa?_98924743502}
e与phi不互素
打开工具
填入已知的p,q,e,c
选择【模式】- e Φ不互素,得到明文M
点击工具栏中的【常规】- (M)数字»字符,得到flag
flag{1f803313-8999-4ec3-abc6-907a10fde606}
共模攻击
打开上面给出的工具,进入IDE选项卡,在【脚本】中选择基础脚本-共模攻击.py
发现默认脚本数值与当前一致
也可以在RSA选项卡中填入已知的所有值,其中e1,e2都填在$ Public(E) $中,中间英文逗号隔开,c1,c2同理,选择【模式】- 共模攻击,得到明文M
点击工具栏中的【常规】- (M)数字»字符,得到flag
flag{6ed4c74e022cb18c8039e96de93aa9ce}
小e攻击
在RSA选项卡中填入已知的所有值,
选择【模式】- 小e攻击,稍等程序计算,得到明文M
点击工具栏中的【常规】- (M)数字»字符,得到flag
flag{23d5e9dc-cb38-11ea-8d78-dca90498a2db}