Chapter 7 选择明文攻击下的安全性
文章目录
之前介绍的所有密码的安全性定义都没有保证 在多个明文重复使用同一密码下的安全性。比如上一章提到的PRF,由于是一个确定性的函数,如果输入的明文一样,密文就是一样的。这意味着得到两个相同的密文,即使不知道明文是什么,但是可以判断两者的明文相同,这其实也泄露了信息。为此,需要引入一种新的安全性定义,该定义中攻击者可以发动选择明文攻击(chosen-plaintext attack),以模拟重复使用密钥的情况。这样的安全性称为CPA安全性(security against chosen-plaintext attacks)。
在之前介绍过的安全性定义中,一次性密码本、PRG(定义5.1)的密钥在每次使用时会重新选择,因此并不使用同一个密码,故没有考虑选择明文攻击;PRF、PRP(定义6.1、定义6.2)要求不可区分的随机库(定义中的rand)在明文相同时密文也相同,所以并没有要求CPA安全性。
一、CPA安全性
1、CPA安全性的定义
定义7.1 对于一个密码算法 Σ \Sigma Σ, Σ \Sigma Σ具备CPA安全性当且仅当如下图所示的两个库不可区分(即 L c p a − L Σ ≈ ~ L c p a − R Σ L_{cpa-L}^\Sigma\widetilde\approx L_{cpa-R}^\Sigma Lcpa−LΣ≈ Lcpa−RΣ):
从定义中可以看到,CPA安全性定义中的两个库中,密钥 k k k都是内置的(可以理解为程序里的静态变量,但是保密),因此能否区分两个库,便是在模拟重复使用同一密钥加密 m L 、 m R m_L、m_R mL、mR时能否根据密文区分出输入的是哪个明文。
2、确定性函数无法满足CPA安全性
之前介绍的分组密码(也就是PRP)是确定性函数,也就是相同的明文(使用同一密钥)总是得到相同的密文,因此无法满足CPA安全性。也就是说,对于任意PRP都可以构造如下攻击者程序,使得定义7.1中的两个库可区分。因为对于 L c p a − L Σ L_{cpa-L}^\Sigma Lcpa−LΣ而言,明文都是 x x x,必然有 c 1 = c 2 c_1=c_2 c1=c2;对于 L c p a − R Σ L_{cpa-R}^\Sigma Lcpa−RΣ而言,PRP是一个单射函数,因此不同明文对应的密文不会相同,因此 c 1 = c 2 c_1= c_2 c1=c2的概率就是所选择的明文相同的概率 1 ∣ M ∣ \frac{1}{|M|} ∣M∣1。这在 λ → ∞ \lambda\rightarrow\infin λ→∞时是可区分的。
实际上,所有确定性的加密算法都具有“相同明文在同一密钥下得到相同密文”的特点,因此都无法满足CPA安全性(其攻击程序的构造类似上图)。
3、实现CPA安全性的三类方法
那么怎么构造一种非确定性(non-deterministic)的加密算法 来实现CPA安全性?主要有以下三类方法(思路):
-
加密/解密算法具备状态(stateful)从而可以改变密钥
这类方法的思路就是在加密/解密的过程中,根据当前状态从而选择不同的密钥,避免重复使用同一密钥。那么这就需要不断产生密钥,之前介绍的symmetric ratchet就能够实现(它在每次加密的过程中就会更新密钥)。
-
采用具有随机性的加密算法(randomized)
既然确定性的算法无法满足CPA安全性,那么可以在其中增加一些随机性(比如使用一些随机数),使其满足CPA安全性。不过这一做法需要保证在增加随机性后,依然可以正确解密。
-
在加密算法中引入nonce
所谓的nonce(”number used only once“)是指只用一次的数,它将作为加密/解密算法的一个输入参数。nonce并不要求它是秘密的,也不要求是随机选取的,但是它在输入时是一个确定的数。在引入nonce(记为 v v v)的情况下,密码的正确性要求变为 D e c ( k , v , E n c ( k , v , m ) ) = m Dec(k,v,Enc(k,v,m))=m Dec(k,v,Enc(k,v,m))=m,其中加密和解密需要用同一个nonce。而安全性要求则是如下两个库不可区分,其中允许攻击者选择nonce,但是不允许重复使用同一个nonce加密多个明文(return err):
个人理解这种做法的思路其实是引入额外的输入参数对加密/解密算法进行一定的控制。比如Alice和Bob共享多个不同的密钥,加密时会告诉对方这次用的是第nonce个,攻击者尽管知道nonce的具体值但是也不知道具体的密钥,而且只要nonce不重复就不存在密钥重复使用的情况。
二、基于”伪随机分布的密文“角度的安全性定义
在第二章 可证明安全基础介绍安全的定义时,提到了”left vs right“(两个不同明文的密文不可区分)和"real vs random"(密文像是均匀/随机采样)两种角度。对于CPA安全性而言,也可以从后者的角度(即密文像是伪随机分布的)进行安全性定义,不过需要允许选择明文攻击(就是可以重复使用密钥,这一点在于下图中密钥是内置)——因此提出如下定义:
定义7.2 对于一个密码算法 Σ \Sigma Σ, Σ \Sigma Σ具备在选择明文攻击下(CPA)的伪随机分布的密文(pseudorandom ciphertext),当且仅当如下图所示的两个库不可区分(即 L c p a − r e a l Σ ≈ ~ L c p a − r a n d o m Σ L_{cpa-real}^\Sigma\widetilde\approx L_{cpa-random}^\Sigma Lcpa−realΣ≈ Lcpa−randomΣ):
之所以提出定义7.2,是因为与定义7.1相比,它的证明往往更短(因为定义7.1在证明中,从初始到可以将 m L m_L mL替换成 m R m_R mR,再到最后的目标,这两段的证明过程往往是类似的,显得冗长)。而且满足定义7.2中的CPA安全性,也必然满足定义7.1中的CPA安全性(下面会给出证明过程)。因此在证明CAP安全性时,往往使用定义7.2。
定理7.1 满足CPA安全性定义7.2的密码算法,也满足CPA安全性定义7.1。
证明:证明过程也是使用Hybrid方法,从定义7.1的L库通过一系列转换,得到R库。其中关键就是如何将 m L m_L mL换成 m R m_R mR。具体过程如下:
可以看到,步骤1是为了利用定义7.2而拆解成调用的形式,步骤2则使用了定义7.2的不可区分。由于rand库中输出结果与输入无关,故步骤3中可以将 m L m_L mL换成 m R m_R mR。后面的步骤则是与前面类似,再次使用定义7.2将其重新转换为需要的形式(从中也看出为什么认为定义7.1的证明比较冗长)。
三、用PRF构造满足CPA安全性的密码
设计具备CPA安全性的密码算法是由一定难度的,既需要通过增加随机性(不重复使用密钥)来满足CPA安全性,又需要设计解密算法以保证正确性。而再次将介绍一种用PRF构造的具备CPA安全性的密码。PRF本身是一种确定性算法,但是如果输入不重复,安全PRF的输出结果就是伪随机数。因此结合一次性密码本,我们可以进入一个参数 r r r,加密时通过PRF得到一次性密码本中的密钥 F ( k , r ) F(k,r) F(k,r)(伪随机数),然后根据一次性密码本的算法,将明文 m m m加密为 F ( k , r ) ⊕ m F(k,r)\oplus m F(k,r)⊕m。解密时只要使用相同的 r r r就可以正确解出明文(PRF结果虽然是伪随机数,但是是确定性函数,其安全性由其密钥 k k k保证)。显然,只要每次加密的 r r r不重复,那么就具备CPA安全性。而 r r r可以根据本章第一节所介绍的三类思路来选取:
- 根据状态改变密钥:可以将 r r r作为计数器,即第 i i i次加密,就用 r = i r=i r=i,进而改变密钥 F ( k , r ) F(k,r) F(k,r)。
- 增加随机性: r r r可以是均匀采样(随机选取)。
- 引入nonce: r r r本身就可以视为nonce,因为nonce本身的含义就包含不重复。
这里我们将使用增加随机性的方式来选取 r r r(书上提到这是比较传统的做法,同时也具备更好的鲁棒性),完整的密码如下(其中F是一个安全的PRF,其 i n = λ in=\lambda in=λ):
其实这个方案和一次性密码本十分相似,就是一次性密码本的密钥(指 F ( k , r ) F(k,r) F(k,r),不是本方案的密钥/PRF的密钥 k k k)是通过PRF生成 从而实现伪随机的效果。
下面证明该密码方案的CPA安全性。
这里的安全性定义采用定义7.2,整体思路就是通过Hybrid方法,将定义7.2中的real库转化为random库。具体过程如下:
为了后续使用PRF的安全性,第1步是将其等价转换成调用PRF,第2步则是利用了PRF的安全性。但是我们知道,目前这个形式虽然和一次性密码本十分类似,但是(一次性密码本的)密钥 z z z并没有不可区分于均匀采样( z ← { 0 , 1 } o u t z\leftarrow \{0,1\}^{out} z←{0,1}out)——而一次性密码本的安全性要求密钥是均匀采样所得的。这是因为PRF安全性只能保证在输入不重复的情况下,输出的结果是随机数。**因此我们需要使得PRF的输入 r r r是不重复的。**为此,第3步中将 r r r的选取再次写成调用库的形式。目前 r r r的选取是存在重复的均匀采样,但是定理4.4中提到均匀采样和不重复的均匀采样是不可区分的(定理4.4虽然只是给出两库advantage的概率上界,但是此处输入规模为 2 λ 2^\lambda 2λ,因此可以证明上界可忽略)。因此第4步正是使用了定理4.4的这一对不可区分库。有了 r r r是不重复这一条件,第5步就可以将 z z z的选取视为均匀采样了。第6步则是再次用引理4.4将 r r r的选取恢复成均匀采样(与最后的目标rand的形式一致)。第7步是内联,第8步使用一次密码本的安全性得出 x x x等价于均匀采样所得,得证。