应用密码学考前速记

应用密码学考试前的公式快查和计算题流程速记,覆盖 CRT、GF(2^8)、AES、DES、RSA、ElGamal、ECDSA 与 Shamir 秘密共享等重点。

1. 公式快查

中国剩余定理 CRT

方程组:

xai(modmi),i=1,2,,kx\equiv a_i\pmod {m_i},\quad i=1,2,\ldots,k

若各模数两两互素,则模:

M=m1m2mkM=m_1m_2\cdots m_k

下有唯一解。

计算步骤:

Mi=MmiM_i=\frac{M}{m_i} yi=Mi1(modmi)y_i=M_i^{-1}\pmod {m_i} xi=1kaiMiyi(modM)x\equiv \sum_{i=1}^{k}a_iM_iy_i\pmod M

2. GF(2) 与 GF(282^8)

2.1 GF(2) 运算

元素只有 0,10,1。加法等价于异或:

1+1=01+1=0 a+b=aba+b=a\oplus b

减法等于加法:

ab=a+ba-b=a+b

2.2 GF(282^8) 字节多项式表示

一个字节:

b7b6b1b0b_7b_6\cdots b_1b_0

对应多项式:

b7x7+b6x6++b1x+b0b_7x^7+b_6x^6+\cdots+b_1x+b_0

例如:

0x53=010100110x53=01010011

对应:

x6+x4+x+1x^6+x^4+x+1

2.3 AES 不可约多项式

AES 使用:

m(x)=x8+x4+x3+x+1m(x)=x^8+x^4+x^3+x+1

十六进制为:

0x11B0x11B

乘法结果超过 8 位时,要模 m(x)m(x) 约简。

2.4 xtime 运算

xtime(a)=ax\operatorname{xtime}(a)=a\cdot x

若最高位为 0:

xtime(a)=a<<1\operatorname{xtime}(a)=a<<1

若最高位为 1:

xtime(a)=((a<<1)0x1B) & 0xFF\operatorname{xtime}(a)=((a<<1)\oplus 0x1B)\ \&\ 0xFF

核心记忆:AES 中乘以 0202 就是 xtime。


3. 古典密码

3.3 Hill 密码

加密:

C=KPmod26C=KP\bmod 26

解密:

P=K1Cmod26P=K^{-1}C\bmod 26

4. 分组密码参数

DES Feistel 轮函数:

Li=Ri1L_i=R_{i-1} Ri=Li1F(Ri1,Ki)R_i=L_{i-1}\oplus F(R_{i-1},K_i)

解密与加密结构相同,只是子密钥逆序使用。

4.2 三重 DES

常见 EDE 模式:

C=EK3(DK2(EK1(P)))C=E_{K_3}(D_{K_2}(E_{K_1}(P)))

K1=K3K_1=K_3,称为双密钥 3DES。三重 DES 用多次加解密提高安全性。

4.3 AES

AES 类型分组长度密钥长度轮数
AES-128128 bit128 bit10
AES-192128 bit192 bit12
AES-256128 bit256 bit14

AES 是 SPN 结构,不是 Feistel。

每轮主要操作:

  1. SubBytes
  2. ShiftRows
  3. MixColumns
  4. AddRoundKey

最后一轮没有 MixColumns。


6. 公钥密码体制

6.1 RSA

密钥生成

选择两个大素数:

p,qp,q

计算:

n=pqn=pq φ(n)=(p1)(q1)\varphi(n)=(p-1)(q-1)

选择 ee

gcd(e,φ(n))=1\gcd(e,\varphi(n))=1

dd

de1(modφ(n))d\equiv e^{-1}\pmod {\varphi(n)}

公钥:

(n,e)(n,e)

私钥:

dd

RSA 加密与解密

C=MemodnC=M^e\bmod n M=CdmodnM=C^d\bmod n

RSA 签名与验证

签名:

S=H(M)dmodnS=H(M)^d\bmod n

验证:

H(M)=?SemodnH(M)\stackrel{?}{=}S^e\bmod n

RSA-CRT 快速解密

先分别模 p,qp,q 计算:

mp=Cdmod(p1)modpm_p=C^{d\bmod(p-1)}\bmod p mq=Cdmod(q1)modqm_q=C^{d\bmod(q-1)}\bmod q

再用 CRT 合并:

Mmp(modp)M\equiv m_p\pmod p Mmq(modq)M\equiv m_q\pmod q

常用合并形式:

qinv=q1(modp)q_{inv}=q^{-1}\pmod p h=(qinv(mpmq))modph=(q_{inv}(m_p-m_q))\bmod p M=mq+hqM=m_q+hq

6.2 ElGamal 加密

公共参数:

p,αp,\alpha

其中 pp 是大素数,α\alpha 是模 pp 的本原元。

私钥:

dd

公钥:

β=αdmodp\beta=\alpha^d\bmod p

加密消息 MM,随机选 kk

C1=αkmodpC_1=\alpha^k\bmod p C2=MβkmodpC_2=M\beta^k\bmod p

密文:

(C1,C2)(C_1,C_2)

解密:

M=C2(C1d)1modpM=C_2(C_1^d)^{-1}\bmod p

因为:

C1d=(αk)d=αkd=βkC_1^d=(\alpha^k)^d=\alpha^{kd}=\beta^k

关键条件:随机数 kk 不可预测、不可重用。


7. 椭圆曲线密码 ECC

7.1 椭圆曲线方程

素域 FpF_p 上:

Ep(a,b):y2x3+ax+b(modp)E_p(a,b):y^2\equiv x^3+ax+b\pmod p

要求:

4a3+27b2≢0(modp)4a^3+27b^2\not\equiv 0\pmod p

7.2 判断点是否在曲线上

给点 P=(x,y)P=(x,y),代入:

y2modp=?x3+ax+bmodpy^2\bmod p \stackrel{?}{=} x^3+ax+b\bmod p

相等则在曲线上。

7.3 点加公式

设:

P=(x1,y1),Q=(x2,y2),PQP=(x_1,y_1),\quad Q=(x_2,y_2),\quad P\ne Q

斜率:

λ=(y2y1)(x2x1)1modp\lambda=(y_2-y_1)(x_2-x_1)^{-1}\bmod p

结果 R=P+Q=(x3,y3)R=P+Q=(x_3,y_3)

x3=λ2x1x2modpx_3=\lambda^2-x_1-x_2\bmod p y3=λ(x1x3)y1modpy_3=\lambda(x_1-x_3)-y_1\bmod p

7.4 倍点公式

P=QP=Q

λ=(3x12+a)(2y1)1modp\lambda=(3x_1^2+a)(2y_1)^{-1}\bmod p x3=λ22x1modpx_3=\lambda^2-2x_1\bmod p y3=λ(x1x3)y1modpy_3=\lambda(x_1-x_3)-y_1\bmod p

7.5 ECC 公私钥

基点:GG
阶:nn
私钥:dd
公钥:

Q=dGQ=dG

安全基础:椭圆曲线离散对数困难问题。已知 G,QG,Q,难以求 dd


8. 散列函数与消息鉴别

8.1 密码散列函数

h=H(M)h=H(M)

基本性质:

  1. 任意长度输入。
  2. 固定长度输出。
  3. 易计算。
  4. 单向性。
  5. 弱抗碰撞性。
  6. 强抗碰撞性。

8.2 攻击复杂度

若散列输出长度为 nn bit:

原像攻击:

2n2^n

第二原像攻击:

2n2^n

生日攻击:

2n/22^{n/2}

结论:若想达到 128 bit 抗碰撞安全强度,通常需要 256 bit 输出。

8.3 常见散列算法参数

算法输出长度备注
MD5128 bit已不安全
SHA-1160 bit不推荐用于抗碰撞场景
SHA-256256 bit常用
SM3256 bit国密散列算法

8.4 MAC

生成:

t=MACK(M)t=MAC_K(M)

作用:完整性 + 消息源鉴别。
限制:MAC 不能提供抗抵赖性,因为双方共享同一密钥。

8.5 CBC-MAC

设消息分组:

M1,M2,,MnM_1,M_2,\ldots,M_n

初始化:

C0=0C_0=0

迭代:

Ci=EK(MiCi1)C_i=E_K(M_i\oplus C_{i-1})

最终 MAC:

T=CnT=C_n

易错点:

  1. CBC-MAC 的密钥 KK 不能公开。
  2. 若密钥公开,攻击者可以自己计算合法 MAC。
  3. CBC-MAC 直接用于变长消息不安全。

9. 数字签名

9.1 基本流程

签名:

S=Signsk(H(M))S=Sign_{sk}(H(M))

验证:

Verifypk(M,S)Verify_{pk}(M,S)

提供:完整性、身份认证、抗抵赖性。

9.2 RSA 数字签名

签名:

S=H(M)dmodnS=H(M)^d\bmod n

验证:

H(M)=?SemodnH(M)\stackrel{?}{=}S^e\bmod n

9.3 ElGamal 数字签名

公共参数:

p,αp,\alpha

私钥:

dd

公钥:

β=αdmodp\beta=\alpha^d\bmod p

消息散列:

m=H(M)m=H(M)

随机选择 kk,要求:

1<k<p11<k<p-1 gcd(k,p1)=1\gcd(k,p-1)=1

计算:

r=αkmodpr=\alpha^k\bmod p s=k1(mdr)mod(p1)s=k^{-1}(m-dr)\bmod(p-1)

签名:

(r,s)(r,s)

验证:

αm=?βrrsmodp\alpha^m\stackrel{?}{=}\beta^r r^s\bmod p

证明核心:

sk1(mdr)(modp1)s\equiv k^{-1}(m-dr)\pmod {p-1}

所以:

ksmdr(modp1)ks\equiv m-dr\pmod {p-1} dr+ksm(modp1)dr+ks\equiv m\pmod {p-1}

于是:

βrrs=(αd)r(αk)s=αdr+ksαm(modp)\beta^r r^s=(\alpha^d)^r(\alpha^k)^s=\alpha^{dr+ks}\equiv \alpha^m\pmod p

易错点:

  1. kk 必须保密。
  2. kk 不能重复。
  3. kk 必须与 p1p-1 互素。
  4. 重复使用同一个 kk 会泄露私钥。

9.4 ECDSA

公共参数:椭圆曲线 EE、基点 GG、阶 nn
私钥:dd
公钥:

Q=dGQ=dG

消息散列:

e=H(M)e=H(M)

签名过程

随机选 kk

1kn11\le k\le n-1

计算:

(x1,y1)=kG(x_1,y_1)=kG r=x1modnr=x_1\bmod n

r=0r=0,重选 kk

计算:

s=k1(e+dr)modns=k^{-1}(e+dr)\bmod n

s=0s=0,重选 kk

签名:

(r,s)(r,s)

验证过程

先检查:

1r,sn11\le r,s\le n-1

计算:

w=s1modnw=s^{-1}\bmod n u1=ewmodnu_1=ew\bmod n u2=rwmodnu_2=rw\bmod n

计算点:

X=u1G+u2QX=u_1G+u_2Q

若:

X=(x1,y1)X=(x_1,y_1)

验证:

v=x1modnv=x_1\bmod n v=?rv\stackrel{?}{=}r

成立则签名有效。

ECDSA 易错点:

  1. r,sr,s 都是模 nn 计算。
  2. 验证时不是重新计算 kGkG
  3. 验证核心点是 X=u1G+u2QX=u_1G+u_2Q
  4. kk 不能泄露,不能重复。

10. Diffie-Hellman 密钥交换

公共参数:

p,αp,\alpha

A 选择私钥 aa

A=αamodpA=\alpha^a\bmod p

B 选择私钥 bb

B=αbmodpB=\alpha^b\bmod p

共享密钥:

K=BamodpK=B^a\bmod p K=AbmodpK=A^b\bmod p

因为:

Ba=(αb)a=αabB^a=(\alpha^b)^a=\alpha^{ab} Ab=(αa)b=αabA^b=(\alpha^a)^b=\alpha^{ab}

所以:

K=αabmodpK=\alpha^{ab}\bmod p

安全基础:离散对数困难问题。
易错点:普通 DH 不提供身份鉴别,容易受到中间人攻击,必须结合签名、证书或 MAC。


11. Shamir 秘密共享

11.1 (t,n)(t,n) 门限含义

  1. 秘密分成 nn 份。
  2. 任意 tt 份可以恢复秘密。
  3. 少于 tt 份不能恢复秘密。

11.2 构造

秘密为 SS,选择随机多项式:

f(x)=S+a1x+a2x2++at1xt1(modp)f(x)=S+a_1x+a_2x^2+\cdots+a_{t-1}x^{t-1}\pmod p

其中:

f(0)=Sf(0)=S

分发份额:

(xi,f(xi))(x_i,f(x_i))

11.3 拉格朗日插值恢复秘密

S=f(0)=i=1tyili(0)(modp)S=f(0)=\sum_{i=1}^{t}y_il_i(0)\pmod p

其中:

li(0)=ji0xjxixj(modp)l_i(0)=\prod_{j\ne i}\frac{0-x_j}{x_i-x_j}\pmod p

即:

li(0)=jixjxixj(modp)l_i(0)=\prod_{j\ne i}\frac{-x_j}{x_i-x_j}\pmod p

除法转逆元:

abab1(modp)\frac{a}{b}\equiv a\cdot b^{-1}\pmod p

12. 身份鉴别与抗重放

12.3 质询-响应抗重放

B 发送随机数:

NBN_B

A 返回:

MACK(NB)MAC_K(N_B)

或:

EK(NB)E_K(N_B)

或:

SignA(NB)Sign_A(N_B)

优点:不依赖时钟同步。
缺点:交互轮次更多。


13. 序列密码与 LFSR

13.1 序列密码

加密:

Ci=PiKiC_i=P_i\oplus K_i

解密:

Pi=CiKiP_i=C_i\oplus K_i

密钥流 KiK_i 不能重复。

若密钥流重复:

C1=P1KC_1=P_1\oplus K C2=P2KC_2=P_2\oplus K

则:

C1C2=P1P2C_1\oplus C_2=P_1\oplus P_2

会泄露明文关系。

13.2 LFSR

状态递推:

si+n=cn1si+n1cn2si+n2c0sis_{i+n}=c_{n-1}s_{i+n-1}\oplus c_{n-2}s_{i+n-2}\oplus\cdots\oplus c_0s_i

特征多项式:

f(x)=xn+cn1xn1++c1x+c0f(x)=x^n+c_{n-1}x^{n-1}+\cdots+c_1x+c_0

最大周期 M 序列:

T=2n1T=2^n-1

易错点:全 0 初态会一直输出 0,不能作为有效初态。


14. 综合应用方案模板

14.3 机密性 + 完整性 + 鉴别性

推荐 Encrypt-then-MAC:

C=EK1(M)C=E_{K_1}(M) T=MACK2(C)T=MAC_{K_2}(C)

发送:

C,TC,T

接收方先验证 MAC,再解密。

14.4 抗抵赖性

使用数字签名:

S=SignskA(H(M))S=Sign_{sk_A}(H(M))

发送:

M,SM,S

验证:

VerifypkA(M,S)Verify_{pk_A}(M,S)

14.5 混合密码体制

  1. 随机会话密钥 KsK_s 加密消息:
C=EKs(M)C=E_{K_s}(M)
  1. 用接收方公钥加密会话密钥:
CK=EpkB(Ks)C_K=E_{pk_B}(K_s)
  1. 发送:
CK,CC_K,C

若还需要签名:

S=SignskA(H(C))S=Sign_{sk_A}(H(C))

发送:

CK,C,SC_K,C,S

15. 考前必背参数表

算法分组/输出密钥轮数/特点
DES64 bit56 bit 有效16 轮 Feistel
3DES64 bit112/168 bitEDE
AES-128128 bit128 bit10 轮 SPN
AES-192128 bit192 bit12 轮
AES-256128 bit256 bit14 轮
SM4128 bit128 bit32 轮
MD5128 bit-不安全
SHA-1160 bit-不推荐
SHA-256256 bit-常用
SM3256 bit-国密散列

16. 最容易丢分的条件

  1. 求逆元前先看:
gcd(a,n)=1\gcd(a,n)=1
  1. 仿射密码要求:
gcd(a,26)=1\gcd(a,26)=1
  1. Hill 密码要求:
gcd(detK,26)=1\gcd(\det K,26)=1
  1. ElGamal 签名要求:
gcd(k,p1)=1\gcd(k,p-1)=1
  1. ElGamal / ECDSA 的随机数 kk 不能重复。
  2. CBC、CFB、OFB、CTR 都要注意 IV/Nonce,尤其 CTR 绝不能重复。
  3. MAC 不能抗抵赖,数字签名可以抗抵赖。
  4. RSA 私钥是 dd,ECC 私钥是标量 dd,ECC 公钥是点 Q=dGQ=dG
  5. DH 本身不鉴别身份,会被中间人攻击。
  6. CBC-MAC 的密钥不能公开。
  7. RSA 是公钥密码算法,不是分组密码。
  8. AES 是 SPN,DES 是 Feistel。
  9. ECDSA 验证时计算 X=u1G+u2QX=u_1G+u_2Q,不是重新计算 kGkG

17. 计算题快速流程

17.1 RSA 计算题

  1. 计算 n=pqn=pq
  2. 计算 φ(n)=(p1)(q1)\varphi(n)=(p-1)(q-1)
  3. 检查 gcd(e,φ(n))=1\gcd(e,\varphi(n))=1
  4. 用扩展欧几里得求 d=e1(modφ(n))d=e^{-1}\pmod{\varphi(n)}
  5. 加密:C=MemodnC=M^e\bmod n
  6. 解密:M=CdmodnM=C^d\bmod n
  7. 若题目要求 CRT,则先模 p,qp,q 分别算,再合并。

17.2 ElGamal 签名题

  1. 计算公钥:β=αdmodp\beta=\alpha^d\bmod p
  2. 检查 gcd(k,p1)=1\gcd(k,p-1)=1
  3. 计算 r=αkmodpr=\alpha^k\bmod p
  4. 计算 s=k1(H(M)dr)mod(p1)s=k^{-1}(H(M)-dr)\bmod(p-1)
  5. 验证:αH(M)=?βrrsmodp\alpha^{H(M)}\stackrel{?}{=}\beta^r r^s\bmod p

17.3 ECDSA 计算题

  1. 计算公钥:Q=dGQ=dG
  2. 计算 kG=(x1,y1)kG=(x_1,y_1)
  3. 计算 r=x1modnr=x_1\bmod n
  4. 计算 s=k1(e+dr)modns=k^{-1}(e+dr)\bmod n
  5. 验证时算 w=s1modnw=s^{-1}\bmod n
  6. u1=ewmodnu_1=ew\bmod nu2=rwmodnu_2=rw\bmod n
  7. X=u1G+u2QX=u_1G+u_2Q
  8. 验证 xXmodn=?rx_X\bmod n\stackrel{?}{=}r

17.4 Shamir 秘密共享题

  1. 明确门限 tt 和模数 pp
  2. tt 个点做拉格朗日插值。
  3. 只需要恢复秘密时,直接求 f(0)f(0)
  4. 所有除法都转成模逆元。

评论