home *** CD-ROM | disk | FTP | other *** search
- /* ---( bench/des.c )----------------------------- */
- /* Pro-C Copyright (c) 1988 - 1990 Vestronix Inc. */
- /* Modification to this source is not supported */
- /* by Vestronix Inc. */
- /* All Rights Reserved */
- /* ----------------------------------------------- */
- /* Written NVS 20-Jan-90 */
- /* Modified BRC 2-May-90 */
- /* ----------------------------------------------- */
- /* %W% (%H% %T%) */
-
- /*
- * Modifications
- *
- * Nig 30-Jan-90 Ensure Password is padded to 8 chars with NULL's
- * BRC 2-May-90 made passwords printable 11 character strings
- */
-
- /*
- * Password encryption and decryption routines
- * using the Data Encryption Standard (DES)
- * algorithm. Accepts an eight char password and
- * an eight char encryption key, and produces an
- * eight char encrypted password.
- */
-
- /*
- * Acknowledgments : Brian Carson please expand
- *
- * Also, I don't think we can put the copyright
- * message at the top ! - Nig
- */
-
- #include <stdio.h>
- #include <bench.h>
- #include <passwd.h>
-
- # ifdef ANSI
- static void copy(int [], int []);
- static void defunc( int, int [], int [], int [] );
- static void func( int, int [], int [], int [] );
- static void transpose( int [], int [], int );
- # else
- static void copy();
- static void defunc();
- static void func();
- static void transpose();
- # endif
-
- /* static arrays used for encryption */
- static char mapper[65] =
- ".0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz";
-
- static int
-
- /* InitialTr - initial mapping of text */
- InitialTr[64] =
- {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,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 },
-
- /* FinalTr - final mapping of encrypted text */
- FinalTr[64] =
- {40,8 ,48,16,56,24,64,32,39, 7,47,15,55,23,63,31,38,6 ,
- 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},
-
- /* swap - transpose to swap halves */
- swap[64] =
- {33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,
- 51,52,53,54,55,56,57,58,59,60,61,62,63,64,1 ,2 ,3 ,4 ,
- 5 ,6 ,7 ,8 ,9 ,10,11,12,13,14,15,16,17,18,19,20,21,22,
- 23,24,25,26,27,28,29,30,31,32},
-
- /* lrotate - transpose to do two 28 bit left rotates on 56 bit string */
- lrotate[56] =
- { 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,
- 21,22,23,24,25,26,27,28, 1,30,31,32,33,34,35,36,37,38,39,
- 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,29},
-
- /* rrotate - transpose for two 28 bit right rotates on 56 bit string */
- rrotate[56] =
- {28, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,
- 19,20,21,22,23,24,25,26,27,56,29,30,31,32,33,34,35,36,37,
- 38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55},
-
- /* KeyTr1 - inital key transpose */
- KeyTr1[56] =
- {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},
-
- /* KeyTr2 - second key transpose */
- KeyTr2[48] =
- {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},
-
- /* etr */
- etr[48] =
- {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,29,28,29,30,31,32,1},
-
- /* ptr */
- ptr[32] =
- { 16,7 ,20,21,29,12,28,17,1 ,15,23,26,5 ,18,31,10,2 ,8 ,24,
- 14,32,27, 3,9 ,19,13,30,6 ,22,11,4 ,25},
-
- /* s[][] - array of 8 64 bit transposes - known as S-boxes in
- des encryption algorithm */
- s[8][64] = {
- {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,12,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,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,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,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,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}
- },
-
- /* rots[] - rotates to be performed on key */
- rots[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
-
-
-
- /*
- * TRANSPOSE - apply transpose mapping to data array
- */
- static void transpose( data, tranx, n )
- int data[], tranx[], n;
- {
- int x[64];
- register int i;
-
- copy( x, data );
- for(i=0; i<n; i++ ) {
- data[i] = x[tranx[i]-1];
- }
- }
-
- /*
- * FUNC - function is called during each iteration within des encryption
- */
- static void func( i, key, a, x )
- int i, key[], a[], x[];
- {
- int e[64], y[64], ikey[64];
- register int r, k, j;
-
- copy( e, a );
- transpose( e, etr, 48 );
- for(j=0; j<rots[i]; j++ ) transpose( key, lrotate, 56);
- copy( ikey, key );
- transpose( ikey, KeyTr2, 48 );
- for( j=0; j<48; j++ ) y[j] = e[j]^ikey[j];
- for( k=1; k<=8; k++ ) {
- r = 32*y[6*k-6]+16*y[6*k-1]+8*y[6*k-5]+4*y[6*k-4]+2*y[6*k-3]+y[6*k-2];
- x[4*k-4] = (s[k-1][r]/8)%2;
- x[4*k-3] = (s[k-1][r]/4)%2;
- x[4*k-2] = (s[k-1][r]/2)%2;
- x[4*k-1] = s[k-1][r]%2;
- }
- transpose( x, ptr, 32 );
- }
-
- /*
- * ENCRYPT - encryption algorithm
- */
- void encrypt( text, key )
- char *text, *key;
- {
- int i, btext[64], bkey[64], b[64], x[64];
- register int j;
-
- /*
- * First Pad the text with NULL's, up to 8 chars
- * We are assuming that there is room !!!
- */
- for (i = strlen(text); i <= 8; i++)
- text[i] = '\0';
-
- text_to_bin( text, btext );
- text_to_bin( key, bkey );
- transpose( btext, InitialTr, 64 );
- transpose( bkey, KeyTr1, 56 );
- for( i=0; i<16; i++ ) {
- copy( b, btext );
- for( j=0; j<32; j++ ) btext[j] = b[j+32];
- func( i, bkey, btext, x );
- for( j=0; j<32; j++ ) btext[j+32] = b[j]^x[j];
- }
- transpose( btext, swap, 64 );
- transpose( btext, FinalTr, 64 );
- bin_to_text_64( btext, text );
- }
-
-
- /*
- * DEFUNC - function for decryption
- */
- static void defunc( i, key, a, x )
- int i, key[], a[], x[];
- {
- int e[64], y[64], ikey[64];
- register int r, k, j;
-
- copy( e, a );
- transpose( e, etr, 48 );
- copy( ikey, key );
- transpose( ikey, KeyTr2, 48 );
- for(j=0; j<rots[i]; j++ ) transpose( key, rrotate, 56);
- for( j=0; j<48; j++ ) y[j] = e[j]^ikey[j];
- for( k=1; k<=8; k++ )
- {
- r = 32*y[6*k-6]+16*y[6*k-1]+8*y[6*k-5]+4*y[6*k-4]+2*y[6*k-3]+y[6*k-2];
- x[4*k-4] = (s[k-1][r]/8)%2;
- x[4*k-3] = (s[k-1][r]/4)%2;
- x[4*k-2] = (s[k-1][r]/2)%2;
- x[4*k-1] = s[k-1][r]%2;
- }
- transpose( x, ptr, 32 );
- }
-
-
- /*
- * DECRYPT - decryption algorithm
- */
- void decrypt( text, key )
- char *text, *key;
- {
- int i, btext[64], bkey[64], b[64], x[64];
- register int j;
-
- text_to_bin_64( text, btext );
- text_to_bin( key, bkey );
- transpose( btext, InitialTr, 64 );
- transpose( btext, swap, 64 );
- transpose( bkey, KeyTr1, 56 );
- for( i=15; i>=0; i-- )
- {
- copy( b, btext );
- for( j=0; j<32; j++ ) btext[j+32] = b[j];
- defunc( i, bkey, btext, x );
- for( j=0; j<32; j++ ) btext[j] = b[j+32]^x[j];
- }
- transpose( btext, FinalTr, 64 );
- bin_to_text( btext, text );
- }
-
-
- /*
- * COPY - copy second integer array into first
- */
- static void copy( x, y )
- int x[],y[];
- {
- register int i;
- for(i=0; i<64; i++) x[i] = y[i];
- }
-
-
- /*
- * BIN_TO_TEXT_64 - convert a 64 bit binary array into
- * an 11 byte, 64-bitcode text string
- */
- void bin_to_text_64(bin, text)
- int bin[];
- unsigned char *text;
- {
- unsigned int i, j, x;
-
- for (i = 0; i < 11; text[i++] = mapper[x])
- for (x = 0, j = 0; j < 6 && i * 6 + j < 64; j++)
- if (bin[i * 6 + j])
- x |= 1 << (5 - j);
- }
-
-
- /*
- * TEXT_TO_BIN_64 - convert an 11 byte, 64-bitcode text string into an
- * array of integers
- */
- void text_to_bin_64(text, bin)
- unsigned char *text;
- int bin[];
- {
- int i, j, k, x;
-
- for (j = 0, i = 0; i < 11; i++)
- {
- for (x = 0; x < 64; x++)
- if (mapper[x] == text[i])
- break;
-
- for (k = 0; k < 6 && j < 64; k++, x <<= 1)
- bin[j++] = (x & 0x20) ? 1 : 0;
- }
- }
-
-
- /*
- * BIN_TO_TEXT - convert a 64 bit binary array into
- * an 8 bit text string
- */
- void bin_to_text(bin, text)
- int bin[];
- unsigned char *text;
- {
- unsigned int i, j;
-
- for (i = 0; i < 8; i++)
- for (text[i] = 0, j = 0; j < 8; j++)
- if (bin[(i << 3) | j])
- text[i] |= 1 << (7 - j);
- }
-
-
- /*
- * TEXT_TO_BIN - convert an 8 byte text string into an
- * array of integers
- */
- void text_to_bin(text, bin)
- unsigned char *text;
- int bin[];
- {
- int i;
-
- for (i = 0; i < 64; i++)
- bin[i] = (text[i / 8] >> (7 - i % 8)) & 1;
- }
-