密码学基础(四) - 消息验证码

消息的完整性

保密性与完整性

考虑一个现实模型:一个用户想要与银行在internet上进行通信,当银行收到一条消息说要从这个用户的账户上转1000$到另一个账户上,那么银行必须确认两件事:

  1. 请求是否被验证,也就是说这个用户是否真的发起了这个请求,还是说是这个请求是由某个敌手发起的。
  2. 假设这个请求确实是由合法用户发起的,那么这个请求的详细细节是否又真的是这个用户请求的内容呢?

需要注意的是,在网络通信中的纠错码并不能保证确认上面的第二个要求,因为纠错码是用来检测并纠正影响通信的一小部分随即发生的错误,但是无法抵抗能够自由选择在任何地方出现任意数量错误的恶意敌手。

消息认证码的定义

目前所讨论的消息认证码(Message Authentication Codes, MAC)可以用于检测消息是否被敌手修改,带并不具备公开可认证性,因为这里的消息认证码是基于通信双方共享同一个密钥而设计的。

一个MAC有三个PPT上的算法构成的MAC := (Gen, Mac, Vrfy):
密钥生成算法Gen:将安全参数1n作为输入然后输出一个密钥 k ,并且密钥长度 |k| ≥ n。

标签生成算法Mac:将密钥 k 以及明文m∈{0, 1}*作为输入,然后输出标签 t 。这个算法可能是随机化的,所以记作 t ← Mack(m)

确定性认证算法Vrfy:将密钥 k ,一个明文m以及标签 t 作为输入,然后输出一个比特 b ,如果 b=1 则意味着这是有效的明文标签对。记作b := Vrfyk(m, t)

一个有效的消息认证码需要对所有 n ,任意一个由Gen(1n)输出的 k 以及任意的明文m∈{0, 1}*,都有Vrfyk(m, Mack(m)) = 1。

如果存在一个函数 l 对所有由Gen(1n)生成的密钥 k ,算法Mack都是定义在明文m∈{0, 1}l(n)上的,则称这个算法是对于消息长度为 l(n) 的固定长度MAC。

  • 规范的认证:在认证算法认证明文-标签对(m, t)的时候,会计算t' = Mac(m),然后当且仅当 t'=t 的时候才输出1。

消息认证码的安全性

正如在讨论加密方案的安全性时,设计了一个对于不同安全程度的加密方案的窃听实验一样,在这里讨论消息认证码的时候也设计一个伪造实验。

一个能够在通信信道上进行窃听的敌手可以通过观察通信方的交流而能够得到所有在交流过程中使用的明文以及对应的标签,然后再通过前面所观察得到的规律直接或间接的修改明文。

基于前面的假设,可以构造一个敌手来进行伪造实验:

伪造实验Mac-forgeA, Π(n):

  1. 通过运行Gen(1n)来获得一个密钥k
  2. 敌手获得一个输入1n,以及一个Mac语言机Mac( · ),敌手可以访问Mac语言机查询明文m对应的标签。令Q表示敌手查询过的所有明文m的集合,然后敌手输出一个伪造的明文-标签对(m, t)
  3. 如果 Vrfy(m, t)=1 并且m ∉ Q则敌手成功进行了伪造,在这种情况下这个实验的输出为1

 一个消息认证码 Π=(Gen, Enc, Dec)如果对于所有PPT上的敌手都存在一个可忽略函数 negl,使得Pr[Mac-forgeA, Π(n)=1]≤negl(n),则称这个消息认证码在自适应选择明文攻击下具备不可伪造性。

回放攻击:如果没有将任何状态的概念合并到认证算法中,那么这个消息认证码无法抵抗回放攻击,也就是说敌手可以将通信方发送过的消息重新发送给另一方。而现在最常见的用来抵抗回放攻击的技术就是通过添加序列号或则添加一个时间戳的方法。

强消息认证码

强的消息认证码与普通的消息认证码的区别就好比计算行安全的加密方案与CPA安全的加密方案的区别一样:就是在安全测试的实验中给敌手放松了一些要求。

普通的消息认证码的安全性就是保证如果敌手知道了明文m1, m2, ...对应的标签t1, t2, ...,那么他无法为造出一个对于明文 m ∉ {m1, ...}的有效标签 t 。

然而敌手却有可能伪造一个对于明文m1的不同的标签 t' ,t' ≠ t1

强MAC的伪造实验Mac-sforgeA, Π(n):

  1. 通过运行Gen(1n)来获得一个密钥k
  2. 敌手获得一个输入1n,以及一个Mac语言机Mac( · ),敌手可以访问Mac语言机查询明文m对应的标签。令Q表示敌手查询过的所有明文-标签对(m, t)的集合,然后敌手输出一个伪造的明文-标签对(m, t)
  3. 如果 Vrfy(m, t)=1 并且(m, t) ∉ Q则敌手成功进行了伪造,在这种情况下这个实验的输出为1

 一个消息认证码 Π=(Gen, Enc, Dec)如果对于所有PPT上的敌手都存在一个可忽略函数 negl,使得Pr[Mac-sforgeA, Π(n)=1]≤negl(n),则称这个消息认证码是强安全的,或者称这个消息认证码为强消息认证码。

定理:设Π=(Gen, Mac, Vrfy)是安全的消息认证码,如果Π的认证算法是规范的认证,那么Π也是强消息认证码。

  • 侧信道攻击:敌手的攻击的手段并不是通过窃听通信者使用的信道,而是通过分析通信者发送消息使用的时间或者设备的CPU利用率从侧面的获取自己想要的信息。这中攻击方式称为侧信道攻击方式。

构造一个安全的消息认证码

固定长度的消息认证码

设 F 是一个伪随机函数,则可以构造一个固定长度的消息认证码:

  • Mac:对于输入的密钥k∈ {0, 1}n,一个明文m∈{0, 1}n,输出标签t := Fk(m)(如果明文和密钥的长度不相等则什么也不输出)
  • Vrfy:对于输入的密钥k∈ {0, 1}n,一个明文m∈{0, 1}n,以及一个标签 t∈{0, 1}n,当且仅当 t =Fk(m)的时候才输出1。

定理:如果F是伪随机函数,那么上面所构造的消息认证码是对固定长度明文安全的消息认证码。

证明:

这个定理的证明方法和前面证明计算安全的加密方案以及CPA安全的加密方案的方法一样,都是通过区分器D像敌手仿真一个安全实验,从而建立关系。

构造一个Π‘=(Gen', Mac', Vrfy'),其与上面构造的消息认证码的区别是使用一个真正的随机函数 f 代替 F。

假设有一个用于区分 F 和 f 的区分器D,它将进行伪造实验的PPT上的敌手 A 作为自己的子程序:当敌手查询 m 对应的标签时,区分器 D 计算 t := O(m),并将其返回给敌手A。将敌手查询的明文集合记为Q;当敌手发送明文-标签对(m, t)进行认证的时候,区分器 D 当且仅当t := O(m) 且 m∉Q 的时候才输出 1。

所以通过上面的策略可以得出:Pr[Mac-forgeA, Π(n)=1] = Pr[(DFk(·)(1n)=1)];Pr[Mac-forgeA, Π’(n)=1] = Pr[Df(·)(1n)=1]

而因为F是伪随机函数,所以有: | Pr[(DFk(·)(1n)=1)] - Pr[Df(·)(1n)=1] | ≤ negl(n)

则:| Pr[Mac-forgeA, Π(n)=1] - Pr[Mac-forgeA, Π’(n)=1] | ≤ negl(n)

而对于所有的明文 m ∉ Q,t = f(m)的值是随机的从集合{0, 1}n中选择的,所以Pr[Mac-forgeA, Π'(n)=1]≤2-n

所以Pr[Mac-forgeA, Π(n)=1] ≤ Pr[Mac-forgeA, Π'(n)=1] + negl(n) = 2-n+negl(n),所以Π=(Gen, Mac, Vrfy)是安全的。

域扩展的消息认证码

构造好了对于明文长度为 n 的消息认证码后,那么可以通过这个消息认证码进一步构造一个对于任意长度的消息认证码。

假设Π'=(Gen, Mac‘, Vrfy’)是对于长度为 n 的明文的消息认证码。将任意长度的明文m划分长度相等的明文块m1, ..., md(如果需要则在末尾填充0)

1.最简单的构造方法:计算 ti := Mack'(mi),然后输出<t1, ..., td>作为明文 m 的标签。这种方法可以防止敌手使用任何未经过认证的明文块来进行认证。

重新排序攻击:如果<t1, t2>是对明文<m1, m2>有效的标签,那么<t2, t1>是对另一个不同的明文有效的标签。

2.为了防止重新排序攻击,计算 ti := Mack'(i || mi),然后输出<t1, ..., td>作为明文m的标签,这种方法可以防止重新排序攻击。

剪裁攻击:如果<t1, t2>是对明文<m1, m2>有效的标签,那么<t1>是对明文<m1>有效的标签。

3.为了防止剪裁攻击,计算ti := Mack'(l || i || mi),其中 l 表示明文的长度,这种方法可以防止剪裁攻击。

混合匹配攻击:如果明文<m1, m2>的有效标签是<t1, t2>,明文<m1', m2'>的有效标签是<t1', t2'>,那么<t1, t2' >就是明文<m1, m2'>的有效标签。

4.为了防止混合匹配攻击,为每个明文m生成一个随机的标识符 r

结合前面的案例,构造一个抵抗各种攻击的MAC

设Π‘=(Gen, Mac', Vrfy')是对于固定长度的消息认证码,则可以构造一个对任意长度的消息认证码:

  • Mac:对于输入k∈{0, 1}n, 以及任意长度小于2n/4的明文m∈{0, 1}*,将明文分为 d 个长度为n/4的消息块,随机的选择一个标识符 r ∈{0, 1}n/4。然后计算ti := Mack'(r || i || l ||mi),其中 i 和 l 表编码成长度为 n/4 的二进制数。最终输出的标签需要将 r 也带上,即t := <r, t1, ..., td>
  • Vrfy:对于输入的k∈{0, 1}n,明文m∈{0, 1}*,以及标签t =<r, t1, ..., td>,将明文m分成长度为n/4的明文块,当且仅当明文长度相等且Vrfyk'(r || l || i || mi, ti)=1的时候才输出1。

定理:如果Π’是对固定长度明文安全的消息认证码,那么上面所构造的消息认证码是对任意长度安全的消息认证码。

证明:

 

另一种域扩展的消息认证码CBC-MAC

构造:设F是一个伪随机函数,其固定长度为 l ,则最简单CBC-MAC构造的方法如下:

  • Mac:对于输入k∈{0, 1}n,以及长度为 l(n)*n 的明文,先将 m 划分为 m=m1, m2, ..., ml(n),其中 mi 的长度为 n ,令 t0 = 0n,然后对于 i=1, ..., l(n),ti=Fk(ti-1, mi) ,最后将 tl(n) 作为输出的标签
  • Vrfy:对于输入k∈{0, 1}n,一个明文m以及一个标签 t ,如果 m 的长度不是 n*l(n) 就直接输出0,否则当且仅当 t = Mack(m)的时候才输出1。

CBC-MAC的示意图如下:

 

 

定理:设 l 是一个多项式,如果 F 是一个伪随机函数,则上面所构造的CBC-MAC是对于明文长度 l(n)*n 安全的消息认证码。

这里需要注意CBC-MAC与CBC模式加密的区别:

这里需要比较一下前面所构造的任意长度MAC与这里的CBC-MAC之间效率的差别:

 

可认证加密

到目前为止,已经可以分别实现消息的保密性和消息的完整性,现在需要做的就是将这两种安全技术组合到一起,从而实现同时保证消息的保密性和完整性。

设Π=(Gen, Enc, Dec)为一个私钥加密方案,前置条件是 Π 必须是一个CCA安全的加密方案,这里之所以考虑选择密文攻击是因为需要明确的考虑到一个活跃的敌手在通信双方之间改变数据。

在适应性CCA下,这里所讨论的消息完整性实际上就是不可伪造性。

不可伪造加密实验(Enc-ForgeA,Π(n)):

  1. 运行Gen(1n)来获得密钥k
  2. 敌手A获取输入1n以及一个加密预言机Enck(·),敌手输出一个密文 c 
  3. 设m := Deck(c),用集合Q表示敌手A向加密预言机Enck(·)查询的所有明文。则这个实验输出 1 当且仅当(1)m ≠ bot (即m能够通过消息完整性的认证),(2)m∉Q。

定义:一个私钥加密方案Π如果对于所有运行在PPT上的敌手A都是不可伪造的,那么则存在一个可忽略函数negl,使得Pr[Enc-ForgeA,Π(n)=1] ≤ negl(n)。

定理:如果一个私钥加密方案是CCA安全的并且不可伪造,那么这种加密方案就是可认真的加密方案。

通用的构造

设ΠE=(Enc, Dec)是一个CPA安全的加密方案,设ΠM=(Mac, Vrfy)一个MAC,其中的这两者的密钥都是一个随机选择的01串。

那么,对于使用独立密钥的ΠE和ΠM,可以有三种组合:

  1. Encrypt-and-Authenticate
  2. Authenticate-then-Encrypt
  3. Encrypt-then-authenticate

Encrypt-and-Authenticate

给定一个明文m,发送者将其转换成密文<c, t>,其中 c := EnckE(m),t=MackM(m)。

接收者先将 c 解密成 m ,然后验证标签 t ,如果VrfykM(m, t)=1,则输出明文m,否则输出一个错误信息。

然而在这种构造方法中,由于MAC本身并不具备保密性,所以窃听者可以通过 t = MackM(m)来获取 m 的信息。

此外,由于大多数的MAC都是确定型函数,所以当发送发将同一条明文发送两次就会被识别出来,所以这样构造出来的加密方案甚至都不是CPA安全的。

Authenticate-then-Encrypt

给定一个明文m,发送这将其转换成密文 c ,其中 c := EnckE(m||t),其中t := MackM(m)。

接收者收到密文后将其解密获得m||t,然后在进行验证,和前面一样,如果VrfykM(m, t)=1,则输出明文m,否则输出一个错误信息。

这种加密方案也是不够安全的:

证明.

构造一个函数Transform(m),它会将 m 中的每个 0 转换成 00,1 随机的转换成 01 或者 10。而对应的逆函数就是将 c 中的 00 转换成 0,01 或者 10 转换成 1,如果遇到了 11就输出一个bot。

设Enck(m)=Enck'(Transform(m)),其中Enck'表示使用伪随机函数的CTR模式加密方案,那么显然Enck是CPA安全的加密方案。

如果m的第一个比特是 1,那么Transform(m)的前两个比特就是01或者10,

 

Encrypt-then-authenticate

给定一个明文m,发送者将其转换成密文<c, t>,其中 c := EnckE(m),t=MackM(c)。

接收方先进性验证,如果Vrfy(c, t)=1,那么将密文进行解密得到的明文作为输出。

完整的构造方法:

  • Gen':对于输入的1n,独立的选择两个密钥kE,kM∈{0, 1}n,并且输出这两个密钥
  • Enc':对于输入的kE,kM以及明文m,计算c := EnckE(m),t := MackM(c),然后输出密文<c, t>
  • Dec':对于输入的kE,kM以及密文<c, t>,首先验证VrfykM(c, t)是否等于1。如果等于 1 就输出DeckE(c);否则输出一个bot。

可以证明如果ΠE是CPA安全的并且MAC也是强安全的消息认证码,那么这种加密方案是可认证的加密方案(CCA+不可伪造):

证明.
如果一个<c, t>对能够通过Vrfy认证,那么称其是有效的。

而强安全的MAC能够保证敌手无法伪造出没有从加密语言即查询过的有效<c, t>,所以该方案的不可伪造性就得到满足。

此外,又由于敌手无法构造出有效的<c, t>,无法通过验证,所以敌手的解密预言机也没用了,那么CCA窃听实验就变成了CPA窃听实验,由于ΠE是CPA安全的,所以上面方法构造出来的加密方案是CCA安全的。

  • 独立密钥的必要性

如果kE=kM=k,那么假设F是一个强的伪随机置换,那么F-1也同样是强的伪随机置换,令Enck(m)=Fk(m||r),其中m∈{0, 1}n/2, r∈{0, 1}n/2,Mack(c)=Fk-1(c)。

不难证明这种加密方案是CPA安全的,并且MAC也是安全的消息认证码。

然而利用上面的加密方案以及消息认证码通过Encrypt-then-authenticate的组合方式构造出来的加密方案是不安全的:

<Enck(m), Mack(Enck(m))>=<Fk(m||r), Fk-1(Fk(m||r))>=<Fk(m||r), m||r>,这样就直接暴露了明文m。

安全的会话

 

posted @ 2019-10-09 16:21  Hang3  阅读(2737)  评论(0编辑  收藏  举报