1、DES算法源代码#includevoid main() /声明变量char MingWen104; /存放原始的明文char target8; /将明文断成8个字符的一个分组char InputKey8; /存放字符型的八位密钥int text64; /存放一个分组转成二进制后的数据int text_ip64; /存放第一次初始换位的结果int L032,Li32; /将64位分成左右各32位进行迭代int R032,Ri32;int RE048; /存放右半部分经过E表扩展换位后的48位数据int key64; /存放密钥的二进制形式int keyPC156; /存放密钥key经过PC1换位
2、表后变成的56位二进制int A28; /将keyPC1分成左右两部分,左部A,右部B,各28位,以便进行循环左移int B28;int keyAB56; /将循环左移后两部分的结果合并起来int K1648; /存放16次循环左移产生的子密钥int RK48; /存放RE和K异或运算后的结果int RKS8; /存放经过查找8个S表后得到的8个十进制结果int SP32; /将RKS表中的十进制数化成二进制int RKSP32; /存放SP表经过P盒换位后的结果int text_end64; /存放经过左右32位换位后的结果int text_out1464; /存放初始化向量和所有经过DES
3、的分组的二进制char init9=HTmadeit; /设置初始化向量为“HTmadeit”int CBC64;int result1364;int H208;char MiWen208;int C832;int M138;char choice;int t;int i,j;int k,l,m,n;int r8,c8;int flag=1;int 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,
4、 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 E48= /扩展换位表32, 1, 2, 3, 4, 5, 4, 5, 6, 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,
5、29, 28, 29, 30, 31, 32, 1 ;int PC156= /PC1换位表(6456)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 ;int move16= /循环移位表1,1,2,2,2,2,2,2
6、,1,2,2,2,2,2,2,1;int PC248= /PC2换位表(5648)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 S1416= /S换位表14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 1
7、5, 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;int S2416=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,
8、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;int S3416=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,
9、 2, 12;int S4416= 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;int S5416= 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,14,
10、 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;int S6416=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,
11、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;int S7416= 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,
12、2, 3, 12;int S8416=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 P32= /P换位表16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,2
13、4,14,32,27,3,9,19,13,30,6,22,11,4,25;printf(欢迎使用SKY的加密&解密小程序!nn);while(flag)printf(A加密,B解密,请选择:n);scanf(%c,&choice);while(choice!=A&choice!=B&choice!=a&choice!=b)printf(对不起,您的输入不合法。请选择A或B,A表示加密,B表示解密。n); scanf(%c,&choice);getchar(); /生成子密钥printf(请输入8位密钥:n);gets(InputKey);while(InputKey7=0|InputKey8!
14、=0) printf(您输入的密钥位数有误,请重新输入8位密钥:n); gets(InputKey);for(i=0;i8;i+) /将密钥转化成64位二进制数放到一维数组key中 int a8=0,0,0,0,0,0,0,0; m=InputKeyi; for(j=0;m!=0;j+) aj=m%2; m=m/2; for(j=0;j8;j+) key(i*8)+j=a7-j; /for(i=0;i64;i+) /printf(%d,keyi); for(i=0;i56;i+) /通过PC1换位表变成56位密钥放在keyPC1中 keyPC1i=keyPC1i-1; for(i=0;i28;
15、i+) /分成A和B两部分,各28位 Ai=keyPC1i; Bi=keyPC1i+28; for(t=0;t16;t+) if(movet=1) /按照循环移位表将Ai和Bi分别左移movet位 n=A0; for(i=0;i27;i+) Ai=Ai+1; A27=n; n=B0; for(i=0;i28;i+) Bi=Bi+1; B27=n; else n=A0; m=A1; for(i=0;i26;i+) Ai=Ai+2; A26=n; A27=m; n=B0; m=B1; for(i=0;i26;i+) Bi=Bi+2; B26=n; B27=m; for(i=0;i28;i+) /将
16、A和B合并成56位 keyABi=Ai; keyABi+28=Bi; for(i=0;i48;i+) /通过PC2换位表变成48位密钥 Kti=keyABPC2i-1; /for(t=0;t16;t+) /for(i=0;i48;i+) / printf(%d,Kti); for(i=0;i8;i+) /将初始化向量转化成二进制数储存到数组text_out的第一行中 int a8=0,0,0,0,0,0,0,0; m=initi; for(j=0;m!=0;j+) aj=m%2; m=m/2; for(j=0;j8;j+) text_out0(i*8)+j=a7-j; /加密程序if(choi
17、ce=A|choice=a) printf(请输入您想加密的内容:n); /输入明文 gets(MingWen); while(MingWen0=0) printf(对不起,明文不可为空,请您输入正确的明文。n); gets(MingWen); /CBC模式下的加密 i=0; /将明文每8个字符作为一个分组,共有n个分组 n=0; while(MingWeni!=0) n+; i+; k=n%8; n=(n-1)/8+1; for(l=0;ln;l+) if(l=(n-1)&k!=0) for(i=0;ik;i+) /将每个分组的8个字符放到数组target中,不够的用空格补充 targeti
18、=MingWeni+(8*l); for(i=k;i8;i+) targeti= ; else for(i=0;i8;i+) targeti=MingWeni+(8*l); for(i=0;i8;i+) /将得到的明文转化成二进制数储存到数组text中 int a8=0,0,0,0,0,0,0,0; m=targeti; for(j=0;m!=0;j+) aj=m%2; m=m/2; for(j=0;j8;j+) text(i*8)+j=a7-j; /for(i=0;i64;i+) /printf(%d,texti); /printf(n); /for(i=0;i64;i+) /printf(
19、%d,text_outli); /printf(n); for(i=0;i64;i+) /CBC模式下前一分组的密文异或当前分组 texti=text_outlitexti; /for(i=0;i64;i+) /printf(%d,texti); /printf(n); /对每个text进行DES加密 for(i=0;i64;i+) /进行初始换位 text_ipi=textIPi-1; for(i=0;i32;i+) /分成左右两部分,各32位 L0i=text_ipi; R0i=text_ipi+32; /for(i=0;i32;i+) / printf(%d,L0i); /for(i=0
20、;i32;i+) / printf(%d,R0i); /十六次迭代 for(t=0;t16;t+) for(i=0;i48;i+) /将右半部分通过扩展换位表E从32位扩展成48位 RE0i=R0Ei-1; /printf(RE0n); /for(i=0;i48;i+) /printf(%d,RE0i); for(i=0;i48;i+) /RE与K异或运算 RKi=RE0iKti; /printf(n); /for(i=0;i48;i+) /printf(%d,RKi); for(i=0;i8;i+) /将R和K异或运算的结果通过S位移表 ri=RK(i*6)+0*2+RK(i*6)+5; c
21、i=RK(i*6)+1*8+RK(i*6)+2*4+RK(i*6)+3*2+RK(i*6)+4; RKS0=S1r0c0; RKS1=S2r1c1; RKS2=S3r2c2; RKS3=S4r3c3; RKS4=S5r4c4; RKS5=S6r5c5; RKS6=S7r6c6; RKS7=S8r7c7; for(i=0;i8;i+) /把结果转成32位二进制储存在数组SP中 int b4=0,0,0,0; m=RKSi; for(j=3;m!=0;j-) bj=m%2; m=m/2; for(j=0;j4;j+) SPj+(i*4)=bj; for(i=0;i32;i+) /将二进制结果再经过
22、一个P盒换位 RKSPi=SPPi-1; for(i=0;i32;i+) /与前一次的左部异或运算,得到本次迭代的右部 Rii=L0iRKSPi; for(i=0;i32;i+) L0i=R0i; R0i=Rii; /一个左右32位交换 for(i=0;i32;i+) Lii=R0i; for(i=0;i32;i+) R0i=L0i; for(i=0;i32;i+) L0i=Lii; /初始换位的逆过程 for(i=0;i32;i+) /把左右两部分合起来存到text_end中 text_endi=L0i; for(i=32;i64;i+) text_endi=R0i-32; for(i=0;
23、i64;i+) /进行初始换位的逆过程 text_outl+1IPi-1=text_endi; for(i=0;i64;i+) resultli=text_outl+1i; /for(i=0;i64;i+) /printf(%d,resultli); /printf(n); for(j=0;jn;j+) /把result中的二进制密文转成十进制存到数组H中for(i=0;i16;i+)Hi+(j*16)=resultj0+(i*4)*8+resultj1+(i*4)*4+resultj2+(i*4)*2+resultj3+(i*4);/for(i=0;il*16;i+)/printf(%d,H
24、i);for(i=0;in*16;i+) if(Hi10) MiWeni=Hi+48; else if(Hi=10) MiWeni=a; else if(Hi=11) MiWeni=b; else if(Hi=12) MiWeni=c; else if(Hi=13) MiWeni=d; else if(Hi=14) MiWeni=e; else if(Hi=15) MiWeni=f; /else MiWeni=0; for(i=l*16;i224;i+) MiWeni=0;printf(您的文件经过DES加密后的密文是:n);printf(%sn,MiWen);printf(nn); /解密程
25、序else if(choice=B|choice=b) printf(请输入密文内容:n); gets(MiWen); for(i=0;i=0&MiWeni=A&MiWeni=a&MiWeni=f) Hi=MiWeni-a+10; else printf(请输入用十六进制表示的密文内容:n); gets(MiWen); i=0; n=i; /密文中共有n个字符 if(n%16!=0) printf(对不起,您输入的密文不正确,请确认密文的内容,密文的字符数应是16的倍数。n); printf(请输入密文内容:n); gets(MiWen); for(i=0;i=0&MiWeni=A&MiWeni=a&MiWeni=f) Hi=MiWeni-a+10; for(i=0;in;i+) /将十进制密文转化成二进制存放在数组C中 int he4=0,0,0,0; for(j=3;Hi!=0;j-) hej=Hi%2; Hi=Hi/2; for(j=0;j4;j+) Cj+(i*4)=hej;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1