授课:城堡
密码学基础
密码学是研究编制密码和破译密码的技术科学
密码学介绍
为何需要密码学
- 存储:信息的存储可能是不安全的,会被窃取
- 传输:信息的传输过程可能也不是隐秘的,会被窃听
不能直接使用明文进行存储和传输!
Crypto in CTF
出题人给定一个有一定缺陷的加密算法,需要选手攻破该加密算法,得到解密后的文字,或者伪造加密信息
比赛中题目虽然常常会涉及许多较新的论文研究结果,但是仍与目前隐私计算等前沿密码学安全研究有一定距离
Crypto学习资源推荐
基本术语
- 消息被称为明文(Plaintext)。用某种方法伪装消息以隐藏它的内容的过程称为加密 (Encryption),被加密的消息称为密文(Ciphertext),把密文恢复为明文的过程称为密(Decryption)。
- 密码算法(Cryptography Algorithm):是用于加密和解密的数学函数。
- 密钥(Key):加密或解密所需要的除密码算法之外的关键信息。
- 对称加密(Symmetric Cryptography)
- 特点:在加密和解密时使用同一密钥
- 例子:流密码(RC4),块密码(AES,DES)
- 非对称加密(Asymmetric Cryptography)
- 特点:在加密和解密时使用不同密钥,加密使用公钥,解密使用私钥
- 例子:RSA,ElGamal,ECC
- 哈希函数(Hash Function)
- 特点:把输入内容单向映射到一个短的摘要上
- 应用:下载文件完整性校验
- 例子:CRC,MD5,SHA系列
- 数字签名(Digital Signature)
- 应用:对消息进行签名(也是一个短的消息),以防消息的冒名伪造或篡改

数学基础
整除:a∣b
- ∀a∈Z ,1∣a ;若 a=0,则 a∣0 且 a∣a
- 若 a∣b 且 b∣c,则 a∣c
- 若 a∣b 且 a∣c,则 a∣(sb+tc),其中 s,t∈Z
最大公因数(Greatest Common Divisor, GCD):gcd(a,b)
- gcd(a,b)=gcd(b,a)
- gcd(a,b)=gcd(a,b−a)
- gcd(a,b)=gcd(a,bmoda)
特别的,当 a、b互素,即 gcd(a,b)=1时,一定存在整数 x,y 使得 ax+by=1
算数基本定理
任何一个大于 1 的自然数 n 都可以唯一地分解为若干个素数的乘积
n=p1a1×p2a2⋯×pkak
其中 p1,p2,⋯,pk 是素数,a1,a2,⋯,ak 是正整数
同余
a,b对于模n同余:a≡b(modn)
设 a,b,c,d,n均为整数,且 n=0,则有:
- n∣a⇔a≡b(modn)
- a≡a(modn)
- 若 a≡b(modn),c≡d(modn),则 a±c≡b±d(modn),ac≡bd(modn)
- 若 a≡b(modn),则 ak≡bk(modn)
- 若 a≡b(modn),c≡d(modn),则 ac≡bd(modn)
- 若 a+b≡0(modn),则称 a 与 b 互为加法模 n 逆元
- 若 ab≡1(modn),则称 a 与 b 互为乘法模 n 逆元。a 的乘法模 n 逆元记为 a−1 ,a 有乘法模 n 逆元当且仅当 gcd(a,n)=1
中国剩余定理
若 m1,m2,⋯,mk 是两两互质的正整数,则对于任意的整数 a1,a2,⋯,ak,同余方程组
\[
⎩⎨⎧x≡a1(modm1)x≡a2(modm2)⋯x≡ak(modmk)
\]
对模 m=m1m1⋯m1 有唯一解 x。
设 Mi=mim,则 Mi 与 mi 互质,存在整数 Ni 使得 MiNi≡1(modmi)(Ni 为 Mi 的模 mi 乘法逆元),则
x=i=1∑kaiMiNi
欧拉函数
对于正整数 n,欧拉函数 φ(n) 定义为小于等于 n 的正整数中与 n 互质的数的个数
- 若 n=p1a1×p2a2⋯×pkak,则 φ(n)=n×(1−p11)×(1−p21)⋯(1−pk1)
- 若 n=pa,则 φ(n)=pa−pa−1=pa−1(p−1)
- 若 n=p×q,且 p,q 互质,则 φ(n)=φ(p)×φ(q)
- 若 n=p×q,且 p,q 为不同的质数,则 φ(n)=(p−1)(q−1)=φ(p)×φ(q)
欧拉定理
若 a,n 互质,则 aφ(n)≡1(modn)
费马小定理(欧拉定理的特例):当 n 为质数时,φ(n)=n−1,即 an−1≡1(modn)
RSA算法
- 选择两个大质数 p,q,计算 n=p×q,φ(n)=(p−1)(q−1)
- 选择 e,使得 1<e<φ(n),且 gcd(e,φ(n))=1
- 计算 d,使得 d≡e−1(modφ(n)) ,即 d×e≡1(modφ(n))
- 于是得到公钥为 (e,n),私钥为 (d,n), 设明文为 m,密文为 c,若消息太长,可将消息分段加密
- 加密:c=memodn
- 解密:m=cdmodn
古典密码
- 代换(substitution)密码——用新的替换原先的内容
- 置换(permutation)密码——打乱原先的顺序
- Hill密码
凯撒密码
又称加法密码,是一种最简单的替换密码,是一种使用恒定偏移量的替换密码,将字母表中的每个字母循环移动固定位数得到密文
- 加密:y=encode(x)=(x+key)mod26
- 解密:x=decode(y)=(y−key)mod26
- 破解:暴力枚举观察结果(常见编码ROT13,取key=13)
一般的凯撒加密只作用于26个字母,但也可拓展到ASCII码表上(常见编码ROT47,将33~126作为字母表,取key=47)
仿射密码
仿射密码是一种线性替换密码,类似于凯撒加密,但不止进行加法
- 加密 y=encoude(x)=(x×key1+key2)mod26
- 解密 x=decode(y)=(y−key2)×key1−1mod26
- 破解:单表密码加密前后的字符是一一对应的,不会破坏统计规律,根据英文文本中字母出现的频率以及一些常见单词即可轻松破解(如
the, and, you a等)
维吉尼亚密码
一种多表加密的替换密码,密钥任意长,并且以循环使用,第 i 个字符用第 i 个密钥进行偏移
- 加密:yi=encode(xi)=(xi+keyi)mod26
- 解密:xi=decode(yi)=(yi−keyi)mod26

例:明文CRANE,密钥TONY
- (C, T) → V
- (R, O) → F
- (A, N) → N
- (N, Y) → L
- (E, T) → X
破解:确定密钥长度 → 分组爆破加法密码 → 得到密钥
置换密码
加密变换使得信息元素只有位置变化而内容不变,比如对于一种置换密码,其置换表为
| X |
1 |
2 |
3 |
4 |
5 |
6 |
| E(X) |
3 |
5 |
1 |
6 |
4 |
2 |
对于明文crypto basic,先进行分组(不足需填充):[crypto]和[ basic],然后对每一组进行置换:
对每一组进行置换:
[crypto]→[yoctrp] [ basic]→[ac ibs]
最终密文就是yoctrpac ibs
栅栏密码
栅栏密码也是一种置换密码,其将明文分割成k行,然后重新拼接,这里k即为加密的密钥
对于明文crypto basic,取 k=3 ,将明文分割成三行
因此得到的密文为cp srtbiyoac
Hill密码
希尔密码是运用基本线性代数原理实现的替换密码
每个字母当作26进制数字,将一串字母当成 n 维向量,与一个 n×n 的矩阵相乘,再将得出的结果 mod 26,其中这个 n×n 矩阵就是密钥
比如明文 IT ,转换成26进制为P=[920],加密密钥
K=11387
密文即为C=P×K=[159212]mod26=[34],转回字母即 CD
解密只需要计算 K 的逆矩阵即可,$ P = C \times K^{-1} = \begin{bmatrix} 3 & 4 \end{bmatrix} \times
\begin{bmatrix}
7 & 18 \\\\
23 & 11
\end{bmatrix} = \begin{bmatrix} 9 & 20 \end{bmatrix} $,再转回字母即 $\texttt{IT} $