关于C语言的DES加密算法实现.doc

上传人:scccc 文档编号:14387279 上传时间:2022-02-05 格式:DOC 页数:12 大小:51KB
返回 下载 相关 举报
关于C语言的DES加密算法实现.doc_第1页
第1页 / 共12页
关于C语言的DES加密算法实现.doc_第2页
第2页 / 共12页
关于C语言的DES加密算法实现.doc_第3页
第3页 / 共12页
关于C语言的DES加密算法实现.doc_第4页
第4页 / 共12页
关于C语言的DES加密算法实现.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《关于C语言的DES加密算法实现.doc》由会员分享,可在线阅读,更多相关《关于C语言的DES加密算法实现.doc(12页珍藏版)》请在三一文库上搜索。

1、关于C语言的DES加密算法实现.txt13母爱是迷惘时苦口婆心的规劝;母爱是远行时一声殷切的叮咛;母爱是孤苦无助时慈祥的微笑。/*author:TroyLiu*time: 2011.05.26*说明:由于本人C语言编程能力有限,此代码仅供参考。* 其中各个功能的实现具有一定的参考价值。* 代码的部分书写习惯亦可参考。* 如果有能力者,可以考虑分函数完成。* 请记住:所有的代码都写到main()函数是一个很不良的编程习惯!*/*这仅是DES的第一轮加密*输入明文:computer#*输入密文:program#*书本的错误:*1.密钥k经过置换后得到的D0最后一位有错误,应该为1 (这个错误不影响

2、往后的结果)*2.通过8个s盒得到32位的序列第二组前四位有错,应该为1101,而不是0011*3.往后的结果均由上2的错误导致*/*DES密码的加密过程*1.将字母转化为二进制数(明文&密文)分成两组完成*2.对明文m进行初始IP置换完成*3.对密钥k进行密钥置换完成*4.对密钥k进行压缩置换完成*5.对R0进行扩展变换32-48完成*6.结果和k进行异或运算完成*7.将结果分成8组,通过8个s盒完成*8.对s盒的输出序列进行P置换完成*9.对p置换的结果与L0进行异或运算完成*/#includeint ip = /IP置换 58,50,42,34,26,18,10, 2,60,52,44,

3、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;int jiou = 7,15,23,31,39,47,55,63/进行密钥添加奇偶校验位使用;int ki = /密钥置换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,5

4、2,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;int kyasuo= /对密钥进行压缩置换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;int mkuozhan= 32, 1, 2, 3, 4, 5, 4, 5, 6,

5、7, 8, 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;int s8416 = /8个s盒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,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,15,12, 8, 2, 4, 9, 1, 7

6、, 5,11, 3,14,10, 0, 6,13,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, 4,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,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

7、,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, 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,12, 7, 2,14

8、, 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,10, 6, 9, 0,12,11, 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,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

9、, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6, 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13, 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,13, 2, 8, 4, 6,15,11, 1

10、,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,15, 3, 5, 8, 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11;int p32 = /最后的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,30, 6,22,11, 4,25;void main()char mi

11、ngwen1100;int mingwen2100;int tempmingwen100;int L032,R032;int R4848;char miyue1100;int miyue2100;int tempmiyue100;int C028,D028;int yihuo48;/存放R0与K1异或的结果int sheD; /存放经过s盒之后的十进制结果int sheB84;/存放经过s盒之后的二进制结果int she32;/对s盒中的数据进行合并,存放经过s盒的结果int hang,lie;/存放s盒的行列序号int p232;/存放经过p置换后的结果int c,d;/存放C00和D00i

12、nt i,j;/i,j作为循环使用int icount1,icount2,k;int temp;/_明文输入_k=0;printf(请输入明文(以#号结尾):n);for(i=0; i100; i+)scanf(%c,&mingwen1i);if(# = mingwen1i)icount1 = i;goto loop1;loop1:for(i=0;i=0;j-)temp=mingwen1i&(1j);if(0 = temp)mingwen2k=0;k+;elsemingwen2k=1;k+; /_密钥输入_k=0;fflush(stdin);/清除缓冲区内的数据,如果不加上,则miwen0会多

13、出一个LF(换行符)!printf(请输入密钥(以#号结束):n);for(i=0; i100; i+)scanf(%c,&miyue1i);if(# = miyue1i)icount2 = i;goto loop2;loop2:for(i=0;i=0;j-)temp=miyue1i&(1j);if(0 = temp)miyue2k=0;k+;elsemiyue2k=1;k+; /* printf(nnm = ); for(i=0;i8*icount1;i+)printf(%d,mingwen2i);if(i= 7|i=15|i=23|i=39|i=47|i=55|i=63)printf( )

14、;if(i=31)printf(n);printf( );printf(nk = ); for(i=0;i8*icount2;i+)printf(%d,miyue2i);if(i= 7|i=15|i=23|i=39|i=47|i=55|i=63)printf( );if(i=31)printf(n);printf( );printf(n);/*/_至此二进制的明文存放在mingwen2中_/_进行明文的初始置换IP_fflush(stdin);/清除缓冲区内的数据for(i=0;i8*icount1;i+)tempmingweni = mingwen2ipi-1;/_置换IP后的结果存放在te

15、mpmingweni中_/_把明文结果存放到L0和R0中_fflush(stdin);/清除缓冲区内的数据for(i=0;i64;i+)if(i32) L0i=tempmingweni;else R0i-32=tempmingweni;/*printf(nm经过IP置换后得到:n);printf(L0: );for(i=0;i32;i+)printf(%d,L0i);if(i= 7|i=15|i=23|i=31)printf( );printf(nR0: );for(i=0;i32;i+)printf(%d,R0i);if(i= 7|i=15|i=23|i=31)printf( );print

16、f(n);/*/_对密文进行添加奇偶校验位_fflush(stdin);/清除缓冲区内的数据for(i=0;i=jioui)miyue2j+1=miyue2j;j-;if(i=0 | i=2 | i=4 | i=6) miyue2jioui=0;else miyue2jioui=1; /*for(i=0;i64;i+)printf(%d,miyue2i);if(i= 7|i=15|i=23|i=31|i=39|i=47|i=55|i=63)printf( );*/_对密文进行密钥置换_fflush(stdin);/清除缓冲区内的数据for(i=0;i56;i+)tempmiyuei=miyue

17、2kii-1;/*printf(nn);for(i=0;i56;i+)printf(%d,tempmiyuei);if(i= 7|i=15|i=23|i=31|i=39|i=47|i=55|i=63)printf( );*/fflush(stdin);/清除缓冲区内的数据for(i=0;i56;i+)if(i28) C0i=tempmiyuei;else D0i-28=tempmiyuei;/*printf(n密钥k经过置换后得到:);printf(nC0: );for(i=0;i28;i+)printf(%d,C0i);if(i= 7|i=15|i=23)printf( );printf(n

18、R0: );for(i=0;i28;i+)printf(%d,D0i);if(i= 7|i=15|i=23)printf( );printf(n);/*/_分别对C0和D0进行循环左移操作_c = C00;d = D00;for(i=0;i27;i+)C0i = C0i+1;C028 = c;for(i=0;i27;i+)D0i = D0i+1;D028 = d;/_对C0和D0进行合并存入miyue2中_fflush(stdin);/清除缓冲区内的数据for(i=0;i56;i+)if(i28) miyue2i=C0i;else miyue2i=D0i-28;/_-fflush(stdin)

19、;/清除缓冲区内的数据for(i=0;i48;i+)tempmiyuei = miyue2kyasuoi-1;/*printf(n循环左移一位后经过密钥置换得到48位子密钥:n);for(i=0;i48;i+)printf(%d,tempmiyuei);if(i= 7|i=15|i=31|i=39|i=47)printf( );if(i=23)printf(n);/*/fflush(stdin);/清除缓冲区内的数据for(i=0;i48;i+)R48i=R0mkuozhani-1;/*printf(nnR0经过扩展变换得到的48位序列为:n);for(i=0;i48;i+)printf(%d

20、,R48i);if(i= 7|i=15|i=31|i=39|i=47)printf( );if(i=23)printf(n);/*/_R0与K1异或_fflush(stdin);/清除缓冲区内的数据for(i=0;i48;i+)yihuoi = R48itempmiyuei;/_结果存放到yihuo数组中_/*printf(nn结果再和k1进行异或运算,得到的结果为:n);for(i=0;i48;i+)printf(%d,yihuoi);if(i= 7|i=15|i=31|i=39|i=47)printf( );if(i=23)printf(n);/*/_通过8个s盒的到32位的序列_fflu

21、sh(stdin);/清除缓冲区内的数据for(i=0;i=0;j-)temp=sheD&(1j);if(0 = temp)sheBik=0;k+;elsesheBik=1;k+;/_将二维数组sheB中的内容转存到一维数组she中,方便以后的计算_fflush(stdin);/清除缓冲区内的数据k=0;for(i=0;i8;i+)for(j=0;j4;j+)shek=sheBij;k+;/*printf(nn通过8个s盒得到32位的序列为:n);for(i=0;i32;i+)printf(%d,shei);if(i= 7|i=15|i=23|i=31)printf( );printf(n);

22、/*/_对s盒的输出序列进行p置换_fflush(stdin);/清除缓冲区内的数据for(i=0;i32;i+)p2i=shepi-1;/*fflush(stdin);/清除缓冲区内的数据printf(n对s盒的输出序列进行p置换,得到n);for(i=0;i32;i+)printf(%d,p2i);if(i= 7|i=15|i=23|i=31)printf( );/*/_p置换之后和L0进行异或运算_fflush(stdin);/清除缓冲区内的数据for(i=0;i32;i+)p2i=L0ip2i;/_L0和R0交换_for(i=0;i32;i+)L0i=R0i;R0i=p2i;/*printf(nn经过以上操作,得到进过第一轮加密的结果序列为:n);printf(L0: );for(i=0;i32;i+)printf(%d,L0i);if(i= 7|i=15|i=23|i=31)printf( );printf(n);printf(R0: );for(i=0;i32;i+)printf(%d,R0i);if(i= 7|i=15|i=23|i=31)printf( );printf(n);/*/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1