参照课程:密码学原理 - 张宇, 密码学Ⅰ- Dan Boneh
0.密码学基础定义
在一切开始前,首先要给出一点基本概念,以及几个常用缩写和符号的解释。
一个密码学系统的构成:
- 明文 m (message/plaintext)
- 密文 c (ciphertext)
- 密钥 k (key)
- 加密算法 Enc (Encryption)
- 解密算法 Dec (Decryption)
- 密钥生成算法 Gen (Generator)
其中, m ∈ M , k ∈ K , c ∈ C m\in\mathcal{M},k\in\mathcal{K},c\in\mathcal{C} m∈M,k∈K,c∈C,分别称为明文空间,密钥空间,密文空间。
密码学的讨论场景通常如下图所示:
用Alice和Bob代指信息的发送方和接收方,在一个密码学系统中,通常默认加密算法和解密算法是公开的(事实上评价密码的安全性决不能对算法是否保密有所依赖),从敌手Adversary的角度考虑攻击,以此讨论密码的安全性。
Kerckhoffs原则:即使密码系统的任何细节已为人悉知,只要密钥(key)未泄漏,它也应是安全的。
密码学讨论的攻击方式:
- 唯密文攻击(Ciphertext-only Attack, COA)
- 已知明文攻击(Known-plaintext Attack, KPA)
- 选择明文攻击(Chosen-plaintext attack, CPA)
- 选择密文攻击(Chosen-ciphertext attack, CCA)
攻击的最终目的是解出密钥,或是对某个特定的密文还原出明文。
常见表述:
- ∣ k ∣ |k| ∣k∣表示密钥长度, ∣ K ∣ |\mathcal{K}| ∣K∣表示密钥空间大小
- { 0 , 1 } n \{0,1\}^n {0,1}n表示n位二进制串的集合, 0 n 0^n 0n表示n位的0串, 1 n 1^n 1n表示n位的1串(二进制下)
- m 0 ∥ m 1 m_0\|m_1 m0∥m1表示将 m 0 m_0 m0和 m 1 m_1 m1连起来构成的新的串
1.古典密码举例
首先要说明:古典密码在生产实际中已经没有任何应用价值,我们仅仅拿出两个当作例子讨论,作为密码学的入门。
单表替换密码 (Substitution Cipher)
单表替换密码依据一个字母替换表来完成加密和解密,例如替换表为[‘a’->‘q’,‘b’->‘w’,‘c’->‘e’],那么’abc’的加密结果是’qwe’。
一个经典的例子是凯撒密码(Ceasar Cipher)。
凯撒密码也可以称为移位密码,它对消息的每个字母进行一个固定长度的移位,具体而言当移位长度是3,则
′
a
′
→
′
d
′
,
′
b
′
→
′
e
′
,
′
z
′
→
′
c
′
'a'\rightarrow'd','b'\rightarrow 'e','z'\rightarrow'c'
′a′→′d′,′b′→′e′,′z′→′c′。我们定义密钥k为移位长度,将字母表示为字母表中的索引,例如a表示为0,z表示为25,那么移位密码的加密过程表示为:
c = E n c ( k , m ) = ( m + k ) m o d 26 c=Enc(k,m)=(m+k)\ mod \ 26 c=Enc(k,m)=(m+k) mod 26
其解密过程为:
m = D e c ( k , c ) = ( c − k ) m o d 26 m=Dec(k,c)=(c-k)\ mod\ 26 m=Dec(k,c)=(c−k) mod 26
这种方法当然是极易攻破的,因为密钥k只是一个限制在0到25的整数(模26意义下),通过对密文分别进行所有不同长度移位,明文就在得到的26个候选结果之中,可以很轻易地识别出来。
下面我们来考察如何攻破一般的单表替换密码。
首先,我们可以得出密钥空间的大小: ∣ K ∣ = 26 ! |\mathcal{K}|=26! ∣K∣=26!,因为替换表实质是明文空间中字符(这里就是26个英文字母)的一个全排列。这个数字大约是 2 88 2^{88} 288,通过穷举密钥的方式来进行攻击是不太现实的。
这里涉及到一个密码学原则,称为充分密钥空间原则(Sufficient Key Space Principle),即密钥空间应该足够大以抵御穷举攻击。这条原则有效的前提是密钥空间小于明文空间,即 ∣ K ∣ < ∣ M ∣ |\mathcal{K}|<|\mathcal{M}| ∣K∣<∣M∣,毕竟如果密钥空间比明文空间还大的话,穷举密钥解得的候选明文比所有可能的明文还要多,那这个穷举很难说是有意义的。
我们可以注意到,单表替换密码的操作单位仅是单个字符,如果一个’a’被替换成了’c’,那么消息中的任何一个’a’一定会被替换成’c’。在英文文本中,各个字母出现的频率是有差异的,比如字母e的出现概率高达12.7%,是频率最高的字母。由此就引入了频率攻击的概念,对密文进行字母统计,如果密文的长度足够,那么出现最频繁的那个字母很大概率就是e对应的替换表项。当然频率攻击的手段不止是单个字母的频率,还可以依据字母组合来推测,例如高频出现的组合有"an","in"等。对足够长的密文进行统计分析就可以确定密钥。
有一个判断密钥是否合适的方法,称为重合因子(Index of Coindence,IC),我们可以通过它来完成频率攻击。
重合因子的实际意义是反映一个文段中任取两个不同位置得到相同文字的概率的统计量,其标准定义为:
I C = c ⋅ ∑ i = 1 c n i ( n i − 1 ) N ( N − 1 ) IC=c\cdot\frac{\displaystyle\sum^{c}_{i=1}n_i(n_i-1)}{\displaystyle N(N-1)} IC=c⋅N(N−1)i=1∑cni(ni−1)
其中c是文字集合的大小, n i n_i ni是文字的出现次数,N是一段文字的总长度,c乘在前面是作为归一化系数,把这个系数去掉就是“任取两个不同位置得到相同文字的概率”的实际值。对于较长的文字来说, n i N \frac{n_i}{N} Nni与 n i − 1 N − 1 \frac{n_i-1}{N-1} N−1ni−1近似相等,我们只需计算 ∑ f i 2 \sum f_i^2 ∑fi2,其中 f i f_i fi是第i个文字出现的频率,这个式子的值称为 κ p \kappa_p κp(Kappa-plaintext)。
对所有文字完全随机出现的文段而言, f i = 1 c , κ p = 1 c , I C = c ⋅ κ p = 1 f_i=\frac{1}{c},\kappa_p=\frac{1}{c},IC=c\cdot\kappa_p=1 fi=c1,κp=c1,IC=c⋅κp=1。
在英文中,由于各个字母存在频率差异, κ p = ∑ i = 1 26 f i 2 \kappa_p=\displaystyle\sum_{i=1}^{26} f_i^2 κp=i=1∑26fi2的期望值为0.065。那么如果一个密钥是合适的,也就意味着其替换后满足英文的频率分布,我们对若干可能的密钥计算 ∑ p i q s i \sum p_iq_{s_i} ∑piqsi(其中 p i p_i pi是第i个字母在密文中的频率, q s i q_{s_i} qsi是第i个字母对应的明文字母 s i s_i si在英文中的频率),最接近0.065的方案是最合适的。
此外,如果一段密文是由正常英文明文单表替换而来,那么必然满足 ∑ p i 2 ≈ 0.065 \sum p_i^2 \approx 0.065 ∑pi2≈0.065.
维吉尼亚密码 (Vigener Cipher)
维吉尼亚密码实质上是对移位密码的一种改进,移位长度将循环变化。例如 k = C R Y P T O k=CRYPTO k=CRYPTO时,明文的移位长度依次为C,R,Y,P,T,O,C,R…
考虑攻击手法:维吉尼亚密码的密钥循环使用,每隔 ∣ k ∣ |k| ∣k∣位进行的移位长度一致,相当于是 ∣ k ∣ |k| ∣k∣组Ceasar。如果已知 ∣ k ∣ |k| ∣k∣的话,那么问题转化为单表替换密码的破解。所以剩下的问题就是如何确定k的长度。
一种手段是Kasiski方法:观察密文中多次出现的子串,这样的子串很可能是由相同明文加密而来,那么这些子串的距离应当是k的长度的整数倍,据此推测k的长度并进行解密尝试。另一种手段也是上面提到的重合因子方法:先猜测一个k的长度,然后将密文分成 ∣ k ∣ |k| ∣k∣组,如果 ∣ k ∣ |k| ∣k∣是正确的,那么每组都是一个单表替换,满足 ∑ p i 2 ≈ 0.065 \sum p_i^2 \approx 0.065 ∑pi2≈0.065,验证这个式子即可。
Vigener是单表替换的组合,它属于多表替换密码。上述攻击方法实际上对所有多表替换密码是通用的。
在上述古典密码的例子中,我们只讨论唯密文攻击COA的攻击方式,一个密码学方案可以用COA直接攻破而不需搭配其他手段,那么当然是安全性极差的,在KPA,CPA,CCA的攻击方式下更是脆弱不堪(它们对攻击者获取信息的要求更高,攻击性也更强,事实上一些现代密码也未必能完全抵御)。
2.完善保密
简要解释
完善保密性(perfect secrecy)是信息论安全性的一个特例,为香农提出的信息学观点,具有该性质的密文不应该透露任何明文的信息。
什么是不透露任何明文的信息呢?我们知道明文分布在明文空间 M \mathcal{M} M中,它有一个分布概率,比如说 P r [ M = " 是 " ] = 0.4 , P r [ M = " 否 " ] = 0.6 Pr[M="是"]=0.4,Pr[M="否"]=0.6 Pr[M="是"]=0.4,Pr[M="否"]=0.6,这里Pr表示事件的概率(probability)。假设敌手已经知道明文的分布并截获了某个具体的密文c,那么敌手无法分析出加密得到这个c的明文m有什么不一样的概率分布,敌手依然只敢说有0.4的可能性发送了是,0.6的可能性发送了否,而这是跟密文c无关的,也就是说无法从c中获取任何有用的信息。
不透露明文信息其实也意味着不透露密钥信息,因为解密算法是知道的,透露密钥信息相当于透露明文信息。
回顾一下在第1节提到的频率攻击,我们截获了一段单表替换密文,拿去分析字频,发现出现频率最高的字母是a而且频率接近12.7%,那就有很大概率在密钥中’a’ → \rightarrow →’e’,我们顺藤摸瓜推理出了最可能的密钥 k 0 k_0 k0,就算 k 0 k_0 k0在密钥空间内的概率分布只有 1 26 ! \frac{1}{26!} 26!1(均匀分布),我们拿着这个密文也能说发送方使用了 k 0 k_0 k0的概率非常大,这就是从密文透露了额外的信息。
所以“完善”的含义是对COA完善,具有完善保密性质的密码系统不可能被唯密文攻击攻破。
完善保密的数学定义:
∀ m ∈ M , ∀ c ∈ C , P r [ M = m ∣ C = c ] = P r [ M = m ] \forall m\in \mathcal{M},\forall c\in \mathcal{C},Pr[M=m|C=c]=Pr[M=m] ∀m∈M,∀c∈C,Pr[M=m∣C=c]=Pr[M=m].
也就是说后验概率等于先验概率,在密文确定的前提下明文概率依然等于先验概率分布。
如果先验概率分布是一个均匀分布(后面大多在此前提下讨论),那完善保密又可以进一步表示为:
P r [ M = m 0 ∣ C = c ] = P r [ M = m 1 ∣ C = c ] = . . . Pr[M=m_0|C=c]=Pr[M=m_1|C=c]=... Pr[M=m0∣C=c]=Pr[M=m1∣C=c]=...
当然,反过来也一样,对于一个确定的明文,完善保密将使得敌手无法区分其对应的密文的概率分布,上面式子可以写成 P r [ C = c 0 ∣ M = m ] = P r [ C = c 1 ∣ M = m ] = . . . Pr[C=c_0|M=m]=Pr[C=c_1|M=m]=... Pr[C=c0∣M=m]=Pr[C=c1∣M=m]=...
下面我们给出一个具有完善保密性的简单密码系统用以说明。
一次性密码本(One-time Pad,OTP)
在OTP密码系统中,发送方和接收方分别持有一份同样的密码本,密码本上有若干密钥,每次发送消息依次使用一个密钥,且每个密钥只使用一次。加密解密过程如下:
首先要保证密钥和明文等长, c = E n c ( k , m ) = k ⊕ m c=Enc(k,m)=k\oplus m c=Enc(k,m)=k⊕m, m = D e c ( k , c ) = k ⊕ c m=Dec(k,c)=k\oplus c m=Dec(k,c)=k⊕c.
机制非常简单,只是做一个异或,可以证明OTP是完善保密的(假设先验概率分布是均匀的):
P r [ M = m i ∣ C = c ] = P r [ E n c ( m i , k ) = c ] = P r [ m 0 ⊕ k = c ] = P r [ k = m i ⊕ c ] = 1 ∣ K ∣ ( i = 0 , 1 , 2 , . . . ) Pr[M=m_i|C=c]=Pr[Enc(m_i,k)=c]=Pr[m_0\oplus k=c]=Pr[k=m_i \oplus c]=\frac{1}{|\mathcal{K}|}\ \ (i=0,1,2,...) Pr[M=mi∣C=c]=Pr[Enc(mi,k)=c]=Pr[m0⊕k=c]=Pr[k=mi⊕c]=∣K∣1 (i=0,1,2,...)
具有完善保密性则可以完全抵御COA攻击,由于每个密钥只用一次,也不需要担心其他攻击类型。
在理论上,此种密码具有完善保密性,是牢不可破的,但在实际操作上却有以下的问题:
1.用以加密的文本,也就是一次性密码本,必须确实是随机产生的。
2.它至少必须和被加密的文件等长。
3.用以加密的文本只能用一次,且必须对非关系人小心保密,不再使用时,用以加密的文本应当要销毁,以防重复使用。
它的局限性……
从OTP的例子中,我们已经能看到完善保密的严重缺陷。
完善保密的密码系统要求密钥空间必须是不小于明文空间的,即 ∣ K ∣ ≥ ∣ M ∣ |\mathcal{K}|\ge|\mathcal{M}| ∣K∣≥∣M∣,可以用反证法加以证明:
若 ∣ K ∣ < ∣ M ∣ |\mathcal{K}|<|\mathcal{M}| ∣K∣<∣M∣,则攻击者截获一条密文c之后,对密钥空间内的所有密钥进行穷举,依次解密得到n个候选明文,显然 n ≤ ∣ K ∣ < ∣ M ∣ n\le|\mathcal{K}|<|\mathcal{M}| n≤∣K∣<∣M∣,那么 M \mathcal{M} M必然存在一些明文不在这n个候选明文之内,攻击者就至少可以知道密文c对应的消息必不可能是这些多出来的明文,即 P r [ M = m ′ ∣ C = c ] = 0 Pr[M=m'|C=c]=0 Pr[M=m′∣C=c]=0,这违背了完善保密的含义。
这条性质会造成很多不便,主要是密钥的生成和传递困难,所以很多广泛使用的密码并不具备完善保密性。
顺便一提,由于 ∣ K ∣ ≥ ∣ M ∣ |\mathcal{K}|\ge|\mathcal{M}| ∣K∣≥∣M∣,对密钥的穷举将导出 M \mathcal{M} M内所有明文,使得无法分辨谁才是被发送的消息,因此完善保密的密码系统是不怕穷举攻击的(就算攻击者算力无限都做不到COA攻破,现实中对长一点的密钥完成穷举在算力限制下也是不可能的)。
香农定理(Shannon’s Theorem)
(被叫做香农定理的东西一般是指电子通信领域的有噪信道编码定理……这里是密码学上的香农定理)
香农定理给出了完善保密的一个充要条件:
在 ∣ M ∣ = ∣ K ∣ = ∣ C ∣ |\mathcal{M}|=|\mathcal{K}|=|\mathcal{C}| ∣M∣=∣K∣=∣C∣的前提下,一个密码学方案具有完善保密性等价于下列条件:
- ∀ k ∈ K \forall k\in \mathcal{K} ∀k∈K,Gen生成k的概率是 1 ∣ K ∣ \frac{1}{|\mathcal{K}|} ∣K∣1
- ∀ m ∈ M , ∀ c ∈ C \forall m \in \mathcal{M}, \forall c \in \mathcal{C} ∀m∈M,∀c∈C,存在唯一 k ∈ K k \in \mathcal{K} k∈K,使得c=Enc(k,m)
充分性( ⇐ \Leftarrow ⇐)证明:
P r [ M = m ∣ C = c ] = P r [ K = k ] = 1 ∣ K ∣ Pr[M=m|C=c]=Pr[K=k]=\frac{1}{|\mathcal{K}|} Pr[M=m∣C=c]=Pr[K=k]=∣K∣1,其中k使得 E n c ( k , m ) = c Enc(k,m)=c Enc(k,m)=c。
必要性( ⇒ \Rightarrow ⇒)证明:
先证(2):
至少得有这么一个k,不然
P
r
[
M
=
m
∣
C
=
c
]
=
0
Pr[M=m|C=c]=0
Pr[M=m∣C=c]=0不符合完善保密性;最多只能有这么一个k,因为对一个m来说,每一个k生成一个c,如果有两个k都能生成一样的c,那么k的总数将少于c的总数,这与
∣
K
∣
=
∣
C
∣
|\mathcal{K}|=|\mathcal{C}|
∣K∣=∣C∣矛盾。故符合条件的有且只有一个k.
再证(1):
对任意一个确定的c,假设(
k
i
,
m
i
k_i,m_i
ki,mi),(
k
j
,
m
j
k_j,m_j
kj,mj)是满足
E
n
c
(
k
,
m
)
=
c
Enc(k,m)=c
Enc(k,m)=c的两个二元组,则
P
r
[
K
=
k
i
]
=
P
r
[
M
=
m
i
∣
C
=
c
]
=
P
r
[
M
=
m
j
∣
C
=
c
]
=
P
r
[
K
=
k
j
]
Pr[K=k_i]=Pr[M=m_i|C=c]=Pr[M=m_j|C=c]=Pr[K=k_j]
Pr[K=ki]=Pr[M=mi∣C=c]=Pr[M=mj∣C=c]=Pr[K=kj],由此可知任意k,
P
r
[
K
=
k
]
=
1
∣
K
∣
Pr[K=k]=\frac{1}{|\mathcal{K}|}
Pr[K=k]=∣K∣1.
完善保密的两个等价表述
不予证明,看懂表述即可。
- 完美不可区分性(Perfect Indistinguishability)
P r [ C = c ∣ M = m i ] = P r [ C = c ∣ M = m j ] Pr[C=c|M=m_i]=Pr[C=c|M=m_j] Pr[C=c∣M=mi]=Pr[C=c∣M=mj]
就是说加密任何一个明文产生的密文的概率分布相同。
- 敌手不可区分性(Adversarial Indistinguishability)
这个表述基于一个叫窃听不可区分性实验的东西(其实更接近一个“游戏”),放个PPT图:
人话:有个加密方案 Π \varPi Π,现在喊一个敌手 A \mathcal{A} A过来, A \mathcal{A} A构造了两个明文,机器随机选了一个去加密并给出密文, A \mathcal{A} A需要判断机器选了哪个,判断对了就赢了,赢了表示成 P r i v K A , Π e a v = 1 PrivK_{\mathcal{A,\varPi}}^{eav}=1 PrivKA,Πeav=1.
敌手不可区分性的数学定义:
∀ A , P r [ P r i v K A , Π e a v = 1 ] = 1 2 \forall \mathcal{A},Pr[PrivK_{\mathcal{A,\varPi}}^{eav}=1]=\frac{1}{2} ∀A,Pr[PrivKA,Πeav=1]=21
也就是说敌手构造任何两个明文进行实验,都没有办法去判断密文来源于哪个明文概率大一点,他只能以 1 2 \frac{1}{2} 21的概率猜。
3.总结
本章的主要内容是经典密码学,以古典密码为例介绍了密码学系统的基本构成,并给出了对于“安全”的一种形式化标准,也就是“完善保密”,这种标准有其不可忽视的弊端,我们将在下一章看到可行性更佳的安全标准。