|
|
1.1 root 1: /*
2: * Crypt subroutines - which use the
3: * DES (Data Encryption Standard)
4: * as published in National Bureau of Standards,
5: * "Encryption Algorithm for Computer Data Encryption",
6: * Vol. 40, No. 52, March 17, p.. 12134-12139.
7: * (Reprinted in Cryptologia, Vol. I, No. 3, July 1977).
8: */
9:
10: #include <stdio.h>
11: #include <string.h>
12:
13: #define NBPC 8 /* Bits in a char */
14: #define NIB 64 /* Input bits in a unit */
15: #define NKB 64 /* Number of key bits */
16: #define NUKB 56 /* Number of used key bits */
17: #define NOKB 48 /* Number out from each key iteration */
18: #define NITER 16 /* Number of iterations of S-functions */
19: #define NSBOX 8 /* Number of S-boxes */
20: #define NSCSET 64 /* Number in small character set */
21:
22: /*
23: * Table of Initial permutation of each 64 bit entity.
24: */
25: static char IP[NIB] = {
26: 57, 49, 41, 33, 25, 17, 9, 1,
27: 59, 51, 43, 35, 27, 19, 11, 3,
28: 61, 53, 45, 37, 29, 21, 13, 5,
29: 63, 55, 47, 39, 31, 23, 15, 7,
30: 56, 48, 40, 32, 24, 16, 8, 0,
31: 58, 50, 42, 34, 26, 18, 10, 2,
32: 60, 52, 44, 36, 28, 20, 12, 4,
33: 62, 54, 46, 38, 30, 22, 14, 6
34: };
35:
36: /*
37: * Inverted intial permutation ( IP -1)
38: */
39: static char IP1[NIB] = {
40: 39, 7, 47, 15, 55, 23, 63, 31,
41: 38, 6, 46, 14, 54, 22, 62, 30,
42: 37, 5, 45, 13, 53, 21, 61, 29,
43: 36, 4, 44, 12, 52, 20, 60, 28,
44: 35, 3, 43, 11, 51, 19, 59, 27,
45: 34, 2, 42, 10, 50, 18, 58, 26,
46: 33, 1, 41, 9, 49, 17, 57, 25,
47: 32, 0, 40, 8, 48, 16, 56, 24
48: };
49:
50: /*
51: * E bit-selection table
52: */
53: static char E[NOKB] = {
54: 31, 0, 1, 2, 3, 4,
55: 3, 4, 5, 6, 7, 8,
56: 7, 8, 9, 10, 11, 12,
57: 11, 12, 13, 14, 15, 16,
58: 15, 16, 17, 18, 19, 20,
59: 19, 20, 21, 22, 23, 24,
60: 23, 24, 25, 26, 27, 28,
61: 27, 28, 29, 30, 31, 0
62: };
63:
64: /*
65: * A saved copy of the E-table for
66: * crypt to perturb.
67: */
68: static char saveE[NOKB] = {
69: 31, 0, 1, 2, 3, 4,
70: 3, 4, 5, 6, 7, 8,
71: 7, 8, 9, 10, 11, 12,
72: 11, 12, 13, 14, 15, 16,
73: 15, 16, 17, 18, 19, 20,
74: 19, 20, 21, 22, 23, 24,
75: 23, 24, 25, 26, 27, 28,
76: 27, 28, 29, 30, 31, 0
77: };
78:
79: /*
80: * Permutation of 32-bits onto 32 bits
81: * known as "P"
82: */
83: static char P[NIB/2] = {
84: 15, 6, 19, 20,
85: 28, 11, 27, 16,
86: 0, 14, 22, 25,
87: 4, 17, 30, 9,
88: 1, 7, 23, 13,
89: 31, 26, 2, 8,
90: 18, 12, 29, 5,
91: 21, 10, 3, 24
92: };
93:
94: /*
95: * The following are the 8 S-box functions
96: * (S1, S2, S3, S4, ..., S8)
97: * Each turns a 6-bit quantity into a four bit number.
98: */
99: static char Sboxes[NSBOX][4][16] = {
100: /* S1 */
101: 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
102: 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
103: 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
104: 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
105: /* S2 */
106: 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
107: 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
108: 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
109: 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
110: /* S3 */
111: 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
112: 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
113: 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
114: 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
115: /* S4 */
116: 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
117: 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
118: 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
119: 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
120: /* S5 */
121: 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
122: 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
123: 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
124: 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
125: /* S6 */
126: 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
127: 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
128: 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
129: 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
130: /* S7 */
131: 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
132: 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
133: 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
134: 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
135: /* S8 */
136: 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
137: 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
138: 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
139: 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
140: };
141:
142: /*
143: * Permuted choice tables
144: * PC-1 is used for first iteration of KS
145: * and PC-2 is used therafter.
146: */
147: static char PC1[NUKB] = {
148: 56, 48, 40, 32, 24, 16, 8,
149: 0, 57, 49, 41, 33, 25, 17,
150: 9, 1, 58, 50, 42, 34, 26,
151: 18, 10, 2, 59, 51, 43, 35,
152: /* Division between Co and Do */
153: 62, 54, 46, 38, 30, 22, 14,
154: 6, 61, 53, 45, 37, 29, 21,
155: 13, 5, 60, 52, 44, 36, 28,
156: 20, 12, 4, 27, 19, 11, 3
157: };
158:
159: static char PC2[NOKB] = {
160: 13, 16, 10, 23, 0, 4,
161: 2, 27, 14, 5, 20, 9,
162: 22, 18, 11, 3, 25, 7,
163: 15, 6, 26, 19, 12, 1,
164: 40, 51, 30, 36, 46, 54,
165: 29, 39, 50, 44, 32, 47,
166: 43, 48, 38, 55, 33, 52,
167: 45, 41, 49, 35, 28, 31
168: };
169:
170: /*
171: * Left shift table
172: */
173: static char shifts[NITER] = {
174: 1, 1, 2, 2, 2, 2, 2, 2,
175: 1, 2, 2, 2, 2, 2, 2, 1
176: };
177:
178: /*
179: * Table to map a 6-bit integer onto the
180: * smaller than ascii character set
181: * ([a-zA-Z0-9./]).
182: */
183: static char maptab[NSCSET] = {
184: 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
185: 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
186: 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
187: 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F',
188: 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
189: 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
190: 'W', 'X', 'Y', 'Z', '0', '1', '2', '3',
191: '4', '5', '6', '7', '8', '9', '.', '/'
192: };
193:
194: static char Ki[NITER][NOKB];
195:
196: /*
197: * Encrypt the block (one bit per byte)
198: * using the (broken) DES algorithm.
199: * The `edflag' is zero for encrypt,
200: * non-zero for decrypt.
201: */
202: encrypt(block, edflag)
203: char block[NIB];
204: {
205: char block1[NIB], block2[NIB];
206:
207: permute(block, block1, IP, NIB);
208: cypher(block1, block2, edflag);
209: permute(block2, block, IP1, NIB);
210: }
211:
212: /*
213: * Setkey takes an array of NIB (64)
214: * bytes called `key', each of which
215: * contains one bit of the desired key.
216: * This uses the DES Key Schedule (KS) function
217: * to iteratively produce each of the NITER (16)
218: * Ki's from the original key.
219: */
220: setkey(key)
221: char key[NKB];
222: {
223: char cd[NUKB];
224: register ni;
225:
226: permute(key, cd, PC1, NUKB);
227: for (ni=0; ni<NITER; ni++) {
228: lrot(cd, shifts[ni], NUKB/2);
229: lrot(&cd[NUKB/2], shifts[ni], NUKB/2);
230: permute(cd, &Ki[ni][0], PC2, NOKB);
231: }
232: }
233:
234: /*
235: * Crypt - the password encryption routine.
236: * The key here, is the user's typed password
237: * and the second is a 2-character salt in
238: * the set "[a-zA-Z0-9./]". The salt
239: * changes the E-table in one of 4096 ways
240: * to frustrate the use of hardware to crack
241: * the DES code.
242: */
243: char *
244: crypt(key, salt)
245: char *key, *salt;
246: {
247: int sixbit;
248: char stuff[NIB];
249: char bkey[NKB];
250: static char passwd[16];
251: register char *cp, *bp;
252: register i;
253:
254: perturb(salt);
255: cp = key;
256: bp = bkey;
257: while (*cp!='\0' && bp<&bkey[NKB/NBPC])
258: *bp++ = *cp++;
259: while (bp < &bkey[NKB/NBPC])
260: *bp++ = '\0';
261: unpack(bkey, NKB);
262: setkey(bkey);
263: memcpy(stuff, "Password", NIB/NBPC);
264: unpack(stuff, NIB);
265: encrypt(stuff, 0);
266: cp = passwd;
267: *cp++ = salt[0];
268: *cp++ = salt[1];
269: bp = stuff;
270: i = sixbit = 0;
271: while (i < NIB) {
272: sixbit = (sixbit<<1) + *bp++;
273: if ((i++%6) == 6-1) {
274: *cp++ = maptab[sixbit];
275: sixbit = 0;
276: }
277: }
278: *cp++ = maptab[sixbit];
279: *cp = '\0';
280: return (passwd);
281: }
282:
283: /*
284: * Perturb the E-table based on 2 6-bit characters
285: * in the salt. It produces a random permutation for
286: * the E-table.
287: */
288: static
289: perturb(salt)
290: char salt[2];
291: {
292: register char *cp;
293: register i1, i2;
294: int salti;
295:
296: salti = 01<<8 | 01;
297: i1 = salt[0];
298: i2 = salt[1];
299: for (cp = maptab; cp < &maptab[NSCSET]; cp++) {
300: if (i1 == *cp)
301: salti |= (cp-maptab)<<1;
302: if (i2 == *cp)
303: salti |= (cp-maptab)<<9;
304: }
305: srand(salti);
306: /*
307: * Make new E-table, from the saved E-table
308: * with random junk added to it (mod NOKB).
309: */
310: for (i1 = 0; i1 < NOKB; i1++)
311: E[i1] = (saveE[i1] + (rand()>>6)) % (NIB/2);
312: }
313:
314: /*
315: * Permute incoming bits into outgoing
316: * chunk with permutation table (`ptab').
317: * `nbites' is the number of bits to
318: * produce from the transformation.
319: */
320: static
321: permute(ibits, obits, ptab, nbits)
322: register char *ibits;
323: register char *obits;
324: char *ptab;
325: {
326: register bitno;
327:
328: for (bitno = 0; bitno<nbits; bitno++)
329: *obits++ = ibits[ptab[bitno]];
330: }
331:
332: /*
333: * The intermediate cypher function
334: * It does a chunk of NIB (64) bits
335: * through the NITER (16) iterations
336: * of the cypher function `f'.
337: */
338: static
339: cypher(ibits, obits, edflag)
340: int edflag;
341: char ibits[NIB];
342: char obits[NIB];
343: {
344: char t1bits[NOKB];
345: char t2bits[NIB/2];
346: char left[NIB/2], right[NIB/2];
347: register int n;
348: register int i;
349:
350: memcpy(left, ibits, NIB/2);
351: memcpy(right, &ibits[NIB/2], NIB/2);
352: for (n=0; n<NITER; n++) {
353: /*
354: * L' = R
355: * R' = L + f(R,K)
356: */
357: permute(right, t1bits, E, NOKB);
358: i = edflag ? NITER-1-n : n;
359: m2add(t1bits, &Ki[i][0], t1bits, NOKB);
360: dosboxes(t1bits, t2bits);
361: permute(t2bits, t1bits, P, NIB/2);
362: m2add(t1bits, left, t2bits, NIB/2);
363: memcpy(left, right, NIB/2);
364: memcpy(right, t2bits, NIB/2);
365: }
366: memcpy(obits, right, NIB/2);
367: memcpy(&obits[NIB/2], left, NIB/2);
368: }
369:
370: /*
371: * Rotate (what DES calls shift) left
372: * `nbits' `bits' by `ns' places.
373: * The shift count is assumed less than
374: * NBPC (8).
375: */
376: static
377: lrot(bits, ns, nbits)
378: char *bits;
379: {
380: register i, nb;
381: register char *bp;
382: int byte;
383:
384: for (i=0; i<ns; i++) {
385: bp = bits;
386: byte = *bp;
387: nb = nbits-1;
388: do {
389: bp[0] = bp[1];
390: bp++;
391: } while (--nb);
392: *bp = byte;
393: }
394: }
395:
396: /*
397: * Modulo 2 addition of bit vectors
398: * `i1' and `i2' into `o'.
399: * `nbits' is the number of bits in
400: * each vector
401: */
402: static
403: m2add(i1, i2, o, nbits)
404: register char *i1, *i2;
405: register nbits;
406: register char *o;
407: {
408: do {
409: *o++ = *i1++ ^ *i2++;
410: } while (--nbits);
411: }
412:
413: /*
414: * Implement the "S-boxes"
415: * Transforming from ibits (NOKB or 48 bits)
416: * to obits (NIB/2 or 32 bits).
417: * For each of these boxes, there is a
418: * 6-bit chunk of the input with the row being
419: * the first and last of these and the column
420: * being the middle 4 bits.
421: */
422: static
423: dosboxes(ibits, obits)
424: char ibits[NOKB];
425: char obits[NIB/2];
426: {
427: register row, col;
428: register boxno;
429: int tempout;
430:
431: tempout = 0;
432: for (boxno=0; boxno < NSBOX; boxno++) {
433: row = col = 0;
434: row = row<<1 | *ibits++;
435: col = col<<1 | *ibits++;
436: col = col<<1 | *ibits++;
437: col = col<<1 | *ibits++;
438: col = col<<1 | *ibits++;
439: row = row<<1 | *ibits++;
440: tempout = (tempout<<4) | Sboxes[boxno][row][col];
441: for (col=0; col<4; col++) {
442: *obits++ = (tempout>>3) & 01;
443: tempout <<= 1;
444: }
445: }
446: }
447:
448: /*
449: * Unpack byte vector into bit vector
450: */
451: static
452: unpack(bytes, nbits)
453: char *bytes;
454: unsigned nbits;
455: {
456: register char *bitp;
457: register char *bp;
458: register i;
459: int byte;
460:
461: bitp = &bytes[nbits];
462: bp = &bytes[(nbits+NBPC-1)/NBPC];
463: for (i=nbits; i>0; i--) {
464: if ((i % NBPC) == 0)
465: byte = *--bp;
466: *--bitp = byte&01;
467: byte >>= 1;
468: }
469: }
470:
471: /*
472: * Pack bit vector into byte data.
473: */
474: static
475: pack(bp, nbits)
476: register char *bp;
477: unsigned nbits;
478: {
479: register i;
480: register char *bitp;
481: int byte;
482:
483: byte = 0;
484: bitp = bp;
485: for (i=0; i<nbits; i++) {
486: byte = byte<<1 | *bitp++;
487: if ((i%NBPC) == NBPC-1) {
488: *bp++ = byte;
489: byte = 0;
490: }
491: }
492: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.