认证加密

我们已经独立地讨论了“安全”的两个方面:保密性与真实性。现在我们要考虑如何构造一个能够兼顾两个方面的安全性的方案。

选择密文攻击(Chosen-Ciphertext Attacks, CCA)

我们回到普通的私钥加密的场景,这里只有消息\(m\)和私钥\(k\),没有标签\(t\)。在只考虑被动的没有能力修改密文的窃听者时,我们基于选择明文攻击定义了CPA安全性。现在考虑一个具有篡改密文能力的敌手,它能够通过给接收方发送其自己构造的密文,通过观察接收方的在此之后的“举动”来实现破译。换言之,接收方在接受到一个经过篡改的密文之后做出的行为本身有可能暴露明文的信息。例如,在块密码中我们通常要对长度不恰好为\(n\)的倍数的消息做padding,而这一padding方案是敌手事先已知的。此时敌手对于一个截获的密文,可以修改其中的某些位重新发给接收方,接收方会有一个程序检查padding是否合法并在不合法的时候返回“错误”。对于某些方案(例如CBC加密),敌手可以通过不断尝试并结合接收方返回的错误与否还原出整个明文。由此可见,在具有篡改密文能力的敌手面前,CPA安全已经不够用了。

在以上例子中,我们看到敌手具有“选择密文”并得知密文的“padding是否合法”这一信息。为了更广泛的应用,我们进一步加强敌手的能力。我们假设敌手有能力选择任意的密文并获知其对应的明文的能力(但不能是他想要破译的那条密文,否则就没有意义定义安全了),这样的攻击称为“选择密文攻击”。要想抵抗选择密文攻击,我们的加密方案直观上需要具备这样的性质:一条密文一旦经过了修改,它在解密后就完全和原来的密文没有任何关联了——经过修改的密文在解密后不包含明文的任何信息。下面我们具体的定义CCA安全性:

选择两条明文,随机把其中一条加密交给敌手。设多项式算力的敌手有选择明文并获取密文、选择密文并获取明文多项式次的能力,但不能获取要破译的密文的明文。如果敌手猜对的概率不超过\(1/2+\text{negl}\),就称这一方案是CCA不可辨别的。一个CCA不可辨别的方案被称为CCA-secure的。

认证加密(Authenticated Encryption, AE)

以上例子表明,我们必须同时兼顾保密性与真实性。缺乏对消息内容真实性的保护会导致保密性受到攻击。我们给出一种称为认证加密方案的两种定义方式,这两种定义方式是等价的。

我们的设定依然是最普通的私钥加密。第一种定义方式是单独定义保密性和真实性。其中,保密性沿用CCA-secure的定义。对于真实性,我们考虑以下实验:假设多项式算力的敌手能够访问一个加密oracle,并最终输出一个密文\(c\)(当然是未被oracle输出过的)能被合法解密,就称敌手成功。如果敌手成功的概率\(\leq \text{negl}\),就称这一方案是不可伪造加密方案(unforgeable)。如果一个方案又是CCA-secure的,又是unforgeable的,就称这个方案是一个认证加密方案(authenticated encrption scheme)。

另一种合并方案是设计一个实验同时描述保密性和不可伪造性。假设我们有两套oracle,每套oracle里有一个加密oracle和解密oracle。第一套中的两个oracle就是方案本身的加密算法和解密算法;第二套中的加密oracle无论接受怎样的输入\(m\),都只输出与\(m\)长度相同的全零串对应的密文\(\text{Enc}_k(0^{|m|})\),解密oracle无论收到怎样的输入都返回密文不合法。我们规定敌手不能把加密oracle里输出的密文放进解密oracle里(不然这样解密oracle不可能输出不合法,这个实验就失去意义了)。现在随机选择一套oracle交给多项式算力的敌手,如果敌手不能正确分辨oracle的概率不超过\(1/2+\text{negl}\),就称这一加密方案是AE方案。这样的定义之所以是等价的,是因为假如敌手不能分辨这两套oracle,说明敌手无法辨别它拿到的所有密文和全零串的密文的关系,也即密文没有泄露信息(保密性),并且在实验过程中生成的密文始终都是不合法的(不可伪造性)。

理论上,可以举例说明AE方案严格强于CCA-secure方案,也即存在这样的加密方案是CCA-secure的但是不是不可伪造的。但是在大多数自然构造下,一个CCA-secure方案总是AE方案。

AE方案的构造

直观上我们会认为,随意以某种方式把CCA-secure的方案与MAC-unforgeable的方案合并到一起就可以构造一个AE方案。但事实证明并非如此,例如我们有以下三种合并方案(\(k_E,k_M\)必须是独立生成的):

  • \(c=\text{Enc}_{k_E}(m),t=\text{Mac}_{k_M}(m)\)
  • \(t=\text{Mac}_{k_M}(m),c=\text{Enc}_{k_E}(m\| t)\)
  • \(c=\text{Enc}_{k_E}(m),t=\text{Mac}_{k_M}(c)\)

第一种显然是不安全的,因为\(t\)作为消息的认证码直接被传送,没有任何安全保障;第二种也是不安全的,因为它把标签作为了消息的一部分,无法抵抗我们在CCA中提到的基于padding的攻击。第三种方案是安全的,我们证明这一点:消息发送方发送一对字符串\(\lang c,t\rang\),因为\(\text{Mac}\)是一个unforgeable的方案,因此敌手伪造出一个合法的\(\lang c,t\rang\)的概率本身就是可忽略的。进一步,即便敌手伪造了一个合法的\(\lang c,t\rang\),由于\(\text{Enc}\)是CCA-secure的,它\(c\)提供的关于\(m\)的信息也是可忽略的。

posted @ 2024-08-20 00:44  DennyQi  阅读(38)  评论(0编辑  收藏  举报