完美安全性
对于一个理想的密码算法,我们期望达到的效果是敌手在获得密文信息CCC之后,对它获取加密的消息message mmm没有任何帮助。于是,我们就需要引出下面完美安全性的非形式化的定义:
定义:如果对于任意一个消息m和任意一个加密后的密文c,我们有下面的等式成立,则称该加密方案满足完美安全性:
Pr[M=m∣C=c]=Pr[M=m]Pr[M=m|C=c] = Pr[M = m]Pr[M=m∣C=c]=Pr[M=m]
- 需要注意的是,上面我们提到的敌手可以是任意计算能力的敌手,并不需要要求敌手的计算能力是多项式时间。
为了和下面的消息不可区分进行对照,我们这里给出一个等价的完美安全性定义:
对于任意两个消息m0,m1m_0, m_1m0,m1和任意的密文ccc,我们有
P[EncK(m0)=c]=P[EncK(m1)=c]P[Enc_K(m_0) = c] = P[Enc_K(m_1) = c]P[EncK(m0)=c]=P[EncK(m1)=c]
一次一密(One Time Pad)
我们现在给出一种加密方式满足上面的完美安全性的定义。
- 我们随机选择一个长度为n的随机数作为密钥k。
- 对于一个需要加密的消息m,我们计算c=k⊕mc = k\oplus mc=k⊕m来生成密文ccc。
- 如果需要进行解密,我们利用c⊕kc\oplus kc⊕k即可计算获得明文mmm。
一次一密的弊端
- 该加密方案只能使用一次。
- 该方案要求密钥和消息等长,且要求为随机数。
既然一次一密有上面的弊端,那我们是否可以获得更好的满足完美安全性的密码方案呢?
很遗憾,香农证明了如果要满足完美安全性的定义,我们需要的密钥长度必须要不小于明文的长度。换句话说,虽然我们上面的一次一密看起来不是很好,但是它确实是能满足完美安全性的最好的密码方案了。
计算安全性
何去何从
其实经过观察我们可以发现,完美安全性的定义其实是一个相当强的安全性定义。它要求对于任意能力的敌手,都无法对该加密算法造成威胁。
在现实生活中,我们只需要要求对于一个密码算法,不存在有效的算法(敌手)可以获得关于明文的任何信息即可。换句话说,也就是我们只要求在一定运行时间的算法能够获得明文的概率相当小就可以了。
- 有效的敌手在不同的场景下并不一致。
- 在实际密码应用中,有效的敌手可能是要求当前运行速度最快的计算机运行攻击算法,也需要二十年,或者一百年才能破解该密码算法。
- 在理论密码学中,有效的敌手指的是多项式运行时间的算法不能破解该密码算法。
因此我们就引出了下面的消息不可区分的定义:
消息不可区分(Message Indistinguishability)
如果对于任意两个消息m0,m1m_0, m_1m0,m1,对于任意运行时间小于ttt的攻击算法A\mathcal AA,都有下面式子成立,我们就称该算法满足(t,ϵ)(t ,\epsilon)(t,ϵ)消息不可区分:
∣P[A(Enc(k,m0))=1]−P[A(Enc(k,m1))=1]∣≤ϵ|P[\mathcal A(Enc(k,m_0)) = 1] - P[\mathcal A (Enc(k,m_1)) = 1]| \leq \epsilon∣P[A(Enc(k,m0))=1]−P[A(Enc(k,m1))=1]∣≤ϵ
- 注:这里m0m_0m0和m1m_1m1由敌手选择。
我们这里把消息不可区分和上面完美安全性的定义进行一个对照。发现消息不可区分表示的并不是加密m0m_0m0和加密m1m_1m1的消息获得密文ccc的概率完全相同,而是没有有效的算法能以大于某一概率的优势区分出来该密文是由哪个明文加密的。
个人理解:可以打个不太恰当比方。完美不可区分类似于口红A和口红B颜色完全一样,因此对于所有的人都无法获得区分这两个口红。像我这样的半色弱男生来说,可能根本分不清楚某些口红的颜色。那即使两个口红颜色分别为红A和红B,它们并不完全一致,但是我区分不出来。在我看来这两个颜色都是红色。那么这两个口红对我来说就是消息不可区分的。
我们一般把消息不可区分又称为Eve安全,即窃听者安全。意为只有窃听者存在的时候,该密码方案是安全的。这里要求窃听者之前并不知道该密码算法生成的其他明密文对。但是在现实密码应用中,我们很可能在攻击这个密码算法的时候,可以获得这个加密算法,即敌手是可以给这个加密算法一个明文,然后这个加密算法会输出一个密文。这种情况就要求密码算法满足新的安全性定义了。这种安全性定义我们称为选择明文攻击(CPA)。
选择明文攻击(CPA)
选择明文和上面的消息不可区分的定义类似,唯一的差别在于敌手拥有一个加密预言机Enc(K,⋅)Enc(K,\cdot)Enc(K,⋅)。
如果对于任意两个消息m0,m1m_0, m_1m0,m1,对于任意运行时间小于ttt的攻击算法A\mathcal AA,都有下面式子成立,我们就称该算法满足(t,ϵ)(t ,\epsilon)(t,ϵ)消息不可区分:
∣P[AEnc(k,⋅)(Enc(k,m0))=1]−P[AEnc(k,⋅)(Enc(k,m1))=1]∣≤ϵ|P[\mathcal A^{Enc(k,\cdot)}(Enc(k,m_0)) = 1] - P[\mathcal A^{Enc(k,\cdot)} (Enc(k,m_1)) = 1]| \leq \epsilon∣P[AEnc(k,⋅)(Enc(k,m0))=1]−P[AEnc(k,⋅)(Enc(k,m1))=1]∣≤ϵ
- 注:这里m0m_0m0和m1m_1m1由仍敌手选择。
- AEnc(k,⋅)\mathcal A^{Enc(k,\cdot)}AEnc(k,⋅)表示敌手拥有一个加密预言机
我们需要注意满足选择明文攻击的密码算法一定是概率性的。即对于相同的明文信息加密两次,将会获得不同的密文信息。
Why?
- 如果加密算法是确定性的。敌手可以向挑战者挑战m0,m1m_0, m_1m0,m1,然后挑战者会给敌手一个密文ccc。然后敌手可以分别询问预言机Enc(k,m0)Enc(k,m_0)Enc(k,m0)和Enc(k,m1)Enc(k,m_1)Enc(k,m1). 获得密文c0c_0c0和c1c_1c1。然后讲c0c_0c0和c1c_1c1与挑战者输出的密文ccc进行对照即可破解CPA安全性游戏。
如何构造满足Eve安全的密码算法和满足CPA的密码算法。
我们首先回顾一下一次一密算法。一次一密算法要求一个和消息长度相等的随机数作为密钥,然后对明文进行异或。其弊端为需要密钥长度要求和明文长度相等。
那对于消息不可区分来说,是不是存在一种算法Alg,这种算法的输入是一个比较短的随机数,输出是一个比较长的伪随机数。而且不存在“有效”的算法可以区分输出的伪随机数和真正的随机数。如果有这样一种算法,我们就可以使用一次一密的方式来获得对应的密文。
事实上,人们现在并不知道是否存在上面的算法Alg。如果P=NP的话,该算法一定不存在。换句话说,如果能构造出PRG,就说明了P≠NPP\neq NPP=NP。人们现在也还并不知道是否存在PRG。但是,由于PRG的存在是依赖一个很强的假设,人们也就开始使用了PRG了。
我们上面需要的这种算法就是为随机数生成器PRG。我们在这里说一下PRG的安全性定义。
使用PRG构造满足Eve安全的加密方案
如果一个函数G:{0,1}k→{0,1}n\{0,1\}^k \rightarrow \{0,1\}^n{0,1}k→{0,1}n对于时间复杂度为t的布尔算法A\mathcal AA, 下面的式子都成立,我们就称它为一个安全的(t,ϵ)(t,\epsilon)(t,ϵ)安全的伪随机数生成器
∣P[A(G(x1))=1]−P[A(x2)=1]∣≤ϵ|P[\mathcal A(G(x_1)) = 1] - P[\mathcal A (x_2) = 1]|\leq \epsilon∣P[A(G(x1))=1]−P[A(x2)=1]∣≤ϵ
x1x_1x1是一个k长的随机数,x2x_2x2是一个n长的随机数。
- 上面定义其实暗含了敌手可以访问PRG这个函数本身,但是由于敌手并不知道伪随机数生成器的种子s,因此敌手仍然无法区分拿到的究竟是伪随机数生成器生成的,还是一个真正的随机数。
我们下面给出使用PRG构造的满足消息不可区分安全性的加密方案。
- 随机选择一个长度为k的随机数kkk作为密钥。
- 计算c=G(k)⊕mc = G(k)\oplus mc=G(k)⊕m即为加密方案,其中消息mmm的长度为n。
- 计算m=c⊕G(k)m = c\oplus G(k)m=c⊕G(k)即为解密方案。
该方案满足消息不可区分。但是我们可以看到该方案仍然是一个确定性的加密,无法满足CPA安全特性。
接下来回顾一下为随机函数(PRF)的安全性定义,并且给出一个由PRF构造的满足CPA安全特性的加密方案。
伪随机函数:如果对于任意运行时间小于t的程序(敌手A\mathcal AA),一个函数F:{0,1}k×{0,1}m→{0,1}m\{0,1\}^k \times \{0,1\}^m \rightarrow \{0,1\}^m{0,1}k×{0,1}m→{0,1}m 如果敌手能满足下面的式子,那该函数就称为伪随机函数:
∣P[AFk()()=1]−P[Af()=1]≤ϵ∣|P[\mathcal A^{F_k()}() = 1] - P[\mathcal A^{f()} = 1] \leq \epsilon|∣P[AFk()()=1]−P[Af()=1]≤ϵ∣
其中f()f()f()表示一个随机函数。随机函数指的是从所有的m长输入到m长输出的所有函数中随机选择的一个函数。
使用伪随机函数构造加密方案
- 密钥:随机选择一个长度为k的随机数。
- 加密算法:随机生成一个长度为m的随机数r,并计算c1=rc_1 = rc1=r, c2=Fk(r)⊕mc_2 = F_k(r)\oplus mc2=Fk(r)⊕m。密文c=(r,c2)c = (r, c_2)c=(r,c2)
- 解密算法:计算m=Fk(r)⊕c2m = F_k(r)\oplus c_2m=Fk(r)⊕c2
可以看到,每次加密m,会随机选择一个随机数rrr。因此每次加密获得的密文并相同。
文章探讨了密码学中的完美安全性概念,指出一次一密是最理想的加密方式,但因其密钥管理限制而难以广泛应用。然后引入了消息不可区分的定义,它是现实世界中更实际的安全标准,允许一定程度的可区分性但限制在一定概率范围内。此外,文章提到了伪随机数生成器(PRG)和伪随机函数(PRF)在构建满足CPA安全性的加密方案中的作用。
1388






