📄 des.lst
字号:
C51 COMPILER V6.10 DES 09/11/2002 09:15:35 PAGE 1
C51 COMPILER V6.10, COMPILATION OF MODULE DES
OBJECT MODULE PLACED IN .\Des.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE .\Des.c LARGE OPTIMIZE(9,SPEED) DEBUG OBJECTEXTEND
stmt level source
1 /*--------------------------------------------------------------------------------
2 DES.C: DES Algorithm Program
3 --------------------------------------------------------------------------------*/
4 #include <string.h>
5 #define BYTE unsigned char
6 #define bool unsigned char
7 static code BYTE initialtr[64]={58,50,42,34,26,18,10,2,
8 60,52,44,36,28,20,12,4,
9 62,54,46,38,30,22,14,6,
10 64,56,48,40,32,24,16,8,
11 57,49,41,33,25,17, 9,1,
12 59,51,43,35,27,19,11,3,
13 61,53,45,37,29,21,13,5,
14 63,55,47,39,31,23,15,7 };
15 static code BYTE keytr1[56] ={57,49,41,33,25,17, 9,
16 1,58,50,42,34,26,18,
17 10, 2,59,51,43,35,27,
18 19,11, 3,60,52,44,36,
19 63,55,47,39,31,23,15,
20 7,62,54,46,38,30,22,
21 14, 6,61,53,45,37,29,
22 21,13, 5,28,20,12, 4 };
23 static code BYTE rots[16] ={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
24 static code BYTE keytr2[48] ={14,17,11,24, 1, 5,
25 3,28,15, 6,21,10,
26 23,19,12, 4,26, 8,
27 16, 7,27,20,13, 2,
28 41,52,31,37,47,55,
29 30,40,51,45,33,48,
30 44,49,39,56,34,53,
31 46,42,50,36,29,32 };
32 static code BYTE etr[48] ={32, 1, 2, 3, 4, 5,
33 4, 5, 6, 7, 8, 9,
34 8, 9,10,11,12,13,
35 12,13,14,15,16,17,
36 16,17,18,19,20,21,
37 20,21,22,23,24,25,
38 24,25,26,27,28,29,
39 28,29,30,31,32, 1 };
40 static code BYTE s[8][64] ={{ 14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
41 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
42 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,
43 15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13 },
44 {15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,
45 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,
46 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,
47 13,8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9 },
48 {10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,
49 13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,
50 13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,
51 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12 },
52 { 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,
53 13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,
54 10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,
55 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14 },
C51 COMPILER V6.10 DES 09/11/2002 09:15:35 PAGE 2
56 { 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,
57 14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,
58 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,
59 11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3 },
60 {12,1, 10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,
61 10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8,
62 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,
63 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13 },
64 { 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,
65 13,0,11, 7, 4, 9, 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 {13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,
69 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,
70 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,
71 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11 }};
72 static code BYTE ptr[32] ={16, 7,20,21,29,12,28,17,
73 1,15,23,26, 5,18,31,10,
74 2, 8,24,14,32,27, 3, 9,
75 19,13,30, 6,22,11, 4,25};
76 static code BYTE swap[64] ={33,34,35,36,37,38,39,40,
77 41,42,43,44,45,46,47,48,
78 49,50,51,52,53,54,55,56,
79 57,58,59,60,61,62,63,64,
80 1, 2, 3, 4, 5, 6, 7, 8,
81 9,10,11,12,13,14,15,16,
82 17,18,19,20,21,22,23,24,
83 25,26,27,28,29,30,31,32};
84
85 static code BYTE finaltr[64]={40, 8,48,16,56,24,64,32,
86 39, 7,47,15,55,23,63,31,
87 38, 6,46,14,54,22,62,30,
88 37, 5,45,13,53,21,61,29,
89 36, 4,44,12,52,20,60,28,
90 35, 3,43,11,51,19,59,27,
91 34, 2,42,10,50,18,58,26,
92 33, 1,41, 9,49,17,57,25 };
93
94 void increase(BYTE *text1, bool *plainttext1)
95 {
96 1 BYTE i,j,b;
97 1 for(i=0;i<=7;i++)
98 1 {
99 2 b=text1[i];
100 2 for(j=(i*8);j<=(i*8)+7;j++)
101 2 {
102 3 plainttext1[j]=(b>=0x80);
103 3 b=b<<1;
104 3 }
105 2 }
106 1 }
107
108 void transpose(bool *_data, BYTE* t,BYTE n)
109 {
110 1 BYTE i;
111 1 bool x[64];
112 1
113 1 memcpy(x,_data,64);
114 1 for(i=0;i<n;i++)
115 1 _data[i]=x[t[i]-1];
116 1 }
117 void Rotate_left_cycle(bool* keyr)
C51 COMPILER V6.10 DES 09/11/2002 09:15:35 PAGE 3
118 {
119 1 bool temp;
120 1 BYTE i;
121 1
122 1 temp=keyr[0];
123 1 for(i=0;i<55;i++)
124 1 keyr[i]=keyr[i+1];
125 1 keyr[55]=keyr[27];
126 1 keyr[27]=temp;
127 1 }
128
129 void DESsubkey(BYTE* key, bool keylistm[16][56])
130 {
131 1 BYTE i,n;
132 1 bool key0[64];
133 1
134 1 increase(key,key0);
135 1 transpose(key0,keytr1,56);
136 1 for(i=0;i<16;i++)
137 1 {
138 2 for(n=0;n<rots[i];n++)
139 2 Rotate_left_cycle(key0);
140 2 memcpy(keylistm[i], key0, 56);
141 2 transpose(keylistm[i], keytr2, 48);
142 2 }
143 1 }
144 void f(bool* R, bool* subkey)
145 {
146 1 BYTE i,j,k, p,temp;
147 1 transpose(R,etr,48); // expand
148 1 for(i=0;i<48;i++)
149 1 R[i]^=subkey[i]; //XOR
150 1 for(k=0;k<8;k++)
151 1 {
152 2 p=(32*R[6*k]+16*R[6*k+5]+8*R[6*k+1]+4*R[6*k+2]+2*R[6*k+3]+R[6*k+4]);
153 2 temp=s[k][p];
154 2 for(j=0;j<4;j++)
155 2 {
156 3 R[4*k+j]=(temp>=0x08);
157 3 temp=(temp<<1)&0x0f;
158 3 }
159 2 }
160 1 transpose(R,ptr,32);
161 1 }
162 void press(bool *dt1,BYTE *dt2)
163 {
164 1 BYTE a,i,j;
165 1 for(j=0;j<8;j++)
166 1 {
167 2 a=0;
168 2 for(i=8*j;i<8*j+8; i++)
169 2 {
170 3 a=a<<1;
171 3 a=a+dt1[i];
172 3 }
173 2 dt2[j]=a;
174 2 }
175 1 }
176
177 void DESBasic(bool tp, bool subkey[16][56], BYTE *dest, BYTE *sour)
178 {
179 1 bool sour0[80],tmpgrp[32];//sour0; 32+48
C51 COMPILER V6.10 DES 09/11/2002 09:15:35 PAGE 4
180 1 BYTE i,j;
181 1
182 1 increase(sour,sour0);
183 1 transpose(sour0,initialtr,64);
184 1
185 1 for (i=0;i<16;i++)
186 1 {
187 2 for(j=0;j<32;j++)
188 2 tmpgrp[j]=sour0[32+j];
189 2 if(!tp)
190 2 f(&sour0[32], subkey[i]);
191 2 else
192 2 f(&sour0[32], subkey[15-i]);
193 2 for(j=0;j<32;j++)
194 2 {
195 3 sour0[j]=sour0[j]^sour0[32+j];//XOR
196 3 sour0[32+j]=tmpgrp[j];
197 3 }
198 2 if(i<15)
199 2 transpose(sour0,swap,64);
200 2 }
201 1 transpose(sour0,finaltr,64);
202 1 press(sour0,dest);
203 1 }
204
205 void DESencrypt(BYTE *key,BYTE *dest,BYTE *sour)
206 {
207 1 bool subkey[16][56];
208 1
209 1 DESsubkey(key,subkey);
210 1 DESBasic(0, subkey, dest, sour);
211 1 }
212 void DESdecrypt(BYTE *key,BYTE *dest,BYTE *sour)
213 {
214 1 bool subkey[16][56];
215 1
216 1 DESsubkey(key,subkey);
217 1 DESBasic(1, subkey, dest, sour);
218 1 }
219 void TripDESencrypt(BYTE *key,BYTE *dest,BYTE *sour)
220 {
221 1 DESencrypt(key,dest,sour);
222 1 DESdecrypt(key+8,dest,dest);
223 1 DESencrypt(key,dest,dest);
224 1 }
225 void TripDESdecrypt(BYTE *key,BYTE *dest,BYTE *sour)
226 {
227 1 DESdecrypt(key,dest,sour);
228 1 DESencrypt(key+8,dest,dest);
229 1 DESdecrypt(key,dest,dest);
230 1 }
231 void main(void)
232 {
233 1 char key[8] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
234 1 // char key2[16]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xe7};
235 1 // char key3[8]={0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff};
236 1 char sour[8] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
237 1 char dest[8];//={0xA2,0xD9,0x39,0x16,0x5D,0x26,0xA4,0xCA};
238 1
239 1 DESencrypt(key,dest,sour);
240 1 while (1);
241 1 }
C51 COMPILER V6.10 DES 09/11/2002 09:15:35 PAGE 5
242
243
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1679 ----
CONSTANT SIZE = 920 ----
XDATA SIZE = ---- 2147
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -