1 #include<stdio.h>
2 #include<iostream>
3 using namespace std;
4 int ip[64]={
5 58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12,4,
6 62,54,46,38,30,22,14, 6,64,56,48,40,32,24,16,8,
7 57,49,41,33,25,17, 9, 1,59,51,43,35,27,19,11,3,
8 61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15,7
9 };
10 int fp[64]={
11 40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31,
12 38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29,
13 36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27,
14 34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25
15 };
16 int ei[48]={
17 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,
18 8, 9, 10,11,12,13,12,13,14,15,16,17,
19 16,17,18,19,20,21,20,21,22,23,24,25,
20 24,25,26,27,28,29,28,29,30,31,32, 1
21 };
22 int keyrar[56]={
23 57,49,41,33,25,17, 9, 1,58,50,42,34,26,18,
24 10, 2,59,51,43,35,27,19,11, 3,60,52,44,36,
25 63,55,47,39,31,23,15, 7,62,54,46,38,30,22,
26 14, 6,61,53,45,37,29,21,13, 5,28,20,12, 4
27 };
28 int Pzh[32]={
29 16, 7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,
30 2, 8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25
31 };
32 int sbox[8][64]={
33 //S1
34 14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
35 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
36 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,
37 15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13,
38 //S2
39 15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,
40 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,
41 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,
42 13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9,
43 //S3
44 10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,
45 13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,
46 13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,
47 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12,
48 //S4
49 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,
50 13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,
51 10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,
52 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14,
53 //S5
54 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,
55 14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,
56 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,
57 11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3,
58 //S6
59 12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,
60 10,15, 4, 2, 7,12, 0, 5, 6, 1,13,14, 0,11, 3, 8,
61 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,
62 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13,
63 //S7
64 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,
65 13, 0,11, 7, 4, 0, 1,10,14, 3, 5,12, 2,15, 8, 6,
66 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2,
67 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12,
68 //S8
69 13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,
70 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,
71 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,
72 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11
73 };
74 int rar[48]={
75 14,17,11,24, 1, 5, 3,28,15, 6,21,10,
76 23,19,12, 4,26, 8,16, 7,27,20,13, 2,
77 41,52,31,37,47,55,30,40,51,34,33,48,
78 44,49,39,56,34,53,46,42,50,36,29,32
79 };
80 bool key[50][50];
81 /*void BitToByte(char Out[8],bool PMW[64],int number){
82 int i=0;
83 for(i=0;i<(number/8);i++)
84 {
85 Out[i]=0;
86 }
87 for(i=0;i<number;i++)
88 {
89 Out[i/8]|=PMW[i];
90 Out[i/8]|=PMW[i]<<(i%8);
91 /*cout<<':'<<(PMW[i]<<(i%8))<<':'<<endl;
92 //if(i%8==7)
93 printf("%c\n",Out[i/8]);
94 cout<<Out[i/8]<<endl;*/
95 }
96 }*/
97 void ByteToBit(bool PMW[64],char In[8],int number){
98 for(int i=0;i<number;i++)
99 PMW[i]=(In[i/8]>>(i%8))&0x01;
100 }
101 void Xor(bool a[],bool b[],int num){
102 for(int i=0;i<num;i++)
103 a[i]=a[i]^b[i];
104 }
105 void keyfc(char *In){
106 int i,j=0,mov,k,m;
107 bool keyy[56],temp,keyin[64];
108 ByteToBit(keyin,In,64);//字节转换
109 for(i=0;i<56;i++) //压缩
110 keyy[i]=keyin[keyrar[i]-1];
111 for(i=0;i<16;i++){
112 if(i==0||i==1||i==8||i==15)mov=1;
113 else mov=2;
114 for(k=0;k<mov;k++){
115 for(m=0;m<8;m++){
116 temp=keyy[m*7];
117 for(j=m*7;j<m*7+7;j++)
118 keyy[j]=keyy[j+1];
119 keyy[m*7+6]=temp;
120 }
121 temp=keyy[0];
122 for(m=0;m<27;m++)
123 keyy[m]=keyy[m+1];
124 keyy[27]=temp;
125 temp=keyy[28];
126 for(m=28;m<55;m++)
127 keyy[m]=key[m+1];
128 keyy[55]=temp;
129 }
130 for(j=0;j<48;j++)key[i][j]=keyy[rar[j]-1];
131 }
132 }
133 void DES(/*char Out[8]*/bool ans[64],char In[8],bool MS){
134 bool MW[64],tmp[32],PMW[64];
135 bool kzmw[48],keytem[48],ss[32];
136 int hang,lie,i,j;
137 ByteToBit(PMW,In,64);
138 for(j=0;j<64;j++)MW[j]=PMW[ip[j]-1];
139 cout<<"初始置换后:"<<endl;
140 for(i=0;i<64;i++)cout<<MW[i];
141 cout<<endl;
142 bool *Li=&MW[0],*Ri=&MW[32];
143 cout<<"E扩展之前:"<<endl;
144 for(i=0;i<32;i++)cout<<Ri[i];cout<<endl;
145 for(i=0;i<48;i++)kzmw[i]=Ri[ei[i]-1];
146 cout<<"E扩展之后:"<<endl;
147 for(i=0;i<48;i++)cout<<kzmw[i];cout<<endl;
148 if(MS==0){
149 int flag=0;
150 for(int lun=0;lun<16;lun++){
151 for(i=0;i<32;i++)ss[i]=Ri[i];
152 for(i=0;i<48;i++)kzmw[i]=Ri[ei[i]-1];
153 for(i=0;i<48;i++)keytem[i]=key[lun][i];
154 Xor(kzmw,keytem,48);
155 //S盒
156 for(i=0;i<8;i++){
157 hang=kzmw[i*6]*2+kzmw[i*6+5];
158 lie=kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];
159 tmp[i*4+3]=(sbox[i][(hang+1)*16+lie])%2;
160 tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;
161 tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;
162 tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;
163 if(i==2&&flag==0){
164 cout<<"第三个S盒的输入为:"<<endl;
165 for(int h=i*6;h<=i*6+5;h++)
166 cout<<kzmw[h];cout<<endl;
167 cout<<"第三个S盒的输出为:"<<endl;
168 for(int h=i*4;h<=i*4+3;h++)
169 cout<<tmp[h];cout<<endl;
170 }
171 }
172 //p置换
173 for(i=0;i<32;i++)
174 Ri[i]=tmp[Pzh[i]-1];
175 if(flag==0){
176 flag=1;
177 cout<<"P置换的输入为:"<<endl;
178 for(i=0;i<32;i++)cout<<tmp[i];cout<<endl;
179 cout<<"P置换的输出为:"<<endl;
180 for(i=0;i<32;i++)cout<<Ri[i];cout<<endl;
181 }
182 Xor(Ri,Li,32);
183 for(i=0;i<32;i++)Li[i]=ss[i];
184 }
185 for(i=0;i<32;i++){
186 tmp[i]=Li[i];
187 Li[i]=Ri[i];
188 Ri[i]=tmp[i];
189 }
190 for(i=0;i<64;i++)PMW[i]=MW[fp[i]-1];
191 for(i=0;i<64;i++)ans[i]=PMW[i];
192 //逆置换
193 // BitToByte(Out,PMW,64);
194 }
195 }
196 int main(){
197 char Ki[8],jm[8],final[8];
198 bool ans[64];
199 int i;
200 cout<<"请输入密钥(8字节):"<<endl;
201 for(i=0;i<8;i++)cin>>Ki[i];
202 keyfc(Ki);
203
204 cout<<"请输入明文(8字节):"<<endl;
205 for(i=0;i<8;i++)cin>>jm[i];
206 // DES(final,jm,0);
207 DES(ans,jm,0);
208
209 cout<<"加密后(64位):"<<endl;
210 for(i=0;i<64;i++)cout<<ans[i];
211 // for(i=0;i<8;i++)cout<<final[i];
212 cout<<endl;
213
214 /* cout<<"解密后:"<<endl;
215 DES(jm,final,1);
216 for(i=0;i<8;i++)cout<<jm[i];
217 cout<<endl;*/
218 }