des差分攻击
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
针对Des加密的差分攻击
题目要求
编写程序,实现N 轮(N=1 或2)DES 的差分攻击。如能攻击N=3
则更好
简述des加密原理
1.对于64位明文经过ip矩阵置换变为打乱顺序的明文进入加密轮中,这64位明文分为前后各32位,L i,R i ,此R i直接复制给下级轮的L i+1,然后R i经过E矩阵扩展为48位E i。
2.同时64位密钥经过pc-1矩阵置换后,去掉8位校验位变为56位密钥,分为前后各28位分别进行不同位数的循环左移,得到的左移后的密钥进行pc-2矩阵置换得到48位的密钥k i。
3.将得到的E i、k i进行异或计算(模二加法),得到的48位结果每六比特一组,分为八组进入八个s盒子。
4.在s盒中,六比特第一第六比特控制行数,第二三四五位控制列数计算得一个0-15的十进制数,转换为四位二进制数输出。这样八个s盒共得到32位结果。
5.s 盒输出结果与L i 异或,再经过另一P 置换得到R i+1。此L i+1、R i+1也就是一轮加密结果,如果继续进行加密可以按照上述方法重复进行。
6.最终得到的结果还要经过初始置换的逆置换作用,得到密文。
Des 解密
Des 解密算法和加密算法使用相同的算法过程,不同之处在于解密时要把子密钥使用的顺序和加密时相反。
Des 差分攻击的理论与实现
差分攻击理论依据:
上文中des 加密原理中简略但全面地介绍了加密过程,可以看到其中主要起作用的算法有:矩阵置换、扩展、左移、异或、左右互换、s 盒作用 。其中对攻击者来说最麻烦的要说s 盒一步,破解des 体系关键在s 盒。
乍一看六位输入与四位输出貌似没什么关系。但事实上,对于同一个s 盒具有相同输入异或的所有输入六比特组的输出四比特异或值有一定规律。
具体些说,对于输入异或相同的明文对B ,B*仅有32组,而这32组输出异或却并不是均匀分布,而是仅分布在很少的几个四比特值中;也可以说具有相同输入异或且输出四比特异或也相同的六比特输入数量不多且分布不均匀。正是这种输入输出输出异或间的不均匀性可以被攻击者利用并破解密钥。
此方法对可选择明文攻击尤为有效。
具体分析:
攻击时我们需要将要与子密钥异或运算的48位E i 和与其对应的s 盒32位输出 C i 。 在此笔者仅对一个s 盒进行讲解。E i 中取前六位E ,C i 中取前四位C 。
设s 盒的直接六位输入为B ,k i 的前六位为 K 。
则有B E K ⊕= 另取一组明密文对 E* ,C* 他们的异或 E ’ ,C ’
即: *B*E K ⊕= S(*)*B C = *'E E E ⊕= *'C C C ⊕=*'C C C ⊕=
则对应'***'E E E E K E K B B B =⊕=⊕⊕⊕=⊕=
又由上文理论分析中'B 与'C 的关系,有多组明密文对时可以破解出子密钥K 。
给出一组确定的E ,E*,C ,C* 则对应的B ’ C ’已知,可对输入B 用000000-111111遍历一遍,找到满足两组异或的明文对,并分别和E 异或得到的六比特就是K 的可能值。对此可设置一组计数器,对每一个可能的K 值在计数器上加一,多组明密文对下来则可以找到唯一最大数的准确K ,一般组数3组可以找到密钥,笔者在算法中设置了5组。
算法实现(1-3轮):
经过上述分析可知,若能选择性地得到与某轮和子密钥K 异或的E 并能得到该轮的输出C 则可以破解密钥。
对于一轮des ,R 0扩展后便得到E 加密的输出R 1,经过110()P R L -⊕得到C 。则利用上述方法可以破解密钥。
对于二轮des ,已知明文对00L R ,00**L R 并可得到对应的两组密文22L R ,22**L R 。 2R 可表示为2112012(,)(,)R L f R K R f R K =⊕=⊕
同理2112012**(*,)*(*,)R L f R K R f R K =⊕=⊕
则有2001212'*(*,)(,)R R R f R K f R K =⊕⊕⊕
若取00*R R =
则R2’可简化为
21212'(*,)(,)
R f R K f R K =⊕
2(*)()'P C P C R ⊕=
则12*(')C C P R -⊕= 至此我们得到了第二轮s 盒输出异或
注意到32L R =,则利用扩展函数作用L 3则可得到输入32()()E L E R =,和32(*)(*)E L E R = 33'(*)()E E L E L =⊕
则我们又得到了第二轮s 盒输入异或,K 2则可以破解。
对于三轮des 情况稍稍有些复杂,设明文00L R ,00**L R 为两对明文,对应三轮输出的密文33L R ,33**L R 。
3R 可表示为:322312300123(,)(,)(,)(,)R L f R K R f R K L f R K f R K =⊕=⊕=⊕⊕ 同理300123**(*,)(*,)R L f R K f R K =⊕⊕
则3001012323'33*'*(*,)(,)(,)(*,)R R R L f R K f R K f R K f R K =⊕=⊕⊕⊕⊕
现在为方便攻击运算,选择明文使00*R R =
则有0101(*,)(,)000f R K f R K ⊕= 0
∴此时有302323'33*'*(,)(*,)R R R L f R K f R K =⊕=⊕⊕
由于3'R ,0'L 可由已知计算得到 现考虑2323(,)(*,)f R K f R K ⊕
又23(,)()f R K P C =,23(*,)(*)f R K P C =
∴30(*)()''P C P C R L ⊕=⊕ 由于P 置换已知
故1
30*('')'C C P R L C -⊕=⊕=
即至此我们已经在理论上能得到明文对的输出异或
另外,由于23R L =,23**R L =
因此使用扩展函数可轻易地得到,*E E 即3()E E L =,3*(*)E E L =
即我们又得到了与密文对应的两组E ,则按照上文所述可以破解子密钥。
获得完整密钥
然而此时我们若破解成功也仅得到了48位子密钥,原本使用的密钥却是56位。
剩下的8位我们可以进行穷举攻击,因为82256=,最多遍历256种可能密钥对计算机来说相当容易。
当然我们也可以推导出别的轮的输入输出异或表达式再次进行攻击,反置换后扩充原来的8位空缺得到完整的密钥,不过显然很费精力了…… 代码概况与输出结果
按照上文所述,其实在攻击中只要找到某轮输入输出异或即可破解,并且上文也分析了1、2、3轮攻击时最后一轮结果获取方法。
如此说来本质上1、2、3轮des 其实是一样的,所以笔者在自己的1轮攻击下稍作改动又增加了2、3轮攻击,不过代码并不完整,每轮加密没有写成函数,攻击也只到获取48位子密钥为止没有继续寻找剩下八位,不过都是细枝末节,对理解des 意义不大,笔者便没有花时间去编……