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}