1: /*
2: * A one-rotor machine designed along the lines of Enigma
3: * but considerably trivialized.
4: */
5:
6: #define ECHO 010
7: #include <stdio.h>
8: #define ROTORSZ 256
9: #define MASK 0377
10: char t1[ROTORSZ];
11: char t2[ROTORSZ];
12: char t3[ROTORSZ];
13: char *getpass();
14:
15: setup(pw)
16: char *pw;
17: {
18: int ic, i, k, temp, pf[2];
19: unsigned random;
20: char buf[13];
21: long seed;
22:
23: strncpy(buf, pw, 8);
24: while (*pw)
25: *pw++ = '\0';
26: buf[8] = buf[0];
27: buf[9] = buf[1];
28: pipe(pf);
29: if (fork()==0) {
30: close(0);
31: close(1);
32: dup(pf[0]);
33: dup(pf[1]);
34: execl("/usr/lib/makekey", "-", 0);
35: execl("/lib/makekey", "-", 0);
36: exit(1);
37: }
38: write(pf[1], buf, 10);
39: wait((int *)NULL);
40: if (read(pf[0], buf, 13) != 13) {
41: fprintf(stderr, "crypt: cannot generate key\n");
42: exit(1);
43: }
44: seed = 123;
45: for (i=0; i<13; i++)
46: seed = seed*buf[i] + i;
47: for(i=0;i<ROTORSZ;i++)
48: t1[i] = i;
49: for(i=0;i<ROTORSZ;i++) {
50: seed = 5*seed + buf[i%13];
51: random = seed % 65521;
52: k = ROTORSZ-1 - i;
53: ic = (random&MASK)%(k+1);
54: random >>= 8;
55: temp = t1[k];
56: t1[k] = t1[ic];
57: t1[ic] = temp;
58: if(t3[k]!=0) continue;
59: ic = (random&MASK) % k;
60: while(t3[ic]!=0) ic = (ic+1) % k;
61: t3[k] = ic;
62: t3[ic] = k;
63: }
64: for(i=0;i<ROTORSZ;i++)
65: t2[t1[i]&MASK] = i;
66: }
67:
68: main(argc, argv)
69: char *argv[];
70: {
71: register i, n1, n2;
72:
73: if (argc != 2){
74: setup(getpass("Enter key:"));
75: }
76: else
77: setup(argv[1]);
78: n1 = 0;
79: n2 = 0;
80:
81: while((i=getchar()) >=0) {
82: i = t2[(t3[(t1[(i+n1)&MASK]+n2)&MASK]-n2)&MASK]-n1;
83: putchar(i);
84: n1++;
85: if(n1==ROTORSZ) {
86: n1 = 0;
87: n2++;
88: if(n2==ROTORSZ) n2 = 0;
89: }
90: }
91: }
Defined functions
main
defined in line
68;
never used
setup
defined in line
15; used 2 times
Defined variables
t1
defined in line
10; used 7 times
t2
defined in line
11; used 2 times
t3
defined in line
12; used 5 times
Defined macros
ECHO
defined in line
6;
never used
MASK
defined in line
9; used 6 times