ppt 链接:
攻击不只是可以窃听密文,还可以对密文进行篡改。
tamper 攻击举例。
一个简易的TCP/IP 协议。
如果目标端口是25,TCP/IP栈会解密这个包,看目标端口,然后把明文数据发给目标进程。
Bob对密文进行篡改,将端口从80改为25。Bob对端口进行了篡改后,就读到了本不该给他的数据。攻击者只需要改变IV域就可以了。
篡改方法。这样篡改后,攻击者就读到了本不该给他的明文信息。
没有完整性,一个CPA安全的加密不可能提供私密性。
选择密文攻击举例。
有一个远程终端的应用,每次用户敲击键盘,一个加密的键盘输入被送入服务器。假设键盘输入是计数器模式加密的,TCP报文头中包含了键盘输入的校验和。攻击者想知道键盘输入的内容。
攻击者首先截获数据包,不进行处理,直接把包发给服务器,但他会记录下来这个数据包。
然后他修改数据包,把加密的校验和和t异或,将加密的数据和s异或,他用很多的t和s来进行这个操作。服务器解密这个数据包,得到的数据是原数据异或s后的,检验和是原校验和异或t后的。如果修改后的校验和对于修改后的数据是正确的,那么ack。否则,直接丢弃,不做任何处理。
然后根据服务器的反应,攻击者得到一系列图下面的公式,最后可以解出明文。
CPA-安全并不能在主动攻击下保证安全性。
存在主动攻击者认证加密也能保证安全。
保证两点:1.CPA安全 2.密文完整性。
密文完整性。
认证加密的定义。
CBC不提供认证加密,因为对于任何密文,它都不会输出 \perp 。
认证加密的两个影响:
认证,意味着攻击者无法欺骗接受方Bob,让Bob认为Alice发送了一条实际上她没有发过的信息。但是认证加密不能阻止重放攻击。
认证加密能抵抗选择密文攻击者。
上文中所举的两个例子,都是选择密文攻击。
选择密文攻击安全性。
攻击者可以加密任何他想加密的信息,也可以解密任何他想解密的信息,除了挑战密文。
选择密文安全性定义。
注意:他的密文不是选择明文攻击询问中他所获的密文之一。攻击者收到的CPA密文都是挑战密文。
随机IV的CBC加密不是CCA安全的。
安全认证 \Rightarrow CCA安全
证明:
因为密文完整性,左右游戏不可区分。因为选择密文的询问总是以同样的方式回复,不会给攻击者任何的信息,攻击者总会收到 \perp 的回复。
因为选择密文的询问总是以同样的方式回复,不会给攻击者任何的信息,攻击者总会收到 ⊥ 的回复。
所以可以去掉CCA的询问。就变成了CPA询问,而认证加密是CPA安全的,所以右面上下两个游戏不可区分。
所以的游戏都等价了,所以是CCA安全的。
总结。
注意:1.不能阻止重放攻击。2.如果泄露了为什么拒绝的信息,比如计时攻击。那么认证加密也将是不安全的。
历史。
结合MAC和ENC的三种方式。
SSH分析。(ENC and MAC)
标签由明文计算,然后把标签以明文的形式附在密文的后面,这就有很大的问题,因为MAC本身不是为私密性设计的。MAC仅为完整性设计。实际上,仅以输出明文中的几位作为MAC的话,也没有错。如果我们这样做,会完全破坏CPA安全性,因为明文的若干位在密文中被泄露了。尽管对于SSH来说没有什么问题,但是还是不建议使用,因为MAC签名算法的输出会泄露明文中的某些位。
IPsec分析。(ENC then MAC)
总是正确滴!!!加密了明文,明文的消息被隐藏在了密文里。然后计算密文的标签,用标签给密文上了锁,确保没人可以产生一个不同的密文却看起来是有效的。这个方法确保任何对密文的修改都会被解密者检测出来,因为MAC无法验证。
SSL分析。(MAC then ENC)
加密机制和mac之间有一些不好的互动。会产生选择密文攻击。不对!!!
总结。
推荐使用先加密后mac。它总是正确的。
但是先mac后加密,在 rand-CTR 或者 rand-CBC 也一共认证加密。甚至对于 rand-CTR 一次性MAC更加有效率。但是还是推荐使用先加密后mac。
一些标准。
以下这些模式都被称为带相关数据的认证加密。(AEAD)
指的是提供给加密模式的信息不被完全加密,只有部分信息是被加密的,但所有信息都是被认证的。
注意:加密只被应用到部分需要加密的数据上。
AEAD的API(OpenSSL)
aad:需要认证但不需要加密的数据。
data:需要认证也需要加密的数据。
out:返回整个数据加密后的密文。
MAC安全的一个解释。
注意:(m,t) \nRightarrow (m,t') 确保了Enc then Mac 提供了认证加密。
如果 (m,t) \rightarrow (m,t') ,可以产生如下攻击。
OCB:从PRP直接构造认证加密。
可以并行,比之前都快,没成为标准,因为专利。。。。。。
性能参数。
数据加密协议:TLS记录协议。
每个TLS记录都以一个报文头开始,报文头后面接加密的数据(<16KB)。
两个密钥:浏览器用 k_{b\rightarrow s} 发送数据给服务器,然后用 k_{s\rightarrow b} 读取从服务器发来的数据。服务器一样的。
TLS记录协议使用了基于状态的加密,每个数据包的加密是使用了浏览器和服务器维护的特定状态来完成的。
每当浏览器发送一个记录给服务器,浏览器会增加它的 ctr_{b \rightarrow s} 的值,而当服务器接收到该数据时,则会增加它的 ctr_{b \rightarrow s} 的值。
目的:为了阻止重放攻击
加密。
一共四个密钥:两个用来加密,两个用来计算MAC。
和先加密后mac的区别,将计数器ctr进行了标签,目的是防止重放攻击。
蓝色表示加密部分,白色表示明文发送的数据。
解密
TLS 只有在解密时没有信息泄露,才提供认证加密。
坏记录mac警告对应于解密算法输出拒绝符号 \perp ,意思是密文是无效的,只要无法区分为什么密文被拒绝了,换句话说,就是解密者说了拒绝的事实,但它不说为什么会拒绝。事实上这是一个认证加密系统。但是,如果区分和暴露了为什么密文会被拒绝,是因为坏的补齐还是坏的mac,那就会有攻击产生。
老版本TLS协议中的错误。
在密码学中,只输出拒绝,从不解释为什么拒绝,光拒绝就好了。
之前讨论过的两种攻击:
1.二次密码本攻击:IV会重复。
2.使用了关联非常密切的密钥。IV||K 改变的一直是IV,k是固定的。
针对CRC的主动攻击。CRC 具有线性性质。
回顾。
TLS记录协议解密。
如果出现了不同的警告,攻击者就可以知道加密的密文中最后几个字节是否是有效的补齐。或者说,解密的密文后面几个字节是否位1,22,333,4444......
如果输出同样的警告信息,也由问题。TLS解密过程中,先解密再检查补齐,如果补齐无效,加密中止并产生一个错误。如果补齐有效,则检查mac,如果mac无效,加密中止,产生一个错误。这就造成了一个计时攻击。比较警告信息生成的用时。如果时间较短,补齐无效。如果时间较长,mac无效。
padding oracle
先扔掉 c[2],想猜测m[1]的最后一个字节。
g对m[1]最后一个字节进行猜测,范围位0-255。攻击者计算g异或0x01,再异或分组c[0]的最后一个字节。c[1]被解密后的结果为m[1]的最后一个字节异或g异或0x01。如果 g和最后一个字节相等,m[1]的最后一个字节为0x01。说明是格式正确的补齐。
这样我们可以用补齐预言机猜测出m[1]最后一个字节的值,然后我们再猜测m[1]倒数第二个字节的值,这次我们用(02,02)的补充。因为我们已经猜出来m[1]最后一个字节的值,用异或的技巧总是可以确保明文的最后一个字节为02,现在可以猜测m[1]的倒数第二个字节。最后,m[1]所有的字节可以全部被猜出。
知道TLS内部机制的话,这个攻击不起作用。问题在于当TLS接受一个带有坏补齐或坏mac的记录时,它会关闭链接,然后重新协商一个密钥。因此在TLS里,只能提交一个问询,尽管单个问询会泄露明文信息给攻击者,但是不会泄露整个明文分组 m[1]。
但是只要协议中有一些设定,可能就会产生问题。
攻击者通过每5分钟猜一次,一次还原一个字节。
防御。
始终检查mac,无论补齐是否有效。防止计时攻击。
教训。
例题。CTR不需要补齐。
SSH二元数据包协议。
问题在于,数据包长度域被解密了,然后直接被使用,以决定数据包的长度,这是在认证发生前。事实上,不可能认证数据包长度域的MAC,因为我们还没有还原整个数据包。所以我们还不能使用MAC。但是,SSH协议在验证MAC之前使用了数据包长度,引入了一个攻击。
攻击者有一个密文分组C,他想解密C,我们假定C加密后,得到的明文高32位是数字5。在这种情况下,攻击者会看到如下的事情,服务器会加密挑战分组C,会得到数字5,并把数字5当作长度域。那么现在攻击者会给服务器一次一个字节,在攻击者给服务器5个字节后,服务器说:我刚刚还原了整个数据包,让我检查MAC。但是MAC可能是错的。服务器会发送一个坏MAC的错误。那么攻击者就知道了分组的高32位等于数字5。那么,就知道了密文C解密后的高32位。
教训
文献推荐
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。