密码学上课笔记。
绪论
信息安全面临的威胁
安全威胁
-
被动攻击
也称窃听,以获取信息为目的。可分为两类:获取消息的内容和业务流分析
-
主动攻击
对数据流进行篡改或产生假的数据流
安全业务
- 鉴别业务:也称认证业务,最基本的安全服务,是对付假冒攻击的有效方法,以保障通信的真实性,可细分为对等实体鉴别和数据源鉴别
- 访问控制:用于防止资源的未授权使用,检查用户是否具有对某一资源的访问权
- 机密性业务:保护信息(数据)不泄露或不泄露给那些未获授权访问信息的实体
- 数据完整性业务:保证接收的消息未经复制、插入、篡改、重排或重放。即保证接收的消息和发送的消息完全一样
- 抗抵赖业务:即不可否认性业务,防止通信双方中的某一方对所传送消息的否认,保护通信实体免遭来自其他合法实体的威胁
密码学基本概念
保密通信系统

M M M 表示明文空间、 C C C 表示密文空间;密钥空间为 K 1 K_1 K1 和 K 2 K_2 K2;加密变换 E K 1 E_{K_1} EK1: M → C M\rightarrow C M→C ;解密变换 D K 2 D_{K_2} DK2: C → M C\rightarrow M C→M;称 ( M , C , K 1 , K 2 , E K 1 , D K 2 ) (M, C, K_1, K_2, E_{K_1}, D_{K_2}) (M,C,K1,K2,EK1,DK2) 为保密通信系统或密码体制
密码体制分类
Expected node of type ordgroup, but got node of type text
密码攻击
攻击类型 | 攻击者掌握的内容 |
---|---|
唯密文攻击 | 加密算法,截获的部分密文 |
已知明文攻击 | 加密算法,截获的部分密文,一个或多个明密文对 |
选择明文攻击 | 加密算法,截获的部分密文,自己选择的明文消息及由密钥产生的相应密文 |
选择密文攻击 | 加密算法,截获的部分密文,自己选择的密文消息及相应的被解密的明文 |
古典密码算法
单表代换密码
凯撒密码
a a a | b b b | c c c | d d d | e e e | f f f | ⋯ \cdots ⋯ | z z z |
---|---|---|---|---|---|---|---|
0 0 0 | 1 1 1 | 2 2 2 | 3 3 3 | 4 4 4 | 5 5 5 | ⋯ \cdots ⋯ | 25 25 25 |
- 加密代换: c = E 3 ( m ) ≡ m + 3 ( m o d 26 ) , 0 ≤ m ≤ 25 c = E_3(m)\equiv m+3 (\mod 26), 0\leq m\leq25 c=E3(m)≡m+3(mod26),0≤m≤25
- 解密代换: m = D 3 ( c ) ≡ c - 3 ( m o d 26 ) , 0 ≤ c ≤ 25 m = D_3(c) \equiv c-3 (\mod 26), 0\leq c\leq25 m=D3(c)≡c-3(mod26),0≤c≤25
移位变换
- 加密变换: c = E k ( m ) ≡ m + k ( m o d 26 ) , 0 ≤ m , k ≤ 25 c = E_k(m) \equiv m+k (\mod 26), 0\leq m, k\leq25 c=Ek(m)≡m+k(mod26),0≤m,k≤25
- 解密变换: m = D k ( c ) ≡ c - k ( m o d 26 ) , 0 ≤ c , k ≤ 25 m = D_k(c) \equiv c-k (\mod 26), 0\leq c, k\leq25 m=Dk(c)≡c-k(mod26),0≤c,k≤25
仿射变换
a a a, b b b 是密钥,满足 0 ≤ m , k ≤ 25 0\leq m, k\leq25 0≤m,k≤25 和 gcd ( a , 26 ) = 1 \gcd(a,26)=1 gcd(a,26)=1 的整数
- 加密变换: c = E a , b ( m ) ≡ a m + b ( m o d 26 ) c = E_{a,b}(m) \equiv am+b (\mod 26) c=Ea,b(m)≡am+b(mod26)
- 解密变换: m = D a , b ( c ) ≡ a − 1 ( c - b ) ( m o d 26 ) m = D_{a,b} (c) \equiv a^{-1}(c-b) (\mod 26) m=Da,b(c)≡a−1(c-b)(mod26)
多表代换密码
维吉尼亚密码
在长为 m m m 的密码中,任何一个字母可被映射到 26 26 26 个字母中的一个
- 明文 p ∈ ( Z 26 ) m p \in(Z_{26})^m p∈(Z26)m, 密文 c ∈ ( Z 26 ) m c \in (Z_{26})^m c∈(Z26)m , 密钥 k ∈ ( Z 26 ) m k \in (Z_{26})^m k∈(Z26)m
- 加密 c = ( p 1 + k 1 , p 2 + k 2 , ⋯ , p m + k m ) m o d 26 c= (p_1+k_1 , p_2+k_2 , \cdots, p_m+k_m) \mod 26 c=(p1+k1,p2+k2,⋯,pm+km)mod26
- 解密 p = ( c 1 − k 1 , c 2 − k 2 , ⋯ , c m − k m ) m o d 26 p = (c_1-k_1 , c_2-k_2 ,\cdots, c_m-k_m) \mod 26 p=(c1−k1,c2−k2,⋯,cm−km)mod26
多字母代换密码
Hill 密码
m m m 个连续明文字母被 m m m 个密文字母代替,由 m m m 个线性方程决定替代方法
m = 3 m=3 m=3 时的系统描述:编码 ( a = 0 , b = 1 , ⋯ , z = 25 ) (a=0,b=1,\cdots,z=25) (a=0,b=1,⋯,z=25),$ C=KP$
( C 1 C 2 C 3 ) = ( k 11 k 12 k 13 k 21 k 22 k 23 k 31 k 32 k 33 ) ( p 1 p 2 p 3 ) ( m o d 26 ) \left(\begin{matrix}C_1\\C_2\\C_3\end{matrix}\right)=\left(\begin{matrix}k_{11}&k_{12}&k_{13}\\k_{21}&k_{22}&k_{23}\\k_{31}&k_{32}&k_{33}\end{matrix}\right)\left(\begin{matrix}p_1\\p_2\\p_3\end{matrix}\right)\left(\mod 26\right) ⎝⎛C1C2C3⎠⎞=⎝⎛k11k21k31k12k22k32k13k23k33⎠⎞⎝⎛p1p2p3⎠⎞(mod26)
- 破解: C = K P ⟹ K = C P − 1 C=KP\Longrightarrow K=CP^{-1} C=KP⟹K=CP−1
多字母仿射变换密码
-
首先将明文 M M M 分为由 n n n 个字母构成的分组 M 1 , M 2 , ⋯ , M j M_1, M_2, \cdots, M_j M1,M2,⋯,Mj,对每个分组 M i M_i Mi 的加密为
C i ≡ A M i + B ( m o d N ) , i = 1 , 2 , ⋯ , j C_i \equiv AM_i + B (\mod N), i=1, 2, \cdots, j Ci≡AMi+B(modN),i=1,2,⋯,j,其中, ( A , B ) (A, B) (A,B) 是密钥, A A A 是 n × n n\times n n×n 的可逆矩阵,满足 gcd ( ∣ A ∣ , N ) = 1 \gcd(|A|, N) = 1 gcd(∣A∣,N)=1 ( ∣ A ∣ |A| ∣A∣ 是行列式)
B = ( b 1 , b 2 , ⋯ , b n ) T B=(b_1, b_2,\cdots, b_n)^T B=(b1,b2,⋯,bn)T
C i = ( c 1 , c 2 , ⋯ , c n ) T C_i=(c_1, c_2,\cdots, c_n)^T Ci=(c1,c2,⋯,cn)T
M i = ( m 1 , m 2 , ⋯ , m n ) T M_i=(m_1, m_2,\cdots, m_n)^T Mi=(m1,m2,⋯,mn)T
-
对密文分组 C i C_i Ci 的解密为
M i ≡ A − 1 ( C i - B ) ( m o d N ) , i = 1 , 2 , ⋯ , j M_i \equiv A^{-1}(C_i-B) (\mod N), i=1, 2, \cdots ,j Mi≡A−1(Ci-B)(modN),i=1,2,⋯,j
置换密码
又称换位密码,明文字母保持相同,但顺序被打乱了。即对明文字母的某种置换取得一种类型完全不同的映射,即明文中字母重新排列,本身未变,位置发生改变
栅栏密码
- 加密:明文以固定的宽度水平地写在一张图表纸上,密文按垂直方向读出
- 解密:将密文按相同的宽度垂直地写在图表纸上,然后水平地读出明文
流密码
概念
同步流密码
- 由密钥流发生器 f f f 产生: z i = f ( k , σ i ) z_i =f(k, \sigma_i) zi=f(k,σi), σ i \sigma_i σi 是加密器中的记忆元件在时刻 i i i 的状态,可表示为 σ i = ( a n , a n − 1 , ⋯ , a 1 ) \sigma_i = (a_n, a_{n-1}, \cdots, a_1) σi=(an,an−1,⋯,a1)
- 按照加密器中记忆元件的存储状态 σ i \sigma_i σi 是否依赖于明文字符流,流密码可进一步分为同步流密码和自同步流密码
-
有限状态自动机
-
流密码中任意时刻密钥流和密文的输出与状态密切相关。可用具有离散输入集和输出集的有限状态自动机模型表述
-
有限状态集: S = { s i ∣ i = 1 , 2 , ⋯ , l } S=\left\{ s_i | i=1, 2,\cdots, l \right\} S={si∣i=1,2,⋯,l} 共 l l l 个可能状态
-
有限输入字符集: A 1 = { A j ( 1 ) ∣ j = 1 , 2 , ⋯ , m } A_1=\left\{A_{j}^{(1)} | j=1, 2, \cdots, m\right\} A1={Aj(1)∣j=1,2,⋯,m}
有限输出字符集: A 2 = { A k ( 2 ) ∣ k = 1 , 2 , ⋯ , n } A_2=\left\{A_{k}^{(2)}| k=1, 2 ,\cdots, n\right\} A2={Ak(2)∣k=1,2,⋯,n}
-
输出函数: A k ( 2 ) = f 1 ( s i , A j ( 1 ) ) A_{k}^{(2)}=f_1\left(s_i , A_{j}^{(1)}\right) Ak(2)=f1(si,Aj(1))
状态转移函数: s h = f 2 ( s i , A j ( 1 ) ) s_h=f_2\left(s_i , A_{j}^{(1)}\right) sh=f2(si,Aj(1))
-
密钥流产生器
-
可将密钥流产生器看成参数为 k k k 的有限状态自动机,由输出符号集 Z Z Z、状态集 Σ \Sigma Σ (初始状态 σ 0 \sigma_0 σ0 )、状态转移函数 φ \varphi φ 和输出函数 Ψ \varPsi Ψ 构成
-
具有非线性的 φ \varphi φ 的有限状态自动机理论很不完善,相反,采用线性的 φ \varphi φ 和非线性的 Ψ \varPsi Ψ 时能够进行深入分析并可以得到好的生成器
线性反馈移位寄存器
反馈移位寄存器
-
GF ( 2 ) \text{GF}(2) GF(2) 上的 n n n 级 FSR 由 n n n 个二元存储器与一个反馈函数 f ( a 1 , a 2 , ⋯ , a n ) f(a_1, a_2,\cdots,a_n) f(a1,a2,⋯,an) 组成
LFSR
- f ( a 1 , a 2 , ⋯ , a n ) = c n a 1 ⊕ c n − 1 a 2 ⊕ ⋯ ⊕ c 1 a n , c i = 0 , 1 f(a_1,a_2,\cdots,a_n)=c_na_1\oplus c_{n-1}a_2\oplus\cdots\oplus c_1a_n, c_i=0,1 f(a1,a2,⋯,an)=cna1⊕cn−1a2⊕⋯⊕c1an,ci=0,1
- 若其初始状态非全 0 0 0,则其后继状态也不会为全 0 0 0。因此 n n n 级 LFSR 此输出序列的周期 = = = 状态周期 ≤ 2 n − 1 \leq 2^n-1 ≤2n−1
- 周期达到最大值的线性序列称为 m 序列
LFSR 的一元多项式表示
-
递推关系式 a k + n = c 1 a k + n − 1 ⊕ c 2 a k + n − 2 ⊕ ⋯ ⊕ c n a k , k ≥ 1 a_{k+n}=c_1a_{k+n-1}\oplus c_2a_{k+n-2}\oplus\cdots\oplus c_na_k,k\geq1 ak+n=c1ak+n−1⊕c2ak+n−2⊕⋯⊕cnak,k≥1
特征多项式 p ( x ) = 1 + c 1 x + c 2 x 2 + ⋯ + c n x n p(x)=1+c_1x+c_2x^2+\cdots+c_nx^n p(x)=1+c1x+c2x2+⋯+cnxn(NOTE:这里有个 + 1 +1 +1)
-
记 a i a_i ai 的 2 n − 1 2^n-1 2n−1 个非零序列的全体为 G ( p ( x ) ) G(p(x)) G(p(x))
-
n n n 级 LFSR 产生的序列有最大周期 2 n − 1 2^n-1 2n−1 的必要条件是其特征多项式 p ( x ) p(x) p(x) 是不可约的,称这样的多项式为 n n n 次本原多项式
m 序列的伪随机性
游程
序列中连续的 0 0 0 或连续的 1 1 1 串称为 1 1 1 个游程
自相关函数
KaTeX parse error: Expected group after '_' at position 24: …\frac{1}{T}\sum_̲\limits{k=1}^{T…
即为两个序列 { a i } \left\{a_i\right\} {ai} 与 { a i + τ } \left\{a_{i+\tau}\right\} {ai+τ} 在一个周期内对应位相同的位数与不同的位数之差
当 τ ≠ 0 \tau\neq0 τ=0 时,称 R ( τ ) R(\tau) R(τ) 为异相自相关函数
伪噪声序列
好的伪随机序列应满足的 3 3 3 个公设
- 0 , 1 0,1 0,1 平衡性:一个周期内, 0 0 0、 1 1 1 出现的次数分别为 2 n − 1 − 1 2^{n-1}-1 2n−1−1 和 2 n − 1 2^{n-1} 2n−1(不能全 0 0 0)
- 游程特性:一个周期内,总游程数为 2 n − 1 2^n-1 2n−1;对 1 ≤ i ≤ n − 2 1\leq i\leq n-2 1≤i≤n−2,长度为 i i i 的游程有 2 n − i − 1 2^{n-i-1} 2n−i−1 个,且 0 0 0、 1 1 1 游程各半;长度为 n − 1 n-1 n−1 的 0 0 0 游程一个,长度为 n n n 的 1 1 1 游程一个
- 自相关函数:KaTeX parse error: Unknown column alignment: 0 at position 30: …{\begin{array} 0̲1,&\tau=0\\-\fr…
m 序列的破译
( a n + 1 a n + 2 ⋯ a 2 n ) = ( c n c n − 1 ⋯ c 1 ) ( a 1 a 2 ⋯ a n a 2 a 3 ⋯ a n + 1 ⋮ ⋮ ⋮ a n a n + 1 ⋯ a 2 n − 1 ) = ( c n c n − 1 ⋯ c 1 ) X \begin{aligned}(\begin{matrix}a_{n+1}&a_{n+2}&\cdots&a_{2n}\end{matrix})&=(\begin{matrix}c_n&c_{n-1}&\cdots&c_1\end{matrix})\left(\begin{matrix}a_1&a_2&\cdots&a_n\\a_2&a_3&\cdots&a_{n+1}\\\vdots&\vdots&&\vdots\\a_n&a_{n+1}&\cdots&a_{2n-1}\end{matrix}\right)\\&=(\begin{matrix}c_n&c_{n-1}&\cdots&c_1\end{matrix})X\end{aligned} (an+1an+2⋯a2n)=(cncn−1⋯c1)⎝⎜⎜⎜⎛a1a2⋮ana2a3⋮an+1⋯⋯⋯anan+1⋮a2n−1⎠⎟⎟⎟⎞=(cncn−1⋯c1)X
( c n c n − 1 ⋯ c 1 ) = ( a n + 1 a n + 2 ⋯ a 2 n ) X − 1 (\begin{matrix}c_n&c_{n-1}&\cdots&c_1\end{matrix})=(\begin{matrix}a_{n+1}&a_{n+2}&\cdots&a_{2n}\end{matrix})X^{-1} (cncn−1⋯c1)=(an+1an+2⋯a2n)X−1
非线性序列
密钥流满足的性质
- 种子密钥的长度足够长
- 极大的周期
- 良好的统计特性
- 极大的线性复杂度
- 极大的 k k k 错线性复杂度
- 抗统计分析
- 混乱性
- 扩散性
- 抗线性分析
Geffe 序列生成器

当 LFSR2 输出 1 1 1 时,LFSR2 与 LFSR1 相连接;当 LFSR2 输出 0 0 0 时,LFSR2 与 LFSR3 相连接
周期 KaTeX parse error: Expected group after '_' at position 8: T=\prod_̲\limits{i=1}^{3…
J-K 触发器

Pless 生成器

输出序列为 a 0 b 1 c 2 d 3 a 4 b 5 c 6 ⋯ a_0b_1c_2d_3a_4b_5c_6\cdots a0b1c2d3a4b5c6⋯
钟控序列生成器

当 LFSR1 输出 1 1 1 时,移位时钟脉冲通过与门使 LFSR2 进行一次移位,从而生成下一位;当 LFSR1 输出 0 0 0 时,移位时钟脉冲无法通过与门影响 LFSR2,LFSR2 重复输出前一位
分组密码
分组密码概述
-
扩散
将明文的统计特性散布到密文中去,明文的每一位影响密文的很多位,即将明文尽可能广泛的扩散到密文中去
-
混淆
使明文、密文和密钥间的统计关系变得尽可能复杂,即使攻击者能够得到明文和密文的一些统计关系,也无法得到密钥
DES

-
取反特性
对于明文分组 M M M,密文分组 C C C 和密钥 K K K,若 C = D E S K ( M ) C=DES_K(M) C=DESK(M), 则 C ‾ = D E S K ‾ ( M ‾ ) \overline{C}=DES_{\overline{K}}(\overline{M}) C=DESK(M)
-
弱密钥与半弱密钥
D E S K ’ ( D E S K ( m ) ) = m DES_{K’}(DES_K(m))=m DESK’(DESK(m))=m,则称密钥 K K K 与密钥 K ’ K’ K’ 互为对合
若 K K K 是自己的对合,即 K 1 = K 2 K_1=K_2 K1=K2 ,则称 K K K为 DES 的一个弱密钥
若 K K K 存在异于自己的对合,则称 K K K 为DES的一个半弱密钥
-
不能抵抗穷搜索攻击
二重DES
C = E K 2 ( E K 1 [ P ] ) C=EK_2\left(EK_1\left[P\right]\right) C=EK2(EK1[P])
-
中途相遇攻击
已知通过两重 DES 加密得到的一个明文密文对为 ( P , C ) (P,C) (P,C),即 C = E K 2 ( E K 1 [ P ] ) C=EK_2(EK_1[P]) C=EK2(EK1[P]),那么存在 X = E K 1 [ P ] = D K 2 [ C ] X= EK_1[P] =DK_2[C] X=EK1[P]=DK2[C]
EDE(两个密钥的三重DES)
C = E K 1 ( D K 2 ( E K 1 [ P ] ) ) C=EK_1(DK_2(EK_1[P])) C=EK1(DK2(EK1[P]))
三个密钥的三重DES
C = E K 3 ( D K 2 ( E K 1 [ P ] ) ) C=EK_3(DK_2(EK_1[P])) C=EK3(DK2(EK1[P]))
分组密码运行模式
电话本 ECB 模式
Electric CodeBook
- 对明文分组后,用同一密钥逐一加密
- 适合短消息,如传递DES密钥
- 错误不会传播

密码分组链接 CBC 模式
Cipher Block Chaining
- C i = DES K ( P i ⊕ C i − 1 ) , C 0 = I V C_i=\text{DES}_K(P_i\oplus C_{i-1}),C_0=IV Ci=DESK(Pi⊕Ci−1),C0=IV
- 可用于消息认证
- 错误传播:当前和下一分组

密码反馈 CFB 模式
Cipher FeedBack
- j j j 可选 1 1 1, 8 8 8, 64 64 64 等, 记作 CFB-1, CFB-8, CFB-64
- 1 1 1 比特密文传输错误传播约 64 / j 64/j 64/j 个分组(不包括当前分组)
- 可用于认证

输出反馈 OFB 模式
Output FeedBack
- 错误不易传播
- 密文易于篡改,不适合认证

计数器 CTR 模式
- 效率高,可并行加密,各块可单独处理,可预处理
- 加密数据块可随机访问

IDEA
设计原理
混肴
- 逐比特异或 ⊕ \oplus ⊕
- 模 2 16 2^{16} 216 加法 ⊞ \boxplus ⊞
- 模 2 16 + 1 2^{16}+1 216+1 乘法 ⊙ \odot ⊙, 0000000000000000 0000000000000000 0000000000000000 作 2 16 2^{16} 216 处理
扩散
MA 结构

加密过程
64 64 64 比特的明文划分成 4 4 4 个 16 16 16 比特子段

轮结构
- 变换:输入 4 4 4 个子段和 6 6 6 个子密钥;输出 4 4 4 个子段
- 输出变换:仅需 4 4 4 个子密钥
子密钥产生
- Z 1 , Z 2 , ⋯ , Z 8 Z_1,Z_2,\cdots,Z_8 Z1,Z2,⋯,Z8 直接从加密密钥中取
- 加密密钥循环左移 25 25 25 位,再取 Z 9 , Z 10 , ⋯ , Z 16 , ⋯ Z_9,Z_{10},\cdots,Z_{16}, \cdots Z9,Z10,⋯,Z16,⋯
AES

X乘
x t i m e ( b ( x ) ) = x ⋅ b ( x ) ( m o d m ( x ) ) xtime(b(x))=x\cdot b(x)(\mod m(x)) xtime(b(x))=x⋅b(x)(modm(x))
Q: 计算 57 ⋅ 13 , m ( x ) = x 8 + x 4 + x 3 + x + 1 57\cdot 13,m(x)=x^8+x^4+x^3+x+1 57⋅13,m(x)=x8+x4+x3+x+1
57 ⋅ 02 = x t i m e ( 57 ) = A E 57\cdot02=xtime(57)=AE 57⋅02=xtime(57)=AE
57 ⋅ 04 = x t i m e ( A E ) = 47 57\cdot04=xtime(AE)=47 57⋅04=xtime(AE)=47
57 ⋅ 08 = x t i m e ( 47 ) = 8 E 57\cdot08=xtime(47)=8E 57⋅08=xtime(47)=8E
57 ⋅ 10 = x t i m e ( 8 E ) = 07 57\cdot10=xtime(8E)=07 57⋅10=xtime(8E)=07
57 ⋅ 13 = 57 ⋅ ( 01 ⊕ 02 ⊕ 10 ) = 57 ⊕ A E ⊕ 07 = F E 57\cdot13=57\cdot(01\oplus02\oplus10) =57\oplus AE\oplus07=FE 57⋅13=57⋅(01⊕02⊕10)=57⊕AE⊕07=FE
公钥密码
公钥密码体制
对称密码算法缺陷
- 密钥分配问题:双方保密通信前需要通过安全信道协商密钥
- 密钥管理问题:任何两用户间都需要有共享的秘密钥, n n n 个用户需要 C n 2 C_{n}^{2} Cn2 个密钥
- 无法实现签名功能:当 Alice 收到 Bob 用其密钥加密生成的电子文挡时,Bob 无法向第三方证明该电子文档确实来源于 Bob
双重加密方案
-
Alice 发送 E A ( P ) E_A(P) EA(P) 给 Bob
-
Bob 发送 E B ( E A ( P ) ) E_B\left(E_A(P)\right) EB(EA(P)) 给 Alice
-
Alice 发送 D A ( E B ( E A ( P ) ) ) = D A ( E A ( E B ( P ) ) ) = E B ( P ) D_A(E_B(E_A(P)))=D_A(E_A(E_B(P)))=E_B(P) DA(EB(EA(P)))=DA(EA(EB(P)))=EB(P) 给 Bob
-
Bob 解密 D B ( E B ( P ) ) = P D_B(E_B(P))=P DB(EB(P))=P
缺陷:
- 要求构造一个函数, 满足 E B ( E A ( P ) ) = E A ( E B ( P ) ) E_B(E_A(P))=E_A(E_B(P)) EB(EA(P))=EA(EB(P))
- 无法验证 Alice 或 Bob 的身份
公钥密码体制的基本原理
基于公钥密码体制的加解密过程
- 密钥的生成:生成用户 Alice 的公钥 P U a PU_a PUa 和私钥 P R a PR_a PRa
- 公开钥的发布:将 Alice 的公钥 P U a PU_a PUa 公开
- 加密:用户 Bob 想向 Alice 发送消息 m m m,则需获得 Alice 的公钥 P U a PU_a PUa ,然后加密消息 m m m得到 c = E P U a [ m ] c=E_{PU_a}\left[m\right] c=EPUa[m],其中, E E E 是加密算法
- 解密:Alice 收到密文 c c c 后,用自己的私钥 P R a PR_a PRa 解密,即 m = D P R a [ c ] m=D_{PR_a}\left[c\right] m=DPRa[c],其中, D D D 是解密算法。因为只有 Alice 知道 P R a PR_a PRa ,所以其他人无法对密文 c c c 解密
基于公钥密码体制的认证过程
- 用户 Bob 用自己的私钥 P R b PR_b PRb 对消息 m m m 加密,表示为 c = E P R B [ m ] c=E_{PR_B}\left[m\right] c=EPRB[m]
- Bob 将 c c c 发给 Alice。Alice 收到 c c c 后,用 Bob 的公钥 P U B PU_B PUB 对 c c c 解密,表示为 m = D P U B [ c ] m=D_{PU_B}\left[c\right] m=DPUB[c]
公钥密码算法运算速度很慢,对较长的明文直接加密用来签名不可行。改进的方法是先将文件经过单向压缩函数(hash)压缩成长度较小的比特串,得到的比特串称为认证符(哈希值) ,然后对认证符(哈希值)进行加密。
基于公钥密码体制的同时实现加密和认证的过程
- 先签名后加密: Alice 首先用自己的私钥 P R a PR_a PRa 对消息 m m m 加密,用于提供认证(数字签名);再用 Bob 的公钥 P U b PU_b PUb 第 2 2 2 次加密,表示为 c = E P U b [ E P R a [ m ] ] c=E_{PU_b}\left[E_{PR_a}\left[m\right]\right] c=EPUb[EPRa[m]]
- 先解密再验证: Bob 的解密认证过程为 m = D P U a [ D P R b [ c ] ] m=D_{PU_a}\left[D_{PR_b}\left[c\right]\right] m=DPUa[DPRb[c]]
公钥密码算法应满足的要求
- 密钥对( P U PU PU 和 P R PR PR )的生成在计算上是容易的
- 用公钥对消息 m m m 加密,即 c = E P U [ m ] c =E_{PU}[m] c=EPU[m] 在计算上是容易的
- 用私钥对 c c c 解密,即 m = D P R [ c ] m=D_{PR}[c] m=DPR[c] 在计算上是容易的
- 攻击者由公钥 P U PU PU 求私钥 P R PR PR 在计算上是不可行的,等同于困难问题
- 攻击者由 c c c 和公钥 P U PU PU 恢复明文 m m m 在计算上是不可行的,等同于困难问题
- 两个密钥使用的次序可调换,即 D P U [ E P R ( m ) ] = D P R [ E P U ( m ) ] D_{PU}[E_{PR}(m)]=D_{PR}[E_{PU} (m)] DPU[EPR(m)]=DPR[EPU(m)]
满足以上要求的本质在于构造一个陷门单向函数
陷门单向函数:若额外给定某些附加信息后,由给定的 y y y 找到 x ∈ X x\in X x∈X很容易,则称这样的单向函数为限门单向函数,即:
- 当 k k k 和 y y y 已知时,求解 x = f k − 1 ( y ) x=f_k^{-1}(y) x=fk−1(y) 很容易
- 当 y y y 已知但 k k k 未知时,求解 x = f k − 1 ( y ) x=f_k^{-1}(y) x=fk−1(y) 很困难
对公钥密码体制的攻击
- 穷搜索攻击
- 寻找从公钥计算私钥的方法
- 可能字攻击
RSA
算法描述
- 密钥的产生
- 选两个大素数 p p p 和 q q q
- 计算 n = p q n=pq n=pq, φ ( n ) = ( p − 1 ) ( q − 1 ) \varphi(n)=(p-1)(q-1) φ(n)=(p−1)(q−1)
- 选一整数 e e e,满足 1 < e < φ ( n ) 1<e<\varphi(n) 1<e<φ(n),且 gcd ( φ ( n ) , e ) = 1 \gcd(\varphi(n), e)=1 gcd(φ(n),e)=1
- 计算 d d d,满足 d e ≡ 1 m o d φ ( n ) de\equiv 1 \mod \varphi(n) de≡1modφ(n),即 d d d 是 e e e 在模 φ ( n ) \varphi(n) φ(n) 下的乘法逆元, e e e 与 φ ( n ) \varphi(n) φ(n) 互素,模 φ ( n ) \varphi(n) φ(n) 的乘法逆元一定存在
- 公钥: { e , n } \left\{e, n\right\} {e,n};私钥: { d , p , q } \left\{d, p, q\right\} {d,p,q} 或 { d } \left\{d\right\} {d}(密钥生成若是由系统负责完成,则用户可能不知道 p p p 和 q q q)
- 加密
- m < n m<n m<n,计算 c ≡ m e m o d n c\equiv m^e \mod n c≡memodn
- 若 m m m 较大,将 m m m 分组,每个分组对应的十进制数小于 n n n
- 解密
- 计算 m ≡ c d m o d n m\equiv c^d \mod n m≡cdmodn
计算问题
加密与解密过程
-
模运算的累次乘法
a b m o d n = [ ( a m o d n ) ( b m o d n ) ] m o d n ab\mod n=[(a \mod n)(b\mod n)]\mod n abmodn=[(amodn)(bmodn)]modn
-
快速指数算法
m = b k 2 k + b k − 1 2 k − 1 + ⋯ + b 1 2 + b 0 m=b_{k}2^{k}+b_{k-1}2^{k-1}+\cdots+b_1 2+b_0 m=bk2k+bk−12k−1+⋯+b12+b0
a m = ( ( ⋯ ( ( ( a b k ) 2 a b k − 1 ) 2 a b k − 2 ) 2 ⋯ a b 1 ) 2 a b 0 a^m=((\cdots(((a^{b_k})^2a^{b_{k-1}})^2a^{b_{k-2}})^2\cdots a^{b_1})^2a^{b_0} am=((⋯(((abk)2abk−1)2abk−2)2⋯ab1)2ab0
-
中国剩余定理CRT加速解密
m = c d m o d n ⟺ { m = c d m o d p m = c d m o d q m=c^d\mod n\Longleftrightarrow \left\{\begin{matrix}m=c^d\mod p\\m=c^d\mod q\end{matrix}\right. m=cdmodn⟺{m=cdmodpm=cdmodq
⟹ { m = a 1 m o d p m = a 2 m o d q \Longrightarrow \left\{\begin{matrix}m=a_1\mod p\\m=a_2\mod q\end{matrix}\right. ⟹{m=a1modpm=a2modq
m = [ a 1 q q − 1 + a 2 p p − 1 ] m o d n m=[a_1qq^{-1}+a_2pp^{-1}]\mod n m=[a1qq−1+a2pp−1]modn
广义欧几里得除法
j j j s j s_j sj t j t_j tj q j + 1 q_{j+1} qj+1 r j + 1 r_{j+1} rj+1 − 3 -3 −3 a a a − 2 -2 −2 1 1 1 0 0 0 b b b − 1 -1 −1 0 0 0 1 1 1 q 0 q_0 q0 r 0 r_0 r0 0 0 0 s 0 s_0 s0 t 0 t_0 t0 q 1 q_1 q1 r 1 r_1 r1 ⋯ \cdots ⋯ ⋯ \cdots ⋯ ⋯ \cdots ⋯ ⋯ \cdots ⋯ ⋯ \cdots ⋯ n n n s n s_n sn t n t_n tn q n + 1 q_{n+1} qn+1 r n + 1 = 0 r_{n+1}=0 rn+1=0 KaTeX parse error: Unknown column alignment: * at position 24: … \begin{array}{*̲*lr**} s_j=(-q…
安全性
- ∣ p − q ∣ |p-q| ∣p−q∣ 足够大,即 p p p 和 q q q 的长度应相差几位
- p − 1 p-1 p−1 和 q − 1 q-1 q−1 均有大素数因子(分别记为 p ′ p' p′ 和 q ′ q' q′); p ′ − 1 p'-1 p′−1 和 q ′ − 1 q'-1 q′−1 也均有大素数因子
- gcd ( p − 1 , q − 1 ) \gcd(p-1, q-1) gcd(p−1,q−1) 应该较小
攻击手段
- 共模攻击
- 共指数攻击
- 低指数攻击
- 选择密文攻击(RSA密码算法不能抵抗)
背包密码体制
A = ( a 1 , a 2 , ⋯ , a n ) A=(a_1,a_2,\cdots,a_n) A=(a1,a2,⋯,an) 是由 n n n 个不同的正整数构成的 n n n 元组, s s s 是另一已知的正整数。背包问题就是从 A A A 中找出所有的 a i a_i ai,使其和等于 s s s。其中, A A A 称为背包向量, s s s 是背包容积
将
x
(
1
≤
x
≤
2
n
−
1
)
x(1\leq x\leq 2n-1)
x(1≤x≤2n−1) 写成长为
n
n
n 的二元表示,
f
(
x
)
f(x)
f(x) 定义为
A
A
A 中所有可能选择
a
i
a_i
ai 的和,即
f
(
1
)
=
f
(
0
⋯
001
)
=
a
n
f(1)=f(0\cdots001)=a_n
f(1)=f(0⋯001)=an
⋯
\cdots
⋯
f
(
2
n
−
1
)
=
f
(
1
⋯
111
)
=
a
1
+
a
2
+
⋯
+
a
n
f(2n-1)=f(1\cdots 111)=a_1+a_2+\cdots+a_n
f(2n−1)=f(1⋯111)=a1+a2+⋯+an
背包向量 A = ( a 1 , a 2 , ⋯ , a n ) A=(a_1,a_2,\cdots,a_n) A=(a1,a2,⋯,an) 称为超递增的,如果 KaTeX parse error: Expected group after '_' at position 9: a_j>\sum_̲\limits{i=1}^{j…
- 密钥产生
- 构造超递增背包向量 A = ( a 1 , a 2 , ⋯ , a n ) A=(a_1, a_2, \cdots , a_n) A=(a1,a2,⋯,an)
- 用模乘对 A A A 进行伪装,其中,模数 k k k 和乘数 t t t 皆取为常量,满足, gcd ( t , k ) = 1 \gcd (t, k)=1 gcd(t,k)=1,即 t t t 在模 k k k 下有乘法逆元。
- 设 b i ≡ t ⋅ a i m o d k , i = 1 , 2 , ⋯ , n b_i\equiv t\cdot a_i \mod k, i=1,2,\cdots,n bi≡t⋅aimodk,i=1,2,⋯,n,得一新的背包向量 B = ( b 1 , b 2 , ⋯ , b n ) B=(b_1,b_2,\cdots,b_n) B=(b1,b2,⋯,bn),记为 B ≡ t ⋅ A m o d k B\equiv t\cdot A \mod k B≡t⋅Amodk
- 用户以 B B B 作为自己的公钥, A A A , t t t , k k k 为私钥
- 加密
- 对明文分组 x = ( x 1 x 2 ⋯ x n ) x=(x_1x_2\cdots x_n) x=(x1x2⋯xn) 的加密运算为 c = f ( x ) = B ⋅ B x m o d k c=f(x)=B\cdot B_x \mod k c=f(x)=B⋅Bxmodk
- 解密
- 由 s ≡ t − 1 c m o d k s \equiv t^{-1}c \mod k s≡t−1cmodk,求出 s s s 作为超递增背包向量 A A A 的容积
- 再由超递增背包向量 A A A 解背包问题即得 x = ( x 1 x 2 ⋯ x n ) x=(x_1x_2\cdots x_n) x=(x1x2⋯xn)
ElGamal密码体制
- 密钥产生
- 选择大素数 p p p;选择本原根 g g g, 1 < g < p 1<g<p 1<g<p;选择 x x x, 1 < x < p − 1 1<x<p-1 1<x<p−1
- 计算 y = g x m o d p y=g^x \mod p y=gxmodp,公钥是 ( p , g , y ) (p, g, y) (p,g,y),私钥是 x x x
- 加密
- 明文消息 M M M, 0 < M < p 0< M <p 0<M<p
- 随机选一整数 k k k , 1 ≤ k ≤ p - 1 1 \leq k \leq p-1 1≤k≤p-1
- 计算对 C 1 ≡ g k m o d p C_1\equiv g^k \mod p C1≡gkmodp, C 2 ≡ y k M m o d p C_2\equiv y^kM \mod p C2≡ykMmodp,密文 C = C 1 ∣ ∣ C 2 C = C1||C2 C=C1∣∣C2 (级联)
- 解密
- M = C 2 / C 1 x m o d p M=C_2/C_1^x \mod p M=C2/C1xmodp
- C 2 / C 1 x m o d p = y k M / g k x m o d p = y k M / y k m o d p = M m o d p C_2/C_1^x \mod p=y^kM/g^{kx}\mod p=y^kM/y^k \mod p=M\mod p C2/C1xmodp=ykM/gkxmodp=ykM/ykmodp=Mmodp
原根
- 求奇素数 p p p原根
- STEP1: 求一个原根 g g g
求出 p − 1 p-1 p−1的所有素因数 q 1 , ⋯ , q s q_1,\cdots,q_s q1,⋯,qs,则 g g g是模 p p p的原根 ⟺ ∀ i , g p − 1 q i ≢ 1 ( m o d p ) \Longleftrightarrow \forall i,g^{\frac{p-1}{q_i}}\not\equiv1\left(\mod p\right) ⟺∀i,gqip−1≡1(modp)- STEP2: 求所有原根
对于 ( d , φ ( m ) ) = 1 \left(d,\varphi\left(m\right)\right)=1 (d,φ(m))=1, g d g^d gd为原根
- 求 p α p^{\alpha} pα原根
- STEP1: 求 p p p的一个原根 g g g
- STEP2: 求 p α p^{\alpha} pα的原根
- 若 g p − 1 ≢ 1 ( m o d p 2 ) g^{p-1}\not\equiv1\left(\mod p^2\right) gp−1≡1(modp2),则 g g g为原根
- 若 ( g + p ) p − 1 ≢ 1 ( m o d p 2 ) {\left(g+p\right)}^{p-1}\not\equiv1\left(\mod p^2\right) (g+p)p−1≡1(modp2),则 g + p g+p g+p为原根
- 求 2 p α 2p^{\alpha} 2pα原根
- STEP1: 求 p α p^{\alpha} pα的一个原根 g g g
- STEP2: 求 2 p α 2p^{\alpha} 2pα的原根
g g g与 g + p α g+p^{\alpha} g+pα中的奇数为原根
椭圆曲线密码体制
Diffie-Hellman密钥交换协议
- 取素数 p ≈ 2180 p\approx 2180 p≈2180 和参数 a a a、 b b b,则得椭圆曲线上的点及无穷远点构成Abel群 E p ( a , b ) E_p(a, b) Ep(a,b)
- 取 E p ( a , b ) E_p(a,b) Ep(a,b) 的某个生成元 G = ( x 1 , y 1 ) G=(x_1, y_1) G=(x1,y1), G G G 的阶,即满足 n G = O nG=O nG=O 的最小正整数 n n n很大。 E p ( a , b ) E_p(a, b) Ep(a,b) 和 G G G 作为公开参数
- Alice 和 Bob 之间的密钥交换如下进行
- Alice 随机选取保密的整数 n A < n n_A<n nA<n,计算 P A = n A G P_A=n_AG PA=nAG 并发给 Bob
- Bob 随机选取秘密的 n B n_B nB 并计算 P B = n B G P_B=n_BG PB=nBG 发给 Alice
- Alice 和 Bob 分别由 K = n A P B K=n_AP_B K=nAPB 和 K = n B P A K=n_BP_A K=nBPA 生成共享的密钥 K = n A P B = n A ( n B G ) = n B ( n A G ) = n B P A K=n_AP_B=n_A(n_BG)=n_B(n_AG)=n_BP_A K=nAPB=nA(nBG)=nB(nAG)=nBPA
ElGamal密码体制
- 选择椭圆曲线
E
p
(
a
,
b
)
E_p(a,b)
Ep(a,b),将明文
m
m
m 通过嵌入到椭圆曲线上得点
P
m
P_m
Pm
- 设明文 m m m,计算 x = { m k + j , j = 0 , 1 , 2 , ⋯ , k − 1 } x=\left\{mk+j, j=0,1,2,\cdots,k-1\right\} x={mk+j,j=0,1,2,⋯,k−1}, k k k 为正整数,通常取值 30 ∼ 50 30\sim 50 30∼50。若 k = 30 k=30 k=30,计算一系列 x x x: { 30 m , 30 m + 1 , 30 m + 2 , ⋯ } \left\{30m, 30m+1, 30m+2,\cdots\right\} {30m,30m+1,30m+2,⋯}
- 直到 x 3 + a x + b ( m o d p ) x^3+ax+b(\mod p) x3+ax+b(modp) 是平方剩余,即得到椭圆曲线上的点 ( x , x 3 + a x + b ) (x,\sqrt{x^3+ax+b} ) (x,x3+ax+b)
- 在 1 1 1 到 p − 1 p-1 p−1 的整数中,一半是模 p p p 的平方剩余。 k k k 次找到 x x x,使得 x 3 + a x + b ( m o d p ) x^3+ax+b(\mod p) x3+ax+b(modp) 是平方剩余的概率不小于 1 - 2 − k 1-2^{-k} 1-2−k。
- 从椭圆曲线上的点 ( x , y ) (x, y) (x,y) 得到 m m m,只须求 m = ⌊ x / k ⌋ m=\lfloor x/k\rfloor m=⌊x/k⌋
- 取 E p ( a , b ) E_p(a,b) Ep(a,b) 的一个生成元 G G G, E p ( a , b ) E_p(a,b) Ep(a,b) 和 G G G 作为公开参数
- Alice 选 n A n_A nA 作为私钥,并以 P A = n A G P_A=n_AG PA=nAG 作为公开钥
- Bob 向 Alice 发送消息 P m P_m Pm,可选取随机数 k k k,产生点对 C m = { k G , P m + k P A } C_m=\left\{kG,P_m+kP_A\right\} Cm={kG,Pm+kPA} 作为密文
- Alice 以密文点对中的第二个点减去其私钥与第一个点倍乘的结果,即 ( P m + k P A ) - n A k G = P m + k ( n A G ) - n A k G = P m (P_m+kP_A)-n_AkG=P_m+k(n_AG)-n_AkG =P_m (Pm+kPA)-nAkG=Pm+k(nAG)-nAkG=Pm
密钥管理与密钥分配
单钥加密体制的密钥分配
密钥分配的基本方法
- Alice 选取或生成 K S K_S KS并通过物理手段发送给 Bob
- 可信第三方 KDC(Key Distribution Center) 选取或生成 K S K_S KS 并通过物理手段将会话密钥发送给 Alice 和 Bob
- Alice 和 Bob 事先已有一共享密钥 K K K ,其中一方选取或生成 K S K_S KS 后,用 K K K 加密 K S K_S KS 并发送给另一方
- Alice 和 Bob 分别与 KDC 享有一个保密信道,KDC 为 Alice 、Bob 选取或生成 K S K_S KS 后,再分别通过保密信道发给 Alice 和 Bob
NS密钥分配协议

协议中可令 N 1 N_1 N1 为随机数
第 ④、⑤ 两步,用于防止对第 ③ 步的重放攻击
- 假定敌手能获取旧的会话密钥,则在第 ③ 步中可冒充 Alice 向 Bob 重放旧的会话密钥,欺骗 Bob 使用旧会话密钥
- 敌手截获第 ④ 步中 Bob 发出的询问后,可假冒 Alice 作出第 ⑤ 步的应答
- 敌手可冒充 Alice 使用经认证过的旧会话密钥与 Bob 通信
无中心(KDC)的密钥分配

公钥加密体制的密钥管理
公钥分配
- 公开发布
- 公钥目录表
- 公钥管理机构
- 公钥证书
- IBC
- CL-PKC
- 自验证的公钥体制
- 一次性公钥分配
基于公钥加密的会话密钥分配协议
简单分配

- 中间人攻击
- Alice 产生密钥对 { P K A , S K A } \left\{PK_A,SK_A\right\} {PKA,SKA} 并向 Bob 发送 P K A ∣ ∣ I D A PK_A||ID_A PKA∣∣IDA
- Eve 截获 Alice 的消息并建立自己的密钥对 { P K E , S K E } \left\{PK_E,SK_E\right\} {PKE,SKE},并将 P K E ∣ ∣ I D A PK_E||ID_A PKE∣∣IDA 发送给 Bob
- Bob 产生会话密钥 K S K_S KS 后,将 E P K E [ K S ] E_{PK_E}\left[K_S\right] EPKE[KS] 发送给 Alice
- Eve 截获 Bob 的消息,由 D P K E [ E P K E [ K S ] ] D_{PK_E}\left[E_{PK_E} \left[K_S\right]\right] DPKE[EPKE[KS]] 获得 K S K_S KS
- Eve 再将 E P K A [ K S ] E_{PK_A}\left[K_S\right] EPKA[KS] 发往 Alice
具有保密性和认证性的密钥分配

N 1 N_1 N1 的存在使 Alice 相信对方的确是 Bob
用 Bob 的公钥加密保证只有 Bob 能解读,用 Alice 的私钥加密保证该条消息只有 Alice 能生成
Diffie-Hellman密钥交换协议

a a a 是 p p p 的本原根
- 中间人攻击

随机数
随机数数列需满足的两个特性
- 随机性
- 不可预测性
伪随机数产生器
X n + 1 = a X n + c m o d m X_{n+1}=aX_n+c\mod m Xn+1=aXn+cmodm
基于分组密码算法的随机数产生器
- 循环加密
- DES/AES 输出反馈
- ANSI X9.17
- BBS
秘密分割
门限方案
设秘密 s s s 被分成 n n n 个部分信息,每一部分信息可称为一个子密钥或影子,由一个参与者持有,使得:
- 获得大于等于 k k k 个参与者所持有的部分信息可重构 s s s
- 获得少于 k k k 个参与者所持有的部分信息则无法重构 s s s
则称这种方案为 ( k , n ) (k, n) (k,n)-秘密分割门限方案, k k k 称为方案的门限值。当 k = n k=n k=n 时,则需要所有用户参与合作才能恢复密钥
如果一个或一组未获授权的参与者在猜测秘密s时,并不比局外人猜测秘密有优势,则称方案是完善的
Shamir门限方案
Lagrange插值公式
已知 φ ( x ) \varphi(x) φ(x) 在 k k k 个互不相同的点的函数值 φ ( x i ) ( i = 1 , 2 , ⋯ , k ) \varphi(x_i)(i=1,2,\cdots,k) φ(xi)(i=1,2,⋯,k),可构造 k − 1 k-1 k−1 次 Lagrange 插值多项式
f ( x ) = ∑ j = 1 k φ ( x j ) ∏ l = 1 l ≠ j k x − x l x j − x l f(x)=\sum\limits_{j=1}^{k}{\varphi(x_j) \prod\limits_{\begin{matrix}l=1\\l\neq j\end{matrix}}^{k}{\frac{x-x_l}{x_j-x_l}}} f(x)=j=1∑kφ(xj)l=1l=j∏kxj−xlx−xl
秘密分割
- G F ( q ) \mathrm{GF}(q) GF(q) 是一有限域,其中 q q q 是素数,且满足 q ≥ n + 1 q\geq n+1 q≥n+1
- 假设秘密为 s s s,令多项式常系数 a 0 a_0 a0 等于 s s s
- 选取其它 k − 1 k-1 k−1 个系数 a i ( i = 1 , ⋯ , k − 1 ) a_i (i=1,\cdots,k-1) ai(i=1,⋯,k−1)
- G F ( q ) \mathrm{GF}(q) GF(q) 上构造的 k − 1 k-1 k−1 次多项式记为 f ( x ) = a 0 + a 1 x + ⋯ + a k − 1 x k − 1 f(x)=a_0+a_1x+\cdots+a_{k-1}x^{k-1} f(x)=a0+a1x+⋯+ak−1xk−1
- n n n 个参与者记为 P 1 , P 2 , ⋯ , P n P_1, P_2,\cdots, P_n P1,P2,⋯,Pn, P i P_i Pi 的子密钥记为 ( i , f ( i ) ) \left(i, f(i)\right) (i,f(i))
秘密恢复
f ( x ) = ∑ j = 1 k f ( i j ) ∏ l = 1 l ≠ j k x − i l i j − i l ( m o d q ) f(x)=\sum\limits_{j=1}^{k}{f(i_j) \prod\limits_{\begin{matrix}l=1\\l\neq j\end{matrix}}^{k}{\frac{x-i_l}{i_j-i_l}}}(\mod q) f(x)=j=1∑kf(ij)l=1l=j∏kij−ilx−il(modq)
s = ( − 1 ) k − 1 ∑ j = 1 k f ( i j ) ∏ l = 1 l ≠ j k i l i j − i l ( m o d q ) s={(-1)}^{k-1}\sum\limits_{j=1}^{k}{f(i_j) \prod\limits_{\begin{matrix}l=1\\l\neq j\end{matrix}}^{k}{\frac{i_l}{i_j-i_l}}}(\mod q) s=(−1)k−1j=1∑kf(ij)l=1l=j∏kij−ilil(modq)
消息认证和哈希函数
消息认证码
认证符的产生方式可分为如下三类
- 消息加密:对整个消息加密后得到的密文作为认证符
- 消息认证码:MAC(Message Authentication Code)
- 哈希函数(也称散列函数,hash function):哈希值为认证符

消息认证码指消息被一密钥控制的公开函数作用下产生的用作认证符的长度固定的数值,也称密码校验和


数据认证算法DAA

E
E
E 为 DES 加密算法,
K
K
K 为密钥
消息认证码取为
O
N
O_N
ON 或
O
N
O_N
ON 的最左边
L
L
L 个比特,其中,
16
≤
L
≤
64
16\leq L\leq64
16≤L≤64
哈希函数
定义
-
先 Hash 再单钥(对称)加密
-
消息与哈希值链接后用单钥加密算法加密
可提供消息的保密性、真实性和完整性
-
用单钥加密算法仅对哈希值加密
可提供消息的真实性和完整性
-
-
先 hash,再签名
-
基于公钥加密算法用发方私钥仅加密(签名)哈希值
提供了消息的真实性、完整性和发方不可否认性
-
上述方案再单钥加密
提供了消息的保密性、真实性、完整性和发方不可否认性
-
-
带密钥的 Hash (共享秘密值), 一种消息认证码
-
发方计算消息 M M M 和秘密值 S S S 链接在一起的哈希值,作为消息 M M M 的认证码
要求双方共享秘密值 S S S;提供消息的真实性与完整性
-
上述方案中的消息和消息认证码再增加单钥加密运算
提供了消息的保密性、真实性、完整性
-
哈希函数应满足的条件
- 函数的输入可任意长
- 函数的输出为固定长
- 已知 x x x,求 H ( x ) H(x) H(x) 容易
- 已知 h h h,求满足 H ( x ) = h H(x)=h H(x)=h 的 x x x 在计算上不可行,抗原像攻击
- 已知 x x x,找到 y ( y ≠ x ) y (y\neq x) y(y=x),使得 H ( y ) = H ( x ) H(y)=H(x) H(y)=H(x) 在计算上不可行,抗弱碰撞攻击(第二原像攻击)
- 找出任意两个不同的输入 x x x 和 y y y,使得 H ( y ) = H ( x ) H(y)=H(x) H(y)=H(x) 在计算上不可行,抗强碰撞攻击
- 伪随机性

生日攻击
-
第 I \mathrm{I} I类生日攻击
给定 Hash 值 h = H ( x ) h=H(x) h=H(x),寻找 y y y 使得 H ( y ) = H ( x ) = h H(y)=H(x)=h H(y)=H(x)=h
-
第Ⅱ类生日攻击
寻找 x x x 和 y y y 使得 H ( x ) = H ( y ) H(x)=H(y) H(x)=H(y)
迭代型哈希函数的一般结构

MD5

缓冲区表示为 4 4 4 个 32 32 32 比特长的寄存器 A、B、C、D,每个寄存器以little-endian方式存储数据,初值如下(以存储方式): 01234567 01234567 01234567、 89 A B C D E F 89ABCDEF 89ABCDEF、 F E D C B A 98 FEDCBA98 FEDCBA98、 76543210 76543210 76543210。(实际值: 67452301 67452301 67452301、 E F C D A B 89 EFCDAB89 EFCDAB89、 98 B A D C F E 98BADCFE 98BADCFE、 10325476 10325476 10325476)

C V 0 = I V CV_0=IV CV0=IV
C V q + 1 = C V q + R F I [ Y q , R F H [ Y q , R F G [ Y q , R F F [ Y q , C V q ] ] ] ] CV_{q+1}=CV_q+RF_I \left[Y_q, RF_H\left[Y_q, RF_G\left[Y_q, RF_F\left[Y_q, CV_q\right]\right]\right]\right] CVq+1=CVq+RFI[Yq,RFH[Yq,RFG[Yq,RFF[Yq,CVq]]]]
M D = C V L MD=CV_L MD=CVL

A ← B + C L S s ( A + g ( B , C , D ) + X [ k ] + T [ i ] ) A\leftarrow B+CLS_s\left(A+g(B,C,D)+X\left[k\right]+T\left[i\right]\right) A←B+CLSs(A+g(B,C,D)+X[k]+T[i])
C L S s CLS_s CLSs 是左循环移 s s s 位
g g g 是逻辑函数 F F F、 G G G、 H H H、 I I I 之一
SHA-1
使用 160 160 160 比特长的缓冲区存储中间结果和最终哈希值,缓冲区表示为 5 5 5 个 32 32 32 比特寄存器(A、B、C、D、E),寄存器以 big-endian 方式存储数据, 初始值 A = 67452301 A=67452301 A=67452301 、 B = E F C D A B 89 B=EFCDAB89 B=EFCDAB89、 C = 98 B A D C F B C=98BADCFB C=98BADCFB、 D = 10325476 D=10325476 D=10325476、 E = C 3 D 2 E 1 F 0 E=C3D2E1F0 E=C3D2E1F0

C V 0 = I V CV_0=IV CV0=IV
C V q + 1 = S U M 32 ( C V q , A B C D E q ) CV_{q+1}=SUM_{32}(CV_q,ABCDE_q) CVq+1=SUM32(CVq,ABCDEq)
M D = C V L MD=CV_L MD=CVL

A , B , C , D , E ← ( E + f t ( B , C , D ) + C L S 5 ( A ) + W t + K t ) , A , C L S 3 0 ( B ) , C , D A,B,C,D,E\leftarrow(E+f_t(B,C,D)+CLS_5(A)+W_t+K_t), A, CLS_30(B), C, D A,B,C,D,E←(E+ft(B,C,D)+CLS5(A)+Wt+Kt),A,CLS30(B),C,D
数字签名算法
RSA签名
签名: S ≡ M d m o d n S\equiv M^d \mod n S≡Mdmodn,通常情况下 S ≡ H ( M ) d m o d n S\equiv H(M)^d \mod n S≡H(M)dmodn
验证: M ≡ S e m o d n M\equiv S^e \mod n M≡Semodn
伪造方式
- 一般模式由公钥直接伪造签名
- 攻击者任选数据 s s s 并用公钥 e e e 和 n n n 计算 m ’ = s e m o d n m’=s^e \mod n m’=semodn,即 ( m ’ ) d m o d n = s e d m o d n = s (m’)^d \mod n= s^{ed} \mod n=s (m’)dmodn=sedmodn=s。则 ( m ’ , s ) (m’, s) (m’,s) 就是一个可通过验证的伪造的签名
- 选择消息攻击模式
- 攻击者选定消息 m 1 m_1 m1 和 m 2 m_2 m2,满足 $m=m_1\times m_2 $,并让签名者分别对 m 1 m_1 m1 和 m 2 m_2 m2 签名, s 1 = m 1 d m o d n s_1=m_1^d \mod n s1=m1dmodn 和 s 2 = m 2 d m o d n s_2=m_2^d \mod n s2=m2dmodn
- 计算 m m m 的签名 s = s 1 × s 2 = m 1 d × m 2 d = ( m 1 × m 2 ) d = m d m o d n s=s_1\times s_2=m_1^d\times m_2^d=(m_1\times m_2)^d=m^d \mod n s=s1×s2=m1d×m2d=(m1×m2)d=mdmodn
- 利用签名攻击获得明文
- 假设攻击者获得密文 c = m e m o d n c=m^e \mod n c=memodn,他要获得明文,于是选择一个小的随机数 r r r,计算 s = r e m o d n s=r^e \mod n s=remodn, l = s × c m o d n l=s\times c \mod n l=s×cmodn, t = r − 1 m o d n t=r^{-1} \mod n t=r−1modn
- 因为 s = r e s=r^e s=re ,所以 s d = r m o d n s^d=r \mod n sd=rmodn
- 攻击者设法让签名者对 l l l 签名,于是得到 k = l d m o d n k=l^d \mod n k=ldmodn,攻击者计算 t × k = r − 1 × l d = r − 1 × s d × c d = r − 1 × r × c d = c d = m m o d n t\times k=r^{-1}\times l^d=r^{-1} \times s^d \times c^d=r^{-1}\times r \times c^d=c^d=m \mod n t×k=r−1×ld=r−1×sd×cd=r−1×r×cd=cd=mmodn 获得明文 m m m
- 抵抗上述攻击的有效办法是对 hash 值进行签名
数字签名标准
DSS

DSA
- 全局公钥: p , q , g p,q,g p,q,g
- 用户私钥: x x x
- 用户公钥: y ≡ g x m o d p y\equiv g^x\mod p y≡gxmodp
- 秘密数: k k k
- 签名:
(
r
,
s
)
(r,s)
(r,s)
- r ≡ ( g k m o d p ) m o d q r\equiv(g^k\mod p)\mod q r≡(gkmodp)modq
- s ≡ [ k − 1 ( H ( M ) + x r ) ] m o d q s\equiv\left[k^{-1}(H(M)+xr)\right]\mod q s≡[k−1(H(M)+xr)]modq, H H H 为 SHA-1
- 验证:收到消息
M
′
M'
M′,签名为
(
r
′
,
s
′
)
(r',s')
(r′,s′)
- w ≡ ( s ′ ) − 1 m o d q w\equiv(s')^{-1}\mod q w≡(s′)−1modq
- u 1 ≡ [ H ( M ′ ) w ] m o d q u_1\equiv[H(M')w]\mod q u1≡[H(M′)w]modq
- u 2 ≡ r ′ w m o d q u_2\equiv r'w\mod q u2≡r′wmodq
- v ≡ [ ( g u 1 y u 2 ) m o d p ] m o d q v\equiv[(g^{u_1}y^{u_2})\mod p]\mod q v≡[(gu1yu2)modp]modq
- 检查 v = r ′ v=r' v=r′