enigma.c (13e21a9da4e11ed8f4410d6375a2eb47de10206f) | enigma.c (5dc67cd725cbe9284fb4250b1cd5789beb3f0cff) |
---|---|
1/* 2 * "enigma.c" is in file cbw.tar from 3 * anonymous FTP host watmsg.waterloo.edu: pub/crypt/cbw.tar.Z 4 * 5 * A one-rotor machine designed along the lines of Enigma 6 * but considerably trivialized. 7 * 8 * A public-domain replacement for the UNIX "crypt" command. 9 * 10 * Upgraded to function properly on 64-bit machines. 11 */ 12 | 1/* 2 * "enigma.c" is in file cbw.tar from 3 * anonymous FTP host watmsg.waterloo.edu: pub/crypt/cbw.tar.Z 4 * 5 * A one-rotor machine designed along the lines of Enigma 6 * but considerably trivialized. 7 * 8 * A public-domain replacement for the UNIX "crypt" command. 9 * 10 * Upgraded to function properly on 64-bit machines. 11 */ 12 |
13#define ECHO 010 | 13#include <sys/types.h> 14#include <sys/wait.h> 15 |
14#include <stdio.h> | 16#include <stdio.h> |
17#include <stdlib.h> 18#include <string.h> 19#include <unistd.h> 20 21#define MINUSKVAR "CrYpTkEy" 22 23#define ECHO 010 |
|
15#define ROTORSZ 256 16#define MASK 0377 17char t1[ROTORSZ]; 18char t2[ROTORSZ]; 19char t3[ROTORSZ]; 20char deck[ROTORSZ]; | 24#define ROTORSZ 256 25#define MASK 0377 26char t1[ROTORSZ]; 27char t2[ROTORSZ]; 28char t3[ROTORSZ]; 29char deck[ROTORSZ]; |
21char *getpass(); | |
22char buf[13]; 23 | 30char buf[13]; 31 |
24void shuffle(); 25void puth(); | 32void shuffle(char *); |
26 27void 28setup(pw) | 33 34void 35setup(pw) |
29char *pw; | 36 char *pw; |
30{ 31 int ic, i, k, temp, pf[2], pid; 32 unsigned random; 33 long seed; 34 35 strncpy(buf, pw, 8); 36 while (*pw) 37 *pw++ = '\0'; --- 54 unchanged lines hidden (view full) --- 92 while(t3[ic]!=0) ic = (ic+1) % k; 93 t3[k] = ic; 94 t3[ic] = k; 95 } 96 for(i=0;i<ROTORSZ;i++) 97 t2[t1[i]&MASK] = i; 98} 99 | 37{ 38 int ic, i, k, temp, pf[2], pid; 39 unsigned random; 40 long seed; 41 42 strncpy(buf, pw, 8); 43 while (*pw) 44 *pw++ = '\0'; --- 54 unchanged lines hidden (view full) --- 99 while(t3[ic]!=0) ic = (ic+1) % k; 100 t3[k] = ic; 101 t3[ic] = k; 102 } 103 for(i=0;i<ROTORSZ;i++) 104 t2[t1[i]&MASK] = i; 105} 106 |
107int |
|
100main(argc, argv) | 108main(argc, argv) |
101char *argv[]; | 109 char *argv[]; |
102{ 103 register int i, n1, n2, nr1, nr2; | 110{ 111 register int i, n1, n2, nr1, nr2; |
104 int secureflg = 0; | 112 int secureflg = 0, kflag = 0; 113 char *cp; |
105 | 114 |
106 if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 's') { 107 argc--; 108 argv++; 109 secureflg = 1; | 115 if (argc > 1 && argv[1][0] == '-') { 116 if (argv[1][1] == 's') { 117 argc--; 118 argv++; 119 secureflg = 1; 120 } else if (argv[1][1] == 'k') { 121 argc--; 122 argv++; 123 kflag = 1; 124 } |
110 } | 125 } |
111 if (argc != 2){ | 126 if (kflag) { 127 if ((cp = getenv(MINUSKVAR)) == NULL) { 128 fprintf(stderr, "%s not set\n", MINUSKVAR); 129 exit(1); 130 } 131 setup(cp); 132 } else if (argc != 2) { |
112 setup(getpass("Enter key:")); 113 } 114 else 115 setup(argv[1]); 116 n1 = 0; 117 n2 = 0; 118 nr2 = 0; 119 | 133 setup(getpass("Enter key:")); 134 } 135 else 136 setup(argv[1]); 137 n1 = 0; 138 n2 = 0; 139 nr2 = 0; 140 |
120 while((i=getchar()) >=0) { | 141 while((i=getchar()) != -1) { |
121 if (secureflg) { 122 nr1 = deck[n1]&MASK; 123 nr2 = deck[nr1]&MASK; 124 } else { 125 nr1 = n1; 126 } 127 i = t2[(t3[(t1[(i+nr1)&MASK]+nr2)&MASK]-nr2)&MASK]-nr1; 128 putchar(i); --- 4 unchanged lines hidden (view full) --- 133 if(n2==ROTORSZ) n2 = 0; 134 if (secureflg) { 135 shuffle(deck); 136 } else { 137 nr2 = n2; 138 } 139 } 140 } | 142 if (secureflg) { 143 nr1 = deck[n1]&MASK; 144 nr2 = deck[nr1]&MASK; 145 } else { 146 nr1 = n1; 147 } 148 i = t2[(t3[(t1[(i+nr1)&MASK]+nr2)&MASK]-nr2)&MASK]-nr1; 149 putchar(i); --- 4 unchanged lines hidden (view full) --- 154 if(n2==ROTORSZ) n2 = 0; 155 if (secureflg) { 156 shuffle(deck); 157 } else { 158 nr2 = n2; 159 } 160 } 161 } |
162 163 return 0; |
|
141} 142 143void 144shuffle(deck) 145 char deck[]; 146{ 147 int i, ic, k, temp; 148 unsigned random; --- 4 unchanged lines hidden (view full) --- 153 random = seed % 65521; 154 k = ROTORSZ-1 - i; 155 ic = (random&MASK)%(k+1); 156 temp = deck[k]; 157 deck[k] = deck[ic]; 158 deck[ic] = temp; 159 } 160} | 164} 165 166void 167shuffle(deck) 168 char deck[]; 169{ 170 int i, ic, k, temp; 171 unsigned random; --- 4 unchanged lines hidden (view full) --- 176 random = seed % 65521; 177 k = ROTORSZ-1 - i; 178 ic = (random&MASK)%(k+1); 179 temp = deck[k]; 180 deck[k] = deck[ic]; 181 deck[ic] = temp; 182 } 183} |
161 162void 163puth( title, cp, len ) 164char *title; 165char *cp; 166int len; 167{ 168 fprintf( stderr, "%s = ", title); 169 while( len-- > 0 ) { 170 fprintf(stderr, "%2.2x ", (*cp++) & 0xFF ); 171 } 172 fprintf(stderr,"\n"); 173} | |