1. 公式快查
中国剩余定理 CRT
方程组:
x≡ai(modmi),i=1,2,…,k
若各模数两两互素,则模:
M=m1m2⋯mk
下有唯一解。
计算步骤:
Mi=miM
yi=Mi−1(modmi)
x≡i=1∑kaiMiyi(modM)
2. GF(2) 与 GF(28)
2.1 GF(2) 运算
元素只有 0,1。加法等价于异或:
1+1=0
a+b=a⊕b
减法等于加法:
a−b=a+b
2.2 GF(28) 字节多项式表示
一个字节:
b7b6⋯b1b0
对应多项式:
b7x7+b6x6+⋯+b1x+b0
例如:
0x53=01010011
对应:
x6+x4+x+1
2.3 AES 不可约多项式
AES 使用:
m(x)=x8+x4+x3+x+1
十六进制为:
0x11B
乘法结果超过 8 位时,要模 m(x) 约简。
2.4 xtime 运算
xtime(a)=a⋅x
若最高位为 0:
xtime(a)=a<<1
若最高位为 1:
xtime(a)=((a<<1)⊕0x1B) & 0xFF
核心记忆:AES 中乘以 02 就是 xtime。
3. 古典密码
3.3 Hill 密码
加密:
C=KPmod26
解密:
P=K−1Cmod26
4. 分组密码参数
DES Feistel 轮函数:
Li=Ri−1
Ri=Li−1⊕F(Ri−1,Ki)
解密与加密结构相同,只是子密钥逆序使用。
4.2 三重 DES
常见 EDE 模式:
C=EK3(DK2(EK1(P)))
若 K1=K3,称为双密钥 3DES。三重 DES 用多次加解密提高安全性。
4.3 AES
| AES 类型 | 分组长度 | 密钥长度 | 轮数 |
|---|
| AES-128 | 128 bit | 128 bit | 10 |
| AES-192 | 128 bit | 192 bit | 12 |
| AES-256 | 128 bit | 256 bit | 14 |
AES 是 SPN 结构,不是 Feistel。
每轮主要操作:
- SubBytes
- ShiftRows
- MixColumns
- AddRoundKey
最后一轮没有 MixColumns。
6. 公钥密码体制
6.1 RSA
密钥生成
选择两个大素数:
p,q
计算:
n=pq
φ(n)=(p−1)(q−1)
选择 e:
gcd(e,φ(n))=1
求 d:
d≡e−1(modφ(n))
公钥:
(n,e)
私钥:
d
RSA 加密与解密
C=Memodn
M=Cdmodn
RSA 签名与验证
签名:
S=H(M)dmodn
验证:
H(M)=?Semodn
RSA-CRT 快速解密
先分别模 p,q 计算:
mp=Cdmod(p−1)modp
mq=Cdmod(q−1)modq
再用 CRT 合并:
M≡mp(modp)
M≡mq(modq)
常用合并形式:
qinv=q−1(modp)
h=(qinv(mp−mq))modp
M=mq+hq
6.2 ElGamal 加密
公共参数:
p,α
其中 p 是大素数,α 是模 p 的本原元。
私钥:
d
公钥:
β=αdmodp
加密消息 M,随机选 k:
C1=αkmodp
C2=Mβkmodp
密文:
(C1,C2)
解密:
M=C2(C1d)−1modp
因为:
C1d=(αk)d=αkd=βk
关键条件:随机数 k 不可预测、不可重用。
7. 椭圆曲线密码 ECC
7.1 椭圆曲线方程
素域 Fp 上:
Ep(a,b):y2≡x3+ax+b(modp)
要求:
4a3+27b2≡0(modp)
7.2 判断点是否在曲线上
给点 P=(x,y),代入:
y2modp=?x3+ax+bmodp
相等则在曲线上。
7.3 点加公式
设:
P=(x1,y1),Q=(x2,y2),P=Q
斜率:
λ=(y2−y1)(x2−x1)−1modp
结果 R=P+Q=(x3,y3):
x3=λ2−x1−x2modp
y3=λ(x1−x3)−y1modp
7.4 倍点公式
若 P=Q:
λ=(3x12+a)(2y1)−1modp
x3=λ2−2x1modp
y3=λ(x1−x3)−y1modp
7.5 ECC 公私钥
基点:G
阶:n
私钥:d
公钥:
Q=dG
安全基础:椭圆曲线离散对数困难问题。已知 G,Q,难以求 d。
8. 散列函数与消息鉴别
8.1 密码散列函数
h=H(M)
基本性质:
- 任意长度输入。
- 固定长度输出。
- 易计算。
- 单向性。
- 弱抗碰撞性。
- 强抗碰撞性。
8.2 攻击复杂度
若散列输出长度为 n bit:
原像攻击:
2n
第二原像攻击:
2n
生日攻击:
2n/2
结论:若想达到 128 bit 抗碰撞安全强度,通常需要 256 bit 输出。
8.3 常见散列算法参数
| 算法 | 输出长度 | 备注 |
|---|
| MD5 | 128 bit | 已不安全 |
| SHA-1 | 160 bit | 不推荐用于抗碰撞场景 |
| SHA-256 | 256 bit | 常用 |
| SM3 | 256 bit | 国密散列算法 |
8.4 MAC
生成:
t=MACK(M)
作用:完整性 + 消息源鉴别。
限制:MAC 不能提供抗抵赖性,因为双方共享同一密钥。
8.5 CBC-MAC
设消息分组:
M1,M2,…,Mn
初始化:
C0=0
迭代:
Ci=EK(Mi⊕Ci−1)
最终 MAC:
T=Cn
易错点:
- CBC-MAC 的密钥 K 不能公开。
- 若密钥公开,攻击者可以自己计算合法 MAC。
- CBC-MAC 直接用于变长消息不安全。
9. 数字签名
9.1 基本流程
签名:
S=Signsk(H(M))
验证:
Verifypk(M,S)
提供:完整性、身份认证、抗抵赖性。
9.2 RSA 数字签名
签名:
S=H(M)dmodn
验证:
H(M)=?Semodn
9.3 ElGamal 数字签名
公共参数:
p,α
私钥:
d
公钥:
β=αdmodp
消息散列:
m=H(M)
随机选择 k,要求:
1<k<p−1
gcd(k,p−1)=1
计算:
r=αkmodp
s=k−1(m−dr)mod(p−1)
签名:
(r,s)
验证:
αm=?βrrsmodp
证明核心:
s≡k−1(m−dr)(modp−1)
所以:
ks≡m−dr(modp−1)
dr+ks≡m(modp−1)
于是:
βrrs=(αd)r(αk)s=αdr+ks≡αm(modp)
易错点:
- k 必须保密。
- k 不能重复。
- k 必须与 p−1 互素。
- 重复使用同一个 k 会泄露私钥。
9.4 ECDSA
公共参数:椭圆曲线 E、基点 G、阶 n。
私钥:d。
公钥:
Q=dG
消息散列:
e=H(M)
签名过程
随机选 k:
1≤k≤n−1
计算:
(x1,y1)=kG
r=x1modn
若 r=0,重选 k。
计算:
s=k−1(e+dr)modn
若 s=0,重选 k。
签名:
(r,s)
验证过程
先检查:
1≤r,s≤n−1
计算:
w=s−1modn
u1=ewmodn
u2=rwmodn
计算点:
X=u1G+u2Q
若:
X=(x1,y1)
验证:
v=x1modn
v=?r
成立则签名有效。
ECDSA 易错点:
- r,s 都是模 n 计算。
- 验证时不是重新计算 kG。
- 验证核心点是 X=u1G+u2Q。
- k 不能泄露,不能重复。
10. Diffie-Hellman 密钥交换
公共参数:
p,α
A 选择私钥 a:
A=αamodp
B 选择私钥 b:
B=αbmodp
共享密钥:
K=Bamodp
K=Abmodp
因为:
Ba=(αb)a=αab
Ab=(αa)b=αab
所以:
K=αabmodp
安全基础:离散对数困难问题。
易错点:普通 DH 不提供身份鉴别,容易受到中间人攻击,必须结合签名、证书或 MAC。
11. Shamir 秘密共享
11.1 (t,n) 门限含义
- 秘密分成 n 份。
- 任意 t 份可以恢复秘密。
- 少于 t 份不能恢复秘密。
11.2 构造
秘密为 S,选择随机多项式:
f(x)=S+a1x+a2x2+⋯+at−1xt−1(modp)
其中:
f(0)=S
分发份额:
(xi,f(xi))
11.3 拉格朗日插值恢复秘密
S=f(0)=i=1∑tyili(0)(modp)
其中:
li(0)=j=i∏xi−xj0−xj(modp)
即:
li(0)=j=i∏xi−xj−xj(modp)
除法转逆元:
ba≡a⋅b−1(modp)
12. 身份鉴别与抗重放
12.3 质询-响应抗重放
B 发送随机数:
NB
A 返回:
MACK(NB)
或:
EK(NB)
或:
SignA(NB)
优点:不依赖时钟同步。
缺点:交互轮次更多。
13. 序列密码与 LFSR
13.1 序列密码
加密:
Ci=Pi⊕Ki
解密:
Pi=Ci⊕Ki
密钥流 Ki 不能重复。
若密钥流重复:
C1=P1⊕K
C2=P2⊕K
则:
C1⊕C2=P1⊕P2
会泄露明文关系。
13.2 LFSR
状态递推:
si+n=cn−1si+n−1⊕cn−2si+n−2⊕⋯⊕c0si
特征多项式:
f(x)=xn+cn−1xn−1+⋯+c1x+c0
最大周期 M 序列:
T=2n−1
易错点:全 0 初态会一直输出 0,不能作为有效初态。
14. 综合应用方案模板
14.3 机密性 + 完整性 + 鉴别性
推荐 Encrypt-then-MAC:
C=EK1(M)
T=MACK2(C)
发送:
C,T
接收方先验证 MAC,再解密。
14.4 抗抵赖性
使用数字签名:
S=SignskA(H(M))
发送:
M,S
验证:
VerifypkA(M,S)
14.5 混合密码体制
- 随机会话密钥 Ks 加密消息:
C=EKs(M)
- 用接收方公钥加密会话密钥:
CK=EpkB(Ks)
- 发送:
CK,C
若还需要签名:
S=SignskA(H(C))
发送:
CK,C,S
15. 考前必背参数表
| 算法 | 分组/输出 | 密钥 | 轮数/特点 |
|---|
| DES | 64 bit | 56 bit 有效 | 16 轮 Feistel |
| 3DES | 64 bit | 112/168 bit | EDE |
| AES-128 | 128 bit | 128 bit | 10 轮 SPN |
| AES-192 | 128 bit | 192 bit | 12 轮 |
| AES-256 | 128 bit | 256 bit | 14 轮 |
| SM4 | 128 bit | 128 bit | 32 轮 |
| MD5 | 128 bit | - | 不安全 |
| SHA-1 | 160 bit | - | 不推荐 |
| SHA-256 | 256 bit | - | 常用 |
| SM3 | 256 bit | - | 国密散列 |
16. 最容易丢分的条件
- 求逆元前先看:
gcd(a,n)=1
- 仿射密码要求:
gcd(a,26)=1
- Hill 密码要求:
gcd(detK,26)=1
- ElGamal 签名要求:
gcd(k,p−1)=1
- ElGamal / ECDSA 的随机数 k 不能重复。
- CBC、CFB、OFB、CTR 都要注意 IV/Nonce,尤其 CTR 绝不能重复。
- MAC 不能抗抵赖,数字签名可以抗抵赖。
- RSA 私钥是 d,ECC 私钥是标量 d,ECC 公钥是点 Q=dG。
- DH 本身不鉴别身份,会被中间人攻击。
- CBC-MAC 的密钥不能公开。
- RSA 是公钥密码算法,不是分组密码。
- AES 是 SPN,DES 是 Feistel。
- ECDSA 验证时计算 X=u1G+u2Q,不是重新计算 kG。
17. 计算题快速流程
17.1 RSA 计算题
- 计算 n=pq。
- 计算 φ(n)=(p−1)(q−1)。
- 检查 gcd(e,φ(n))=1。
- 用扩展欧几里得求 d=e−1(modφ(n))。
- 加密:C=Memodn。
- 解密:M=Cdmodn。
- 若题目要求 CRT,则先模 p,q 分别算,再合并。
17.2 ElGamal 签名题
- 计算公钥:β=αdmodp。
- 检查 gcd(k,p−1)=1。
- 计算 r=αkmodp。
- 计算 s=k−1(H(M)−dr)mod(p−1)。
- 验证:αH(M)=?βrrsmodp。
17.3 ECDSA 计算题
- 计算公钥:Q=dG。
- 计算 kG=(x1,y1)。
- 计算 r=x1modn。
- 计算 s=k−1(e+dr)modn。
- 验证时算 w=s−1modn。
- 算 u1=ewmodn,u2=rwmodn。
- 算 X=u1G+u2Q。
- 验证 xXmodn=?r。
17.4 Shamir 秘密共享题
- 明确门限 t 和模数 p。
- 用 t 个点做拉格朗日插值。
- 只需要恢复秘密时,直接求 f(0)。
- 所有除法都转成模逆元。
评论