Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3009245
  • 博文数量: 167
  • 博客积分: 613
  • 博客等级: 中士
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-13 21:35
个人简介

人, 既无虎狼之爪牙,亦无狮象之力量,却能擒狼缚虎,驯狮猎象,无他,唯智慧耳。

文章分类
文章存档

2015年(19)

2014年(70)

2013年(54)

2012年(14)

2011年(10)

分类: 网络与安全

2014-04-01 14:27:12

     这几天在看一篇关于SSL安全性的论文,论文的题目是《Security Flaws Induced by CBC Padding Applications to SSL, IPSEC, WTLS...》 by Vaudenay。论文的主要方法针对目前SSL中使用的CBC机制进行了分析,找到了一种相对可行的攻击方法。下面简要地介绍一下其思想,当然里面也有自己没有看懂的地方,作为问题一并提出来吧!
     攻击基于SSL机制的两个前提:
1. 加密模型采用CBC形式,即对于分组密码来说,每个生成的密文块都与之前的每一个明文块有关系,如对于明文块:x1 x2 x3 ... xN,来说,CBC模式的算法如下:y1 = C (IV XOR x1);
yn = C (y(n-1) XOR xn), n = 1, 2, ...N,相应地解密方式只需要密文块中相邻的两个块:xn = C的逆置换(yn) XOR y(n-1);
2. SSL采用了这样一种机制,当接收方收到一个密文消息块时,会首先解密CBC模式,检查明文是否进行了正确的填充;分组密码为了保证每个块的长度一样,经常使用填充技术,对于CBC来说,填充的字节数正好等于每个填充字节的数值,如下图所示。当验证填充方式正确或失败时,会向发送方返回一个告知信息,这里将其作为“神谕”Oracle来表示:O;

     具体的攻击过程如下:
1. 针对某个密文块y,其长度为b个字节,构建一个随机数据块r,r = r1-r2-r3-...rb;
2. 如果O(r|y)=1, 则说明以r|y作为两个密文块,验证y的明文填充正确:1,22,333....;若O(r|y) =0则说明填充错误;
3. 对于O(r|y)=1来说,比较可能的是只有最后一个字节符合填充标准,比如1,那么我们可以得到C的逆置换(y)= rb XOR 1;
4. 我们可以遍历256种字节方式来找到使得O(r|y)=1的rb;
     论文给出的伪代码如下:

     前4个步骤找到了特殊的rb形式,使得O(r|y)=1成立;第5步主要处理如果恰巧正确填充的匹配不是一个字节的情况,比如结尾是22,333等,(a)|(b)可以联合确定尾部的填充模式有几个字节,但是为什么要进行XOR n自己就不是很明白了。这里为什么要与n进行异或呢?这里自己还得再好好想想。
     
通过上面的这一步,我们可以得到密文块y的取C逆置换后最后一个字节的内容,可以继续推广得到整个密文块的所有字节,方法类似:

     这里用到了和上一步非常类似的方法,自己上一步没看明白,这一步也只是明白了最终的结果和目的,中间为什么要进行一系列的异或运算的原因也没有想明白....得到一个密文块之后,可以应用到其余的密文块中,由于一个密文块的平均时间复杂度为(bW)/2,因此所有的N个块就是O(bWN);对于第一个块需要密钥相关的IV,这里采取的是穷搜的方式,如果某个块的变换结果同密文y1一致,则可以肯定对于相同的IV来说,明文也一致。
阅读(3214) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

jizhiwang2014-04-09 10:20:12

研究一下OpenSSL的heartbleed漏洞