




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、密码学课程设计实验报告专业:信息安全班级:0903姓名:付晓帆学号:U 一、 DES 的编程实现1.实验目的 通过实际编程掌握DES的加、脱密及密钥生成过程,加深对DES算法的认识。2.实验原理a.加密过程DES是一个分组密码,使用长度为56比特的密钥加密长度为64比特的明文,获得长度为64比特的密文,其加密过程:(1) 给定一个明文X,通过一个固定的初始置换IP置换X的比特,获得X0,X0=IP(X)=L0R0,L0R0分别是X0的前32比特和后32比特。(2) 然后进行16轮完全相同的运算,有如下规则,其中0i17,K1, K2,K16都是密钥K的函数,长度均为48比特:其中函数f(A,J
2、)的A是一个长度为32的比特串,第二个变量J是一个长度为48的比特串,输出的是一个长度为32的比特串,其过程:a、将f的第一个变量A根据一个固定的扩展函数E扩展成为一个长度为48的比特串b、计算,并将所得结果分成8个长度为6的比特串,记为B=B1B2B3B4B5B6B7B8c、使用8个S盒,每个Si是一个固定的4X16阶矩阵,它的元素来自0到15这16个整数。给定一个长度为6的比特串,用首位两个比特作行号,用中间四个比特作为列号,则Sj(Bj)的取值就是Sj的行号列号的整数所对应的二进制表示。记Cj=Sj(Bj),0j9,8个S盒为:S1: 14,4,13,1,2,15,11,8,3,10,6
3、,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,13,6,2,11,15,12,9,7,3,10,5,0, 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13, S2: 15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10, 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5, 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15, 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9, S3: 10,0,9
4、,14,6,3,15,5,1,13,12,7,11,4,2,8, 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1, 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7, 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12, S4: 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15, 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9, 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4, 3,15,0,6,10,1,13,8,9,4,5,11,1
5、2,7,2,14, S5:2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9, 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6, 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14, 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3, S6: 12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11, 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8, 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6, 4,3,2,12,9
6、,5,15,10,11,14,1,7,6,0,8,13, S7: 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1, 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6, 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2, 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12, S8: 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7, 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2, 7,11,4,1,9,12,14,2,0,6,10,13,
7、15,3,5,8, 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11, d、将长度为32的比特串C=C1 C2 C3 C4 C5 C6 C7 C8通过一个固定的置换P置换,将所得结果P(C)记为f(A,J)。(3) 对比特串R16 L16应用初始置换IP的逆置换IP-1,获得密文Y,即Y=IP-1(R16 L16)。b子密钥生成过程密钥方案计算:每一轮都是用不同的、从初始密钥或称种子密钥K导出的48比特密钥Ki。K是一个长度为64的比特串,实际上除去校验比特只有56比特有效:(1) 给定一个64比特的密钥K,删掉8个校验比特并利用一个固定的置换PC-1置换K的剩下的5
8、6比特,记PC-1(K) = C0D0,这里C0D0是PC-1(K)的前28比特、后28比特。(2) 对每一个i,0i17,计算: 其中LSi表示一个或两个位置的左循环移位,当i=1,2,9,4,16时,一个位置,当i=3,4,5,6,7,8,10,11,12,13,14,15时,移动两个位置。PC-2是另一个固定置换。C. 解密过程与加密的过程相同,是加密的逆过程,区别在于加密输入明文输出密文而脱密输入密文输出明文,16个内部密钥加密的顺序和解密的顺序相反。d. 加密算法流程图(1) 加密算法输入64比特明文X,经过16轮变换,输出64比特密文Y (2) F函数Ri-1经过E扩展与K(i)异
9、或,通过S盒变换后进行P置换得到32比特的输出 (3) 子密钥生成过程种子密钥通过PC-1变换后,CiDi左移并经过PC-2变换得到Ki (4) 程序结构图输入字符设置密码加密是否解密输入密码密码正确解密密码错误程序结束是否重新输入密码3. 实验要求a. 输入一串有意义的汉字,显示密文和脱密结果;b. 设计用户窗口;c. 实验环境说明:操作系统、机型、语言。4. DES的实现a. 开发环境主机:Microsoft Windows XP Professional 版本2002 ServicePack3Intel(R) Core(TM)2 Duo CPU T6570 2.10GHz 2.09GHz
10、,1.99GB的内存物理地址扩展编程工具:Visual C+ 6.0 功能测试:如图所示:相关函数:void ByteToBit(bool *Out, const char *In, int bits);/字符转换成字节void BitToByte(char *Out,const bool *In,int bits)/字节转换成字符void RotateL(bool*In,int len,int loop)/循环左移void Xor(bool*InA,const bool*InB,int len)/异或void Transform(bool*Out,bool*In,const char*Tab
11、le,int len)/各个置换转换void S_func(bool Out32,const bool In48)/将48位转换成32位void F_func(bool In32,const bool Ki48)/F函数void SetKey(char key8)/生成子密钥void CDES:Encryption(char out8,char In8)/加密函数void CDES:Decryption(char out8,char In8)/解密函数二、 DES的弱密钥检测1、什么是DES弱密钥DES的解密过程,DES的解密过程和DES的加密过程完全类似,只不过将16圈的子密钥序列K1,K2
12、K16的顺序倒过来。即第一圈用第16个子密钥K16,第二圈用K15,其余类推。如果K16K1,K15K2,K9K8,则加密所用的子密钥与解密所用的子密钥相同,对一个明文X加密两次,得到的还是明文X。更强的,若K1K2K16,则加密过程与解密过程完全一样。弱密钥的定义也就是这样定义:若k使得加密函数与解密函数一致,则称k为弱密钥。DES至少有4个弱密钥,让我们先来看看子密钥的产生过程:64Bits的密钥K经PC-1之后,变为56Bits,然后分为高28Bits和低28Bits,分别进行移位。LSi是循环左移。PC-2是从56Bits中选出48Bits输出。若C0和D0为全0或全1,则经过移位后显
13、然不变,于是16个子密钥都相同。C0和D0是独立进行移位的,组合一下,就有4个弱密钥了。因此至少有4个弱密钥。(1)K1K160x0(2)K1K160xFFFFFFFFFFFF(3)K1K160xFFFFFF(4)K1K160xFFFFFF还可以注意到,第一组和第二组是互补的,第三组和第四组也是互补的。事实上,对于任意密钥k,我们还有以下关系成立:(DES的互补性)若yDes(k,X),则yBarDES(kBar,XBar)。(后缀Bar表示取补)2、检测方法检测16个内部密钥是否完全相同,若完全相同则判断为弱密钥,否则为正常密钥3、检测弱密钥实现在DES程序中加入一个弱密钥检测函数,通过检测
14、其16个内部密钥是否相同,来判断所输入的密钥是否为弱密钥。所加入函数如下:bool CheckKey(char* key)SetKey(key);char A6,B6;for(int i=1,j=16;i=1;i+,j-) BitToByte(B,SubKeyi,48); BitToByte(A,SubKeyj,48);/若16个子密钥完全相同,则为弱密钥if (memcmp(void*)A,(void*)B,6) ) return 1;else return 0;4、实验过程(1)输入密钥,程序显示为弱密钥。(2)输入密钥3e96GR4J,检测显示为非弱密钥。5、实验源代码#include#
15、include using namespace std;const static char IP64 =/初始置换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, 33, 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;cons
16、t static char EP156 =/密钥置换(原64位去掉奇偶校验位后)57, 49, 41, 33, 25, 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;const static char LOOP16 =/左移 1, 1, 2, 2, 2, 2, 2
17、, 2, 1, 2, 2, 2, 2, 2, 2, 1;const static char EP248 =/选择子密钥14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,23, 19, 12, 4, 26, 8,16, 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 char EC48 =/放大换位 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8,
18、9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1;const static char SBox8416 =/8个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
19、, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0 , 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 , / S2 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 , 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 , 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 , 13, 8, 10, 1, 3, 15, 4, 2, 1
20、1, 6, 7, 12, 0, 5, 14, 9 , / S3 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 , 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 , 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 , 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 , / S4 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11,
21、12, 4, 15 , 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 , 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4 , 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 , / S5 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 , 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6 , 4, 2, 1,
22、 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14 , 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 , / S6 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 , 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8 , 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 , 4, 3, 2, 12, 9, 5, 15, 10, 1
23、1, 14, 1, 7, 6, 0, 8, 13 , / S7 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 , 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6 , 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2 , 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 , / S8 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5,
24、 0, 12, 7 , 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2 , 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 , 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 ;const static char PP32 =/P盒置换16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26,5, 18, 31, 10, 2, 8, 24, 14,32, 27, 3, 9,19, 13, 3
25、0, 6,22, 11, 4, 25,;const static char LP64 =/末置换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,35, 3, 43, 11, 51, 19, 59, 27,34, 2, 42, 10, 50, 18, 58, 26,33, 1, 41, 9, 49, 17, 57, 25;static bool M
26、64, tmp32, *Li = &M0, *Ri = &M32;static bool SubKey1648;/16个子密钥class CDES/定义DES类 public: /void Mode();/模式 void Encryption(char out8,char In8);/加密函数 void Decryption(char out8,char In8);/解密函数;void ByteToBit(bool *Out, const char *In, int bits)/字符转换成字节 int i; for(i=0;i3(i&7) & 1; void BitToByte(char *O
27、ut,const bool *In,int bits)/字节转换成字符 int i; memset(Out,0,(bits+7)/8); for(i=0;i3 |= Ini(i&7); void RotateL(bool*In,int len,int loop)/循环左移 static bool tmp256; memcpy(tmp,In,loop); memcpy(In,In+loop,len-loop); memcpy(In+len-loop,tmp,loop); void Xor(bool*InA,const bool*InB,int len)/异或 int i; for(i=0;ile
28、n;i+) InAi=InBi; void Transform(bool*Out,bool*In,const char*Table,int len)/各个置换转换 int i; static bool tmp256; for(i=0;ilen;i+) tmpi=InTablei-1; memcpy(Out,tmp,len);void S_func(bool Out32,const bool In48)/将48位转换成32位 int j,m,n; /膨胀后的比特串分为8组,每组6比特。 for(j=0;j8;j+,In+=6,Out+=4) m = (In0*2)+In5; n = (In1*8
29、)+(In2*4)+(In3*2)+In4; ByteToBit(Out,&SBoxjmn,4); void F_func(bool In32,const bool Ki48) static bool MR48; Transform(MR,In,EC,48); Xor(MR, Ki, 48); /膨胀后的比特串分为8组,每组6比特。各组经过各自的S盒后,又变为4比特,合并后又成为32比特。 S_func(In, MR); /该32比特经过P变换后,输出的比特串才是32比特的f(Ri-1,Ki)。 Transform(In, In, PP, 32);void SetKey(char key8)/
30、生成子密钥 int i; static bool K64, *KL = &K0, *KR = &K28; ByteToBit(K,key,64); /转换为二进制 Transform(K,K,EP1,56); /64比特的密钥K,经过EP1后,生成56比特的串。 /生成16个子密钥 for(i=0;i16;i+) /循环左移,合并 RotateL(KL,28,LOOPi); RotateL(KR,28,LOOPi); Transform(SubKeyi,K,EP2,48); bool CheckKey(char* key)SetKey(key);char A6,B6;for(int i=1,j
31、=16;i=1;i+,j-) BitToByte(B,SubKeyi,48); BitToByte(A,SubKeyj,48);/若16个子密钥完全相同,则为弱密钥if (memcmp(void*)A,(void*)B,6) ) return 1;else return 0;void CDES:Encryption(char out8,char In8)/加密函数 ByteToBit(M,In,64); /转换为二进制 Transform(M,M,IP,64); for(int i=0;i=0;i-) memcpy(tmp,Li,32); F_func(Li,SubKeyi); Xor(Li,
32、Ri,32); memcpy(Ri,tmp,32); Transform(M, M, LP, 64); BitToByte(out, M, 64); / return(out);void main() int c; char key10;char str128;char str1128;coutstr;coutkey; c=CheckKey(key);if(c) printf(非弱密钥n);else printf(弱密钥n);SetKey(key);memset(str1,0,sizeof(str1);CDES des;des.Encryption(str1,str);cout密文:str1e
33、ndl;coutn;if(n=1)while(1)coutsec;if(strcmp(sec,key)=0)memset(str,0,sizeof(str); des.Decryption(str,str1); cout解密后明文:strendl;break; elsecout密码错误!endl;elsecout过程结束!endl;三、RSA的快速实现一、实验原理1、选取长度相等的两个大素数p 和q,计算其乘积:n = pq然后随机选取加密密钥e,使e 和(p1)(q1)互素。最后用欧几里德扩展算法计算解密密钥d,以满足ed = 1(mod(p1) ( q1)即d = e1 mod(p1)(q1)e 和n 是公钥,d 是私钥2、加密公式如下:ci = mie(mod n)3、解密时,取每一密文分组ci 并计算:mi = cid(mod n)Cid =(mie)d = mi(ed) = mik(p1)(q1)+1 = mi mik(p1)(q1) = mi *1 = mi4、消息也可以用d 加密用e 解密二、实验目的通过RSA加密算法的实现,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度企事业单位班车租赁合同
- 2025版建筑施工现场安全评价合同
- 二零二五年文化旅游部分股份投资与品牌合作合同
- 二零二五年智能报警系统设计、安装、维护一体化合同
- 二零二五年度预制装配式建筑标砖购销协议
- 2025版残障人士就业安置与保障合作协议
- 二零二五年度企业员工试用期权益保障及解除劳动合同协议
- 2025版办公室装修工程设计与施工环境风险评估合同
- 2025版办公室装修合同(含健康环保材料应用)
- 2025版殡葬服务及殡仪馆智能化改造合同
- 2025年安徽交控集团所属安徽交控建设工程集团第二批招聘10人笔试参考题库附带答案详解版
- 体育场馆运行管理办法
- 学前资助实施管理办法
- 2025安全生产月如何查找身边安全隐患宣讲课件
- 疳症中医护理常规
- 2025年6月14日江苏省纪委监委比选笔试真题及解析(巡视监督岗)
- 4输变电工程施工质量验收统一表式(电缆工程电气专业)-2024年版
- 2024年中国远洋海运集团专项招聘真题
- 海宁辅警笔试题目及答案
- GB/T 45519-2025纺织品纤维定量分析显微镜智能识别法
- 飞防免责协议书
评论
0/150
提交评论