1、DES加密解密纯C语言实现#include#include#includevoid 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*ttt
2、ttt*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, 4
5、, 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 = /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,1
6、2, 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 , 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,11,
9、 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,13,
10、 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, 38, 6
11、, 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,26,2,8
12、, 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,6,26,19,
13、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,逆初始IP, int i,tmp; for(i=0;inum;i+) tmp=arry2i; arry3i=arry1tmp; int move_times16 = 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1; /对左移位的规定void lif_move(int arry1,int
14、 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=K1i; D0i=K1i+28;
15、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,Cij); printf(n子密
16、钥生成过程中,右边生成的值:); 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)-1; l =arry(2+(
17、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; int temp; int arr
18、y164; 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(arryij=1) t=1; for(
19、k=0;k7-j;k+) t=t*2; temp+=t; bi=temp; void F_Function(int a32,int b32,int n) /F函数 int i; int tmp48; int tep32; Replacement(a,E_Table,tmp,48); /扩展变换E /*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; /*printf(n进入S盒的48比特:); for(i=0;i
20、48;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 Encryption(int m064,in
21、t 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+; for(i=0;i32;i+)
22、 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); /*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); /初始IP for(i=0;i32;i+)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1