




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、密码学课程设计实验报告设计题目: 1、DES的编程实现 2、DES的短块处理 3、DES的三圈差分攻击学生姓名:学生学号:班 级: 指导老师: 时间:2012年2月25日目 录DES背景介绍:3实验整体说明:3实验基础:3一、DES的编程实现3一、实验目的3二、 实验原理31、 加密过程32、 解密过程43、 密钥生成过程54、 弱密钥的检测5三、 实验要求5四、 编程实现61、 实验环境说明62、 数据结构63、核心函数介绍65、遇到的问题及解决办法7二、 DES的短块处理8一、 实验目的8二、 实验原理8三、 实验要求8四、 编程实现81、实验环境说明82、核心函数8三、DES的三圈差分攻
2、击10一、实验目的10二、实验原理101、差分攻击的基础102、差分攻击10三、 实验要求13四、 编程实现131、 实验环境说明133、 数据结构134、核心函数介绍13五、 遇到的问题及解决方法14实验成果整体说明:141、实验环境说明142、 文件介绍143、实验结果15实验特点与不足:20实验心得:21参考资料:21附录22DES背景介绍:数据加密标准(DES,Data Encryption Standard)是一种使用密钥加密的块密码,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。DES 使用一个 56 位的密钥以及附加的 8 位奇
3、偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。这个算法因为包含一些机密设计元素,相对短的密钥长度以及被怀疑内含美国国家安全局(NSA)的后门而在开始时是有争议的,因此DES因此受到了强烈的学院派式的审查,并以此推动了现代的块密码及其密码分析的发展。实验整体说明:由于三个实验题目都是关于DES的问题,故我将三个实验代码合
4、写在了一个.h文件中,在一个MFC工程文件中展示出来,故首先分析三个实验的基本原理、基本知识,再在最后统一介绍编程实现。实验基础:一、DES的编程实现一、实验目的1、通过实际编程,使学生进一步熟悉密码算法以及算法安全性的基本概念和原理。2、培养学生将密码理论和技术应用于实际的能力,使学生具备实施数据加、脱密和基本的密码分析能力。3、掌握DES的加密、脱密和密钥生成过程,加深对DES算法的认识。2、 实验原理1、 加密过程DES是一个分组密码,使用长度为56比特的密钥加密长度为64比特的明文,获得长度为64比特的密文,其加密过程,如图1。(1) 给定一个明文X,通过一个固定的初始置换IP置换X的
5、比特,获得X0,X0=IP(X)=L0R0,L0R0分别是X0的前32比特和后32比特。(2) 然后进行16轮完全相同的运算,有如下规则,其中0<i<17,K1, K2,K16都是密钥K的函数,长度均为48比特:,其中函数f(A,J)的A是一个长度为32的比特串,第二个变量J是一个长度为48的比特串,输出的是一个长度为32的比特串,其过程:如图2。a、将f的第一个变量A根据一个固定的扩展函数E扩展成为一个长度为48的比特串。b、计算 ,并将所得结果分成8个度为6的比特串,记为B=B1B2B3B4B5B6B7B8c、使用8个S盒,每个Si是一个固定的4x16阶矩阵,它的元素来自0到1
6、5这16个整数。给定一个长度为6的比特串,用首位两个比特作行号,用中间四个比特作为列号,则Sj(Bj)的取值就是Sj的行号列号的整数所对应的二进制表示。记Cj=Sj(Bj),0<j<9。d、将长度为32的比特串C=C1C2C3C4C5C6C7C8通过一个固定的置换P置换,将所得结果P(C)记为f(A,J)。(3) 将比特串L16,R16交换位置得到L16'与R16',应用初始置换IP的逆置换IP-1,获得密文Y,即Y=IP-1(L16'R16')。2、 解密过程解密过程原理如下:参考图1,解密过程即是由Y得到X的过程,Y=IP-1(L16'R
7、16'),则由逆矩阵定义知IP(Y)=IP(IP-1(L16'R16')=L16'R16'=R16L16。已知:,故求得:以此可得L0,R0,由X0=IP(X)=L0R0,故X=IP-1(L0R0)。因此解密过程如图3。可以发现,解密过程和加密过程算法完全一样,只是所用的密钥与加密过程顺序相反而已。这也体现了作为分组密码中的对称密码的DES特点:加密和解密密钥相同。由此可以看出对于f函数不需要求其有可逆性,即说明了DES是Feistel密码。3、 密钥生成过程密钥方案计算:每一轮都是用不同的、从初始密钥或称种子密钥K导出的48比特密钥Ki。K是一个长度为
8、64的比特串,实际上除去校验比特只有56比特有效:(1)给定一个64比特的密钥K,利用一个固定的置换PC-1,删掉8个校验比特,置换K的剩下的56比特,记PC-1(K) = C0D0,这里C0D0是PC-1(K)的前28比特、后28比特。(2)对每一个i,0<i<17,计算:其中LSi表示一个或两个位置的左循环移位,当i=1,2,9,4,16时,一个位置,当i=3,4,5,6,7,8,10,11,12,13,14,15时,移动两个位置。PC-2是另一个固定置换。其过程如图4。4、 弱密钥的检测DES的弱密钥是指加密所用密钥与解密所用子密钥相同,即K1=K16,K2=K15,.,K9
9、=K8,即对一个明文加密2次,得到的还是明文。更强的,若K1=K2=.=K16,则加密与解密过程完全一样。因此可以直接通过对生成的密钥作检测即可除去弱密钥。3、 实验要求1、 输入一串有意义的明文的汉字,显示密文和脱密结果。2、 设计用户窗口。3、 有实验环境说明,包括操作系统类型,机型,语言。对实验要求的分析如下:1、 能够输入输出汉字,故实验环境的版本要支持汉字,可以选用codeblocks、vc等集成开发环境。2、 要求有用户窗口,故可以采用MFC编程这一简单封装度高的编程方式。4、 编程实现1、 实验环境说明系统类型:Microsoft Windows 7 旗舰版机型:AMD Athl
10、on(tm) 64 Dual-Core M300 2.00GHz 32位操作系统安装内存(RAM):2.00GB集成开发环境:microsoft visual c+ 6.0语言:功能函数用C语言编写。 用户界面用MFC编程实现。2、 数据结构1、各个功能函数实现时都是用的int型数组存放结果的,即int型数组中成员值为1或者0。但与用户交互的是字符形式,因此要编写一些转换类型的函数。(具体见下一项核心函数介绍)。2、存放子密钥的是int型的16x48的二维数组,存放16个48位的密钥。由于加解密都需要用到,我将该数组定义为了全局变量。3、各种置换表比如IP,IP-1,PC1,PC2,E,P等,
11、我是按照书上的数据输入的,因为很多地方用到,我将其定义为了static const int型数组。3、 另外,定义了几个宏,如右图,方便以后更改数据。3、核心函数介绍一、数据转换类的:若转换成功,返回0,否则返回1。1、 void change(char a,int p,int k);将长度为k的字符串a转换为长度为8k的int型数组p。如char a=32,转换为int 型数组:00100000。2、 int change1(char a,int p,int k);将长度为8k的int型数组p转换为长度为k个的字符串a。如int型00100000转换为char a=32。3、 int cha
12、nge2(char a,int p,int k);将长度为k的int型数组p转换为对应字符串a,如int型00100000转换为“00100000”。4、 int change3(char a,int p,int k);将长度为k的int型数组p转换为对应字符串a,如char *型“00100000”转换为int 型00100000。二、功能函数实现1、int create_key(int pN1,int b56N2,int t);由int型的64位数组产生56位有用的密钥(除去8位校验码),从而产生t轮子密钥,(之所以有t轮,而不是直接为16轮子密钥,是考虑后面的三圈差分攻击,在该实验中,调
13、用时,置t=16)。若为弱密钥则返回2,若成功返回0。2、void f(int f,int rN5,int k);f函数的编程实现,输入为32位int型数组r与48位数组密钥k得到结果为32位的int型f数组。3、int encrypt(int eN1,int pN1,int kN3N4,int flag,int t);加密过程和解密过程,若为加密,则flag=0;若为解密,则flag=1,输入为64位的int型数组p,处理结果存放在64位int型数组e中,密钥为16x48的二维int型数组。t代表轮数,主要考虑后面的差分攻击,在该实验中,t=16。若加解密成功返回0,否则返回1.具体函数实现
14、见工程文件源代码crack.h。5、遇到的问题及解决办法1、有些字符加密后变成了0,显示不出密文,不能正确解密。涉及到字符就比较难处理,我开始为简单起见,密文没有用二进制的形式输出,但是很多情况下,我发现明文在加密后变成了0这对于字符的输出就是“硬伤了”。解决办法:采用二进制形式输出密文,就是增加了change2和change3两个函数,所以即使加密后变成了0,由于是二进制表示的,转换为二进制后表示为01串,就没有问题了,很多时候都可以正确地加解密。还要特别注意一点就是字符数组的长度问题,要考虑到字符串结束符0的存在,我为此吃了不少苦头,经常数组空间溢出。2、 开始不能正确解密,调试程序发现没
15、有错误,后来,才发现是自己原理弄错了,因为算法最后进行IP逆置换之前忘记进行交换L与R的操作,经检查,终于发现了错误。3、 初始学习MFC编程,不知道怎么将结果显示在编辑框中,后来通过网上查询资料,发现了有类向导可以关联变量,又学习了几个关联变量的函数,所以就很容易将算法与界面有效的联系在一起了。2、 DES的短块处理1、 实验目的1、 在实际应用中,明文不一定为64bit的倍数,该实验就是要处理当明文不是64bit倍数时的加密明文的情况。2、 在不增加明文长度的情况下加密明文,明密文的长度相同。2、 实验原理因为用户输入的明文不一定是64bit即不一定是8字节(英文字母为一个字节,汉字为两个
16、字节)。而DES的处理单位为64bit,若要加密任意明文,需处理剩余的“短块”。加密为图5所示,解密为图6所示:E(4)L代表是密文的左部分,E(4)R代表是密文的右部分。1、 加密:对于临近“短块”的64bit明文,在加密后右边的密文和短块组合成64bit再加密,因此临近“短块”的明文的右边部分被加密两次。2、 解密:解密过程为加密过程的逆过程,开始将有“短块”的密文先解密,再解密其他64bit明文。3、 实验要求在不增加明密文长度的情况下处理明密文不是64bit的情况的加解密操作。4、 编程实现1、实验环境说明系统类型:Microsoft Windows 7 旗舰版机型:AMD Athlo
17、n(tm) 64 Dual-Core M300 2.00GHz 32位操作系统安装内存(RAM):2.00GB集成开发环境:microsoft visual c+ 6.0语言:功能函数用C语言编写。 用户界面用MFC编程实现。2、核心函数在实验一的基础上添加对短块的处理函数:1、 int DES1(char *e,char *p,char *k,int n);用密钥字符串k,加密n字节的字符串p,结果存在字符串e中。若加密处理成功返回0,若有弱密钥,返回2,其他失败原因,返回1。其代码如下:int DES1(char *e,char *p,char *k,int n)/*n字节的加密*/ in
18、t a,b,i0N1,i1N1,k0N1,knN2,i,j,p18*MAXLEN; a=n/8; b=n%8; change(k,k0,8); if(create_key(k0,kn,16)=2)/*产生16轮的密钥*/return 2; for(i=0; i<a; +i) change(p+8*i),i0,8); encrypt(i1,i0,key,0,16);/*进行16轮的加密*/ for(j=0; j<N1; +j) p164*i+j=i1j; if(b!=0) /*若有短块,则处理*/ change(p+n-b),i0,b); for(j=0; j<b*8; +j)
19、 p164*a+j=i0j; for(j=0; j<N1; +j) i0j=p18*n-N1+j; encrypt(i1,i0,key,0,16); for(j=0; j<N1; +j) p18*n-N1+j=i1j; if(change2(e,p1,n*8)=1) return 1; return 0;2、 int DES2(char *d,char *e,char *k,int n);用密钥字符串k,解密n字节的字符串e,结果存在字符串d中。若解密处理成功返回0,若有弱密钥,返回2,其他失败原因,返回1。其代码与DES1类似,详见源代码crack.h文件。三、DES的三圈差分攻
20、击一、实验目的1、让学生深入了解DES差分攻击的基本原理,了解DES三圈差分攻击的过程和实现。2、培养学生将密码理论和技术应用于实际的能力,使学生具备基本的密码分析能力和实际编程能力。3、培养学生自主完成学习任务,在实践中发现问题和解决问题的能力。4、培养学生自主思考和合作能力。二、实验原理1、差分攻击的基础上面的实验一加密原理中简略但全面地介绍了加密过程,可以看到其中主要起作用的算法有:矩阵置换、扩展、左移、异或、左右互换、s盒作用 。其中对攻击者来说最麻烦的要说s盒一步,破解DES体系关键在s盒。乍一看六位输入与四位输出貌似没什么关系。但事实上,对于同一个s盒具有相同输入异或的所有输入六比
21、特组的输出四比特异或值有一定规律。具体些说,对于输入异或相同的明文对B,B*仅有32组,(本来是2的6次方64种可能,但因为对称性,所以只有32组),而这32组输出异或却并不是均匀分布,而是仅分布在很少的几个四比特值中;也可以说具有相同输入异或且输出四比特异或也相同的六比特输入数量不多且分布不均匀。正是这种输入输出输出异或间的不均匀性可以被攻击者利用并破解密钥。真正的子密钥必定每次都与其他密钥异或后获得对应输出。此方法对可选择明文攻击尤为有效。2、差分攻击1、设3轮DES加密中,R2 经E扩展后为E1E 2E 3E 4E 5E 6E 7E 8,第3轮子密钥为J=J1J 2J 3J4E 5J6J
22、 7J8。2、L0R0和L0*R0*是两对明文,且选择明文使得R0=R0*,对应得密文分别为L3R3和L3*R3*。则根据计算可得又f(R2,K3)=P(C), f(R2*,K3)=P(C*),其中C、C*分别为S盒的两个输出。因为是R0=R0*的明文对,则有P(C)P(C*)=(R3R3*)(L0L0*),故可得C=CC*=P-1(R3'L0),这是第3轮DES的S盒输出异或。另外由于R2= L3, R2*= L3*,则由扩展函数E计算得E(L3)和E(L3*)进而得到E,也即S盒输入异或。这里的E就是S盒的差分输入,C就是S盒的差分输出,通过这两个就可以得到第三轮加密时使用的子密钥
23、。3、3轮DES的第三轮,已知E(R2),E(R2*)和CC*,则可构造testj,0<j<9, 使testj包含Jj。testj中其实是对每一个S盒的输入和输出进行比较。首先遍历所有的可能的6位比特串,从000000(0)到111111(63),每次遍历都要取出两个比特串,然后判断这两个串是否满足如下条件:第一:这两个串异或结果是否等于Ei(这里E已经分为8组6位);第二:这两个串分别进行S盒变换,对其结果进行异或看是否等于Si(这里的S已经分为8组4位)如果满足则将这两个6位比特串(记为A、B)分别和Ei异或得到的六比特就是K的可能值,放入集合中。注:,故取Ei为E(R2)或者
24、E(R2*)的对应的6bit都没影响,但是要统一。 4、对每个S盒都进行这样的遍历之后便可得到八个集合,暂且定义为T1T8,每个集合中的6位比特串需要变为十进制,然后找到对应的J矩阵(8*64的矩阵),将其对应位加1。(举个例子来说比如集合T1中有000000,000111,101000,101111,那么就需要对J1中的第0,7,40,47处的元素进行加1,其他的依次类推,开始时J矩阵初始化为0。)5、因为有三个明文对,因此循环三次之后得到J矩阵。对三个J矩阵对应位相加后便可得到最后的结果矩阵J(8*64矩阵)。这里需要说明的是因为是经过了3轮DES加密,因此J矩阵中的元素等于3的元素位置便
25、是密钥比特。(对应的位置是十进制,需要变为6位二进制,设为Ji6.此时便可得到第三轮加密时的密钥即第三个子密钥subkey3=J0J1 J2J3 J4J5 J6J7,这是一个48位的串),如果是k对,则找J矩阵中的元素等于k的元素位置。我们遍历的063的6bit就相当于就是在找子密钥,真正的子密钥能够满足每次都能够与其他的6bit数据异或(这是f函数的过程),获得对应输出,所以真正的子密钥能够每次都符合条件,即对应频率为k。说明:一般35组明密文对可以找到密钥,我就是采用通过不超过5对明密文对来攻击的方式,即允许用户输入2、3、4、5对明密文对,由于有时候同一S盒中J矩阵有多个位置是具有相同的
26、最高频率,此时必须通过额外遍历相应位置待确定的密钥才能攻击,这样说明输入的明密文对不足以确定48bit的子密钥,就会提示用户重新输入明密文对。6、 知道第三轮的子密钥后,因此对其进行逆运算最后便可得到初始密钥,不过这里的初始密钥中并没有得到初始时去掉的8个校验位,和已经在PC-2置换中去掉的8个比特位,所以得到的初始密钥中有16位是未知的,不过会对加密结果造成影响的只有8位,即通过PC-2去掉的那8位,8个未知的比特数可以通过搜索28=256种可能的情况来确定。密钥需满足的条件:所有明文在密钥加密后是相应密文。到此也就完成了差分分析了。现举实例说明差分分析步骤:1、 现有3对明密文对:组数明文
27、对密文对(1)748502cd38451097387475643845109703c70306d8a09f1078560a0960e6d4cb(2)486911026acdff31375bd31f6acdff3145fa285be5adc730134f7915ac253457(3)357418da013fec86d8a31b2f28bbc5cf0f317ac2b23cb9442、 通过对L3,L3*做E扩展,获得第三轮S盒的输入3、 获得S盒的输入和输出异或:4、 通过对每个S盒的063的遍历,获得J矩阵:分别是47、5、19、0、24、7、7、49位为3,其他位低于3。5、 将上面的数字转换
28、为6bit的01串,获得第三轮的48bit密钥:6、 通过遍历0255,将被PC2虑去的8位找到,使其满足加密明文获得的密文与输入的密文一致,获得第三轮未经PC2置换的56bit密钥:7、 将剩余8位填0,获得初始的64bit密钥。1a624c88520cec46。8、 攻击成功结束。3、 实验要求1、输入合适满足条件的明密文对,得到56位的有用密钥比特,和一个完整的64bit密钥。2、设计用户窗口。3、有实验环境说明,包括操作系统类型,机型,语言。4、 编程实现1、 实验环境说明与上面两个实验相同3、 数据结构在实验三中,与用户交互的是16进制数据,明密文对为严格的16位16进制数,因此不用
29、考虑短块处理等细节,在函数内部处理时仍然采用int型的数组存放结果,其成员只为0或1。在实验一二的基础上增加了如下数据结构:1、 明密文对最多五对,故用5*17的char型二维数组存放与用户交互的数据,和5*64的int型数组存放中间的结果。2、 8x64的二维数组J,存放testj矩阵的结果。3、 为方便进行16进制的转换,增添了两个转换函数:static const char H1617= "0123456789abcdef"static const int H164= 0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1, 0,1,0,0,0,1,0,1,0
30、,1,1,0,0,1,1,1, 1,0,0,0,1,0,0,1,1,0,1,0,1,0,1,1, 1,1,0,0,1,1,0,1,1,1,1,0,1,1,1,1;4、核心函数介绍在实验一二的基础上增加了如下一些函数:一、数据转换类的:若转换成功,返回0,否则返回1。1、int changeb(char a,int p,int k);将长度为k个的字符串转换为长度为8k的int型数组。但是与实验一的change函数的惟一区别在于,每字节8位是颠倒的,如char a=32,转换为int 型数组:00000100。这是为了方便后面产生随机的E',C'。2、int changeH(ch
31、ar *a,int p,int k);将16进制的字符串转换成int型的0,1数组。3、int changes(char a,int p,int k);将int型的01数组转换成16进制字符串。二、功能函数实现1、int check(int a0N1,int a1N1,int kN3N4);检验用密钥k加密的密文a0是否是a1。若是,返回0,否则,返回1。2、void Jame(int a0N1,int b0N1,int a1N1,int b1N1);由一对明对(a0,b0)、相应的密文对(a1,b1),引起的J矩阵的变化。3、int key_crack(char ki,char b5,int
32、 ti);全局变量的ti对明密文对通过差分攻击得到的56bit的有用密钥(b5(16进制)和64bit密钥(ki(16进制)。若攻击成功返回0,否则返回1。4、void randH(char a);随机产生16位16进字符放在数组a中。5、int createplain(char e,char b14);为保攻击的成功率,随机产生5对明密文对。若成功返回0,否则返回1。注:4、5仅为了验证该差分攻击的正确性,让用户输入密钥,系统随机产生5对明密文对。用户可以再通过差分攻击,得到密钥,对比密钥是否正确。3、 界面函数与实验一二相同。5、 遇到的问题及解决方法1、 为将三个实验做成一个.h文件,故
33、我在前面的实验一、二的部分功能函数基础上(比如encryp()、creat-key()等函数)以增加参数的方式,扩展了函数功能,使能被实验三利用,重用了代码。2、 利用差分攻击,对于每个S盒,最大频率的计数器(J矩阵的最高数字所在的位置)可能不止有一个,无法确定具体的子密钥。对于这个问题,大概是每个同学都遇到的,这是因为信息不足,有些S盒的输入偏差比较分散,不够集中,导致经过固定对数的明密文后还是不能完全确定具体的子密钥,这时的解决办法只有增加输入的明密文对数了。实验成果整体说明:1、实验环境说明系统类型:Microsoft Windows 7 旗舰版机型:AMD Athlon(tm) 64
34、Dual-Core M300 2.00GHz 32位操作系统安装内存(RAM):2.00GB集成开发环境:microsoft visual c+ 6.0语言:功能函数用C语言编写。 用户界面用MFC编程实现。2、 文件介绍1、 我将三个实验的功能函数写在了一起,命名为crack.h函数,在codeblocks中编译运行测试成功,说明功能实现成功。2、 在mirocsoft visual 6.0+中创建基于对话框的MFC工程,命名为DES。3、 将crack.h拷贝到该MFC工程目录中,并在MFC工程文件中增添:include "crack.h"文件。4、编写、画MFC文件的
35、各控件,实现界面和功能的统一。界面编辑用到的函数:1、UpdateData();/TRUE刷新控件的值到对应的变量,FALSE拷贝变量值到控件显示2、kei=m_key.GetAt(i);获取m_key所关联的编辑框的字符赋给ke字符数组。3、m_dplain.Format("%s",c);将字符数组c的数据以字符串形式赋给m_dplain。4、n1=m_cipher.GetLength();获取字符串长度。5、SetDlgItemText(IDC_EDIT12,time1);将字符串显示在编辑框内。3、实验结果一、整体界面介绍实验一、二、三被融合在了一个界面中,在整个界面
36、(如图9)左边为加解密部分,右边为差分攻击部分。界面下有两个按钮关于制作者信息(如图8),和退出界面,两按钮中间是编辑框,显示执行当前操作的时间。二、加解密部分:1、编辑框的输入输出说明密钥、明文的输入为汉字、英文字符、数字、标点符号、或者空格,汉字占2个字节,英文字母和数字占1个字节。密文输入为二进制数字,即01串。密钥长度为恒定的8字节。若不为8字节,则会出现错误提示;若为弱密钥,则会提示出错信息,如图10。明文长度不低于8字节,否则,会出现错误提示,如图11。密文01串,至于为什么不用乱码显示,而用二进制显示,前面实验一的编程实现中提到了原因,该串长度不低于64位,否则出现错误提示,如图
37、12。2、 操作说明加密:在输入密钥、明文后,单击“加密”按钮,若操作成功,则会提示“加密成功”,密文则在密文框内显示,否则,提示失败原因。同时时间框显示操作执行的时间。解密:将密文、密钥输入,单击“解密”按钮,若操作成功,则会提示“解密成功”,脱密文在脱密文框内显示,否则,提示失败原因。同时时间框显示操作执行的时间。(在仅仅只是为了验证算法正确性时就没必要重新输入了,因为在上面加密操作的基础上,密文和密钥都在框内,直接单击“解密”按钮即可)。3、 实验结果:输入一段有意义的明文,该明文中有空格、空格、数字、汉字、标点符号,经8字节(64bit)密钥加密后得到了一段密文。将得到的密文经过原密钥
38、脱密,得到了脱密文,经过对比,可以知道,脱密文与明文一模一样,如图13。因此实验成功!三、差分攻击1、 模块说明该实验分为:明密文对的输入,经过攻击密钥的显示,经过加密核对密钥的正确性,随机产生明密文对(该模块可选)。对于随机产生明密文对的模块:只是为了验证算法的正确性时,可以输入一个密钥,然后随机产生明密文对,通过攻击,得到攻击得到的密钥,通过对比,可以验证算法的正确性。2、编辑框的输入输出说明明文、密文、密钥都是用16进制的字符表示的。密钥长度为16位的16进制数,下方的只读编辑框显示的是该密钥经过PC1置换后的剩余56bit密钥情况。明文长度为16x2xk的k对16进制明文,顺序为AA&
39、#39;BB'CC'.(k=3,4,5)密文长度为16x2xk的k对16进制密文,顺序为E(A)E(A')E(B)E(B')E(C)E(C').3、操作说明操作使用时间都在下方的“耗时”编辑框内显示。输入明密文对:可以是自己手动输入,或者系统根据用户在可选模块里输入的密钥随机产生明密文对。攻击:在第一步后单击“攻击”按钮,若攻击成功,攻击所得密钥将会在编辑框中显示,其中上面的为得到的64bit,下面的为经过PC1置换的56bit,真正在加解密过程中起作用的是下面的56bit。若攻击失败,则可能是由于信息不足(在同一个S盒中有多个位置有最高频率,因此无法确
40、定具体的密钥,如图14),可能是由于密文和明文不是经过同一密钥加密得到的,所以不能得到密钥,如图14。加密核对:单击“加密”按钮,明文对在攻击所得的密钥的加密下获得另一份密文对,显示在“用攻击所得密钥加密结果”框内,单击“核对”按钮,可以弹出对话框,显示这一份加密的密文对与用户输入的是否相同,若相同,则显示攻击成功,否则,攻击失败,如图14。4、 实验结果:输入明密文对为:组数明文对密文对(1)748502cd38451097387475643845109703c70306d8a09f1078560a0960e6d4cb(2)486911026acdff31375bd31f6acdff3145
41、fa285be5adc730134f7915ac253457(3)357418da013fec86d8a31b2f28bbc5cf0f317ac2b23cb944密钥1a624c89520dec46经过单击“加密”得到用攻击所得密钥加密的密文,我们可以看到得到的密文与输入的密文是相同,如图15,单击“核对”,弹出对话框,显示“攻击成功!”如图16。5、在差分攻击中方便理解整个算法过程,我有一块可选项随机产生明密文:1、输入密钥1234567890abcdef2、 单击“根据密钥随机产生明密文对”按钮3、 可以看到界面出现了输入的密钥经PC1变换成56bit后的密钥(f0ccaa1a5c6e8f
42、)、明文对、密文对(为对应的5对)4、 单击“攻击”按钮,可以看到弹出了对话框“攻击成功”,显示出来攻击得到的64、56bit密钥。可以看到虽然64bit密钥有略微差异,但实际起作用的56bit密钥(f0ccaa1a5c6e8f)是相同的。5、 单击“加密”、“核对”按钮,可以看到攻击所得密钥与原密钥加密的密文相同,即攻击成功。实验特点与不足:1、 特点1、 完善的提示信息丰富的出错信息各种出错信息,操作的结果都会以对话框的形式展现给用户,对于失败操作都提示了原因,比如在加解密中因有字数限制或者存在弱密钥致使操作失败,会分别提示信息,见图1012;在差分攻击中,因为输入的必须是16进制数据、明
43、密文对不超过5对等限制,有可能明密文不对应、明密文不是用16进制表示的、明密文对数超过5对,明密文提供的信息不足以确定密钥等各种错误,所以有更加丰富的提示信息。界面友好的提示信息可以发现界面左上角会有一些注释,是提示用户基本的使用方法,比如进制、位数等,减少用户出错次数。2、 比较少的限制条件在加解密中对用户输入形式限制很少,空格、汉字、英文都不限制,这给用户带来了便捷。还可以加密多个段落。在差分攻击中,对明密文对数限制比较少,一般5对明密文就可以将密钥破译出来,合适的明密文3对即可,用户可以自己选择输入多少对明密文。3、 比较高的执行效率,系统有自动计算操作所需时间功能。由于DES本身就比较
44、简单,所以执行时间都比较短,没有出现过卡死情况。2、 不足在实验实现上,我自己想要实现的功能都基本上实现了,所以似乎没有什么可以称之为不足的。但是我在跟其他同学交流之后,发现自己是多么的狭隘,很多同学都不仅限于完成老师的任务了,他们挑着最难的DES分析和RSA的攻击做,我发现自己跟他们比,实在是太没追求了。实验心得:1、 这次实验我对DES弄得更加清楚了,在学习理论的的时候我一直没有弄懂什么叫做“加解密的算法相同,什么叫做对称密码”,通过在不断地深入了解DES,对这些知识有了很深切的体会。特别在差分分析中,虽然我自己觉得差分分析我弄懂了,但我还是我苦苦纠结了几天,因为差分分析的原理和步骤在网页
45、上都有很多,但是我一直想弄清楚为什么这样子做下去就得到了密钥了呢?最后不断地看原理、查书籍,终于理解了网页上所谓的j矩阵(实质也就是计数器),终于理解了子密钥来源于多对明密文对的差分分析的频率最高点,也只有子密钥才会让其计数器对应的频率最高,所以只有当一个S盒的频率最高值只有一个时,子密钥才出现,否则还需要继续通过明密文对筛选出真正的子密钥。2、 我自己感觉编程能力有了较大的提高,因为在整个实验中,每一个流程,每一个功能函数都是我自己编写的,虽然算法是参考的书籍,但是代码从头到尾都是我自己敲进去的,很多函数都是一个一个调试清楚了,再继续下一步,这也让我懂得了编程调试的方法。其中的调试之路,回想
46、起来真的让我很受用,为了一个“0”,我调试了1天,将密文由字符形式改成了二进制形式,我更加深刻地理解了字符串的特性;在差分攻击中,由于我有自己输入密钥,再产生明密文,再攻击的整体检验过程,所以我可以一直试验对各种密钥的攻击,但通过一直的试验发现了一个怪现象:对于某些密钥产生的明密文,总是攻击不成功,但对有些能攻击成功。这就让我无奈了,实在想不出差分攻击竟然跟密钥有关!难道是弱密钥?实在没有道理,后来我几乎想过,差分分析有概率性吧,有些是攻击不成功的,但后来还是不甘心,找了一个也是做DES的同学,我自己产生明密文,让她帮我用她的程序攻击,结果她可以攻击成功,这就让我确定了,确实还是我程序问题,可
47、是问题出现在哪呢?经过多次单步调试,发现了一个天大的弱智错误!在确定48bit数据后还要确定56bit数据的过程中,在确定这8位时,采用的方法是穷举法,可惜的是,我竟然穷举时错误地从063,本应该是0255的!3、 通过此次试验,我学会了利用网络资源,不是抄袭、拷贝别人的代码,而是学习别人的知识,比如原理、过程分析,当然也可以学习代码风格,这样方便规范自己,让自己的代码与别人更能沟通。参考资料:1、 密码学原理与实践(第三版)冯登国 译2、 windows编程循序渐进张静盛 编著3、 6%82%e8%bf%b0.html附录源代码:crack.h#include <stdio.h>
48、#include <stdlib.h>#include<string.h>#include<time.h>#define N1 64#define N2 56#define N3 16#define N4 48#define N5 32#define N6 28#define MAXLEN 1024/*加密的字符最大数*/int plain15N1,plain25N1,cipher15N1,cipher25N1;/*明密文对二进制表示存放的数组*/char plaintext1517,plaintext2517,ciphertext1517,cipherte
49、xt2517;/*明密文对字符串形式存放的数组*/int keyN3N4;/*存放各轮子密钥*/int J864;/*J矩阵,相当于子密钥的计数器*/static const char H1617= "0123456789abcdef"static const int IP1N1/*加解密时置换*/ = 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 3
50、3, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7;static const int IP2N1/*加密时逆置换*/ = 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 3
51、5, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25;static const int H164= 0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1, 0,1,0,0,0,1,0,1,0,1,1,0,0,1,1,1, 1,0,0,0,1,0,0,1,1,0,1,0,1,0,1,1, 1,1,0,0,1,1,0,1,1,1,1,0,1,1,1,1;static const int PC1N2/*密钥产生时PC1*/= 57, 49, 41, 33, 25,
52、17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4;static const int PC2N4/*密钥产生时pc2*/ = 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16
53、, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32;static const int leftshift16/*密钥产生时左移*/ = 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1;static const int S8416 /*f函数中的S盒*/= /* S1 */ 14, 4,13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024湖南潇湘科技技工学校工作人员招聘考试及答案
- 2024湖南建筑高级技工学校工作人员招聘考试及答案
- 星级家政服务人员雇佣合同
- 建筑设备租赁合同范本指南
- 股权转让合同保证金协议
- 企业合同管理效率提升与创新路径
- 网络打假安全课件
- 植物模拟习题(含答案)
- 核心条款集装箱货物运输合作协议
- 工程行业企业文化
- 中医推拿基础培训课件
- 防电信诈骗安全教案
- 产品履历表完
- 保健食品备案产品可用辅料及其使用规定
- 肺癌伴胸腔积液护理查房
- 健康管理中的健康教育与健康促进研究
- 2024年中考化学复习把握中考方向共研备考策略
- 新闻宣传“三审三校”审查表
- 电缆井施工方案
- 四川外国语大学《245法语》历年考研真题及详解
- 新西兰介绍课件
评论
0/150
提交评论