DES加密解密纯C语言实现.docx

上传人:小飞机 文档编号:3155592 上传时间:2023-03-11 格式:DOCX 页数:15 大小:41.28KB
返回 下载 相关 举报
DES加密解密纯C语言实现.docx_第1页
第1页 / 共15页
DES加密解密纯C语言实现.docx_第2页
第2页 / 共15页
DES加密解密纯C语言实现.docx_第3页
第3页 / 共15页
DES加密解密纯C语言实现.docx_第4页
第4页 / 共15页
DES加密解密纯C语言实现.docx_第5页
第5页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《DES加密解密纯C语言实现.docx》由会员分享,可在线阅读,更多相关《DES加密解密纯C语言实现.docx(15页珍藏版)》请在三一办公上搜索。

1、DES加密解密纯C语言实现#include #include #include void show1 /主界面 printf(nnntt* DES加密解密系统 *nn); printf(tt-n); /printf(tt-n); printf(tt*n); printf(tt*tttttt*n); printf(tt*tttttt*n); printf(tt*ttt1.加密ttt*n); printf(tt*tttttt*n); printf(tt*ttt2.解密ttt*n); printf(tt*tttttt*n); printf(tt*ttt3.退出ttt*n); printf(tt*tt

2、tttt*n); printf(tt*tttttt*n); printf(tt-n); void show2 /加密界面 printf(nnntt* DES加密 *nn); printf(tt-n); printf(tt*n); printf(tt*tttttt*n); printf(tt*t请选择明文和密钥的输入方式:tt*n); printf(tt*tttttt*n); printf(tt*tt1.直接输入ttt*n); printf(tt*tttttt*n); printf(tt*tt2.从文件读取ttt*n); printf(tt*tttttt*n); printf(tt*tt3.退出

3、tttt*n); printf(tt*tttttt*n); printf(tt-n); printf(ttt选择:); void reader(char str30,char s8) /读取明文和密钥 FILE *fp; fp=fopen(str,r); if(fp=NULL) printf(明文读取失败!n); else fscanf(fp,%s,s); fclose(fp); void To2Bin(char p8,int b64) /将字节转换成二进制流 int i,k=0; for(i=0;i=1) if(j&pi) bk+=1; else bk+=0; int IP_Table64

4、= /初始置换(IP) 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, 56, 48, 40, 32, 24, 16, 8, 0, 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6 ; int E_Table = /扩展变换E 31, 0, 1, 2, 3, 4, 3

5、, 4, 5, 6, 7, 8, 7, 8, 9, 10, 11, 12, 11, 12, 13, 14, 15, 16, 15, 16, 17, 18, 19, 20, 19, 20, 21, 22, 23, 24, 23, 24, 25, 26, 27, 28, 27, 28, 29, 30, 31, 0 ; int S_Box8416 = 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,

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

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

9、,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,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

10、,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12 , 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,15, 3, 5, 8, 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11 ; int IP_1_Table64 = /逆初始置换IP-1 39, 7, 47, 15, 55, 23, 63, 31,

11、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, 32, 0, 40, 8, 48, 16, 56, 24 ; int P_Table32 = /置换运算P 15,6,19,20, 28,11,27,16, 0,14,22,25, 4,17,30,9, 1,7,23,13, 31

12、,26,2,8, 18,12,29,5, 21,10,3,24 ; int PC_156 = 56,48,40,32,24,16,8, /密钥置换PC_1 0,57,49,41,33,25,17, 9,1,58,50,42,34,26, 18,10,2,59,51,43,35, 62,54,46,38,30,22,14, 6,61,53,45,37,29,21, 13,5,60,52,44,36,28, 20,12,4,27,19,11,3 ; int PC_248 = /密钥置换PC_2 13,16,10,23,0,4, 2,27,14,5,20,9, 22,18,11,3,25,7, 15

13、,6,26,19,12,1, 40,51,30,36,46,54, 29,39,50,44,32,47, 43,48,38,55,33,52, 45,41,49,35,28,31 ; void Replacement(int arry1,int arry2,int arry3,int num) 始IP, int i,tmp; for(i=0;inum;i+) tmp=arry2i; arry3i=arry1tmp; /置换函数(初始IP,逆初 int move_times16 = 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1; /对左移位的规定 void lif_move(i

14、nt arry1,int arry2,int n) /左移位实现函数 int i; for(i=0;i28;i+) arry2i=arry1(n+i)%28; int K1648; /存放16轮子密钥 int c64; /存放明文或密文 int L1732,R1732; /存放加密过程中左右部分 void SubKey(int K064) /子密钥产生函数 int i; int K156,K256; int C1728,D1728; Replacement(K0,PC_1,K1,56); /密钥置换PC_1 for(i=0;i28;i+) /将PC_1输出的56比特分为左右两部分 C0i=K1

15、i; D0i=K1i+28; i=0; while(i16) int j; lif_move(Ci,Ci+1,move_timesi); lif_move(Di,Di+1,move_timesi); for(j=0;j28;j+) K2j=Ci+1j; K2j+28=Di+1j; Replacement(K2,PC_2,Ki,48); /密钥置换PC_2 i+; /*printf(n子密钥生成过程中,左边生成的值:); for(i=0;i17;i+) int j; printf(nC%d:,i); for(j=0;j28;j+) if(j%7=0) printf( ); printf(%d,C

16、ij); printf(n子密钥生成过程中,右边生成的值:); for(i=0;i17;i+) int j; printf(nD%d:,i); for(j=0;j28;j+) if(j%7=0) printf( ); printf(%d,Dij); */ void S_compress(int arry,int shc) /S盒压缩变换,其中数组shc存放经过s盒的结果 int h,l; /行,列 int sha8; /存放经过s盒的十进制结果 int i,j; int temp4; for(i=0;i8;i+) /s盒压缩变换 h=arry(1+(i*6)-1*2 + arry(6+(i*6

17、)-1; l =arry(2+(i*6)-1*8 + arry(3+(i*6)-1*4 + arry(4+(i*6)-1*2 + arry(5+(i*6)-1; shai=S_Boxihl; for(i=0;i=0;j-) tempj=shai%2; shai=shai/2; for(j=0;j4;j+) shc4*i+j=tempj; /*printf(n第%d次s盒的输出:,m+); for(i=0;i32;i+) if(i%8=0) printf( ); printf(%d,shci); */ void To10(int a, int b,int n)/二进制转十进制 int i,j;

18、int temp; int arry164; for(i=0;in/4;i+) for(j=0;j4;j+) arryij=a4*i+j; for (i=0;i=0;j-) if(arryij=1) t=1; for(k=0;k3-j;k+) t=t*2; temp+=t; */ bi=temp; void To102(int a, int b,int n)/二进制转十进制 int i,j; int temp; int arry88; int t=1,k; for(i=0;in/8;i+) for(j=0;j8;j+) arryij=a8*i+j; for (i=0;i=0;j-) if(ar

19、ryij=1) t=1; for(k=0;k7-j;k+) t=t*2; temp+=t; bi=temp; void F_Function(int a32,int b32,int n) int i; int tmp48; /F函数 int tep32; Replacement(a,E_Table,tmp,48); /*printf(n第%d轮E盒扩展结果:,n); for(i=0;i48;i+) if(i%8=0) printf( ); printf(%d,tmpi); */ for(i=0;i48;i+) tmpi = Kni; /扩展变换E /与子密钥异或 /*printf(n进入S盒的

20、48比特:); for(i=0;i48;i+) if(i%6=0) printf( ); printf(%d,tmpi); */ S_compress(tmp,tep); /压缩变换S Replacement(tep,P_Table,b,32); /置换运算P /*printf(n第%d次P置盒输出:,l+); for(i=0;i32;i+) if(i%8=0) printf( ); printf(%d,bi); */ /*printf(nf%d的输出结果:,n); for(i=0;i32;i+) if(i%8=0) printf( ); printf(%d,bi); */ void Encr

21、yption(int m064,int c164) int i,k; int arry32; int c064,m164; Replacement(m0,IP_Table,m1,64); /初始置换IP /*printf(n初始置换:); for(i=0;i64;i+) if(i%8=0) printf( ); printf(%d,m1i); */ for(i=0;i32;i+) L0i=m1i; R0i=m1i+32; k=1; while(k17) F_Function(Rk-1,arry,k-1); for(i=0;i32;i+) Lki=Rk-1i; Rki=Lk-1iarryi; k

22、+; for(i=0;i32;i+) c0i=R16i; c0i+32=L16i; Replacement(c0,IP_1_Table,c1,64); void changeKey(int a1648) int i,j; int tmp1648; for(i=0;i16;i+) /逆初始置换 for(j=0;j48;j+) tmpij=aij; for(i=0;i16;i+) for(j=0;j48;j+) Kij=tmp15-ij; void Decryption(int c1,int m) int c064,t64; int i,k; int arry32; changeKey(K); /

23、*printf(n交换后的密钥:n); for(i=0;i16;i+) printf(n); for(j=0;j48;j+) if(j%8=0) printf( ); printf(%d,Kij); */ Replacement(c1,IP_Table,c0,64); for(i=0;i32;i+) L0i=c0i; R0i=c0i+32; k=1; while(k17) /初始IP F_Function(Rk-1,arry,k-1); for(i=0;i32;i+) Lki=Rk-1i; Rki=Lk-1iarryi; k+; for(i=0;i32;i+) ti=R16i; ti+32=L

24、16i; Replacement(t,IP_1_Table,m,64); void print /输出函数 int i; int a12,b12,d316; int p64,q64; for(i=0;i32;i+) pi=L15i; p32+i=R15i; qi=R16i; qi+32=L16i; To10(K14,a,48); To10(K15,b,48); To10(c,d0,64); To10(p,d1,64); To10(q,d2,64); printf(ntt15轮密钥:); for(i=0;i12;i+) printf(%x,ai); printf(t15轮结果:); for(i=

25、0;i16;i+) printf(%X,d1i); /逆初始置换 printf(ntt16轮密钥:); for(i=0;i12;i+) printf(%X,bi); printf(t16轮结果:); for(i=0;i16;i+) printf(%X,d2i); printf(ntt最后结果:); for(i=0;i16;i+) printf(%X,d0i); /*printf(n最后结果二进制:); for(i=0;i64;i+) printf(%d,ci); */ int main int num,i,t; char s18,s28; int m64; /m存放二进制明文/密文 int d

26、64; /存放二进制密钥 int s8; show1; printf(ttinput you choice:); while(1) scanf(%d,&num); switch(num) case 1: system(cls); /调用清屏函数 show2; scanf(%d,&num); if(num=1) while(strlen(s1)!=8) printf(tt请输入明文(8):); scanf(%s,s1); To2Bin(s1,m); /将明文转换成二进制流 while(strlen(s2)!=8) printf(tt请输入密钥(8):); scanf(%s,s2); To2Bin

27、(s2,d); /将密钥转换成二进制 /*printf(n初始二进制明文:); for(i=0;i64;i+) printf(%d,mi); */ /*printf(n初始二进制密钥:); for(i=0;i64;i+) printf(%d,di); */ SubKey(d); /*printf(n16轮子密钥如下:); for(i=0;i16;i+) printf(nK%d:,i+1); for(j=0;j48;j+) if(j%8=0) printf( ); printf(%d,Kij); */ Encryption(m,c); /*printf(n16次迭代左结果:); for(i=0;

28、i17;i+) printf(nL%d:,i); for(j=0;j32;j+) if(j%8=0) printf( ); printf(%d,Lij); printf(n16次迭代右结果:); for(i=0;i17;i+) printf(nR%d:,i); 键退出.); for(j=0;j32;j+) if(j%8=0) printf( ); printf(%d,Rij); */ print; /*printf(n二进制密文:); for(i=0;i64;i+) printf(%d,ci); */ printf(ntt按0将此密文解密,1返回上一层,2返回主界面,其他scanf(%d,&t

29、); if(t=0) int s8; int a64; Decryption(c,a); /*printf(n解密后的二进制:); for(i=0;i64;i+) printf(%d,ai); */ To102(a,s,64); printf(ntt解密结果:); for(i=0;i8;i+) printf(%c,si); 其他键退出.); printf(ntt按1加密,2解密,3退出); else if(t=1) system(cls); show2; else if(t=2) system(cls); show1; else exit(0); else if(num=2) char str

30、120,str220; printf(tt请输入明文文件名:); scanf(%s,str1); reader(str1,s1); To2Bin(s1,m); printf(tt请输入密钥文件名:); scanf(%s,str2); reader(str2,s2); To2Bin(s2,d); SubKey(d); Encryption(m,c); print; printf(ntt按0将此密文解密,1将密文存入文件,2返回主界面, scanf(%d,&t); if(t=0) int a64; Decryption(c,a); /*printf(n解密后的二进制:); for(i=0;i64;

31、i+) printf(%d,ai); */ To102(a,s,64); printf(ntt解密结果:); for(i=0;i8;i+) printf(%c,si); printf(ntt按1加密,2解密,3退出); else if(t=1) int a16; char str30; FILE *fw; printf(ntt请输入文件名:); scanf(%s,str); fw=fopen(str,w); if(fw=NULL) printf(ntt文件打开失败!n); else To10(c,a,64); for(i=0;i16;i+) fprintf(fw,%X,ai); fclose(

32、fw); printf(ntt密文保存成功!按1加密,2解密,3退出); else if(t=2) system(cls); show1; else exit(0); else if(num=3) system(cls); exit(0); else printf(ntt输入不正确,请重新输入:); break; case 2: system(cls); printf(nntt-DES解密-); while(strlen(s1)!=8) printf(nnntt请输入密文(8):); scanf(%s,s1); To2Bin(s1,m); while(strlen(s2)!=8) printf

33、(tt请输入密钥(8):); scanf(%s,s2); To2Bin(s2,d); SubKey(d); Decryption(m,c); print; printf(ntt按1返回上一层,2返回主界面,其他键退出.); scanf(%d,&t); if(t=1) system(cls); printf(nntt-DES解密-); while(strlen(s1)!=8) printf(nntt请输入密文(8):); scanf(%s,s1); To2Bin(s1,m); while(strlen(s2)!=8) printf(tt请输入密钥(8):); scanf(%s,s); To2Bin(s2,d); SubKey(d); Decryption(m,c); print; else if(t=2) system(cls); show1; else exit(0); break; case 3: system(cls);

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号