|
|
1.1 ! root 1: static char *sccsid = "@(#)crypt.c 4.2 (Berkeley) 7/9/81"; ! 2: ! 3: /* ! 4: * A one-rotor machine designed along the lines of Enigma ! 5: * but considerably trivialized. ! 6: */ ! 7: ! 8: #define ECHO 010 ! 9: #include <stdio.h> ! 10: #define ROTORSZ 256 ! 11: #define MASK 0377 ! 12: char t1[ROTORSZ]; ! 13: char t2[ROTORSZ]; ! 14: char t3[ROTORSZ]; ! 15: char deck[ROTORSZ]; ! 16: char *getpass(); ! 17: char buf[13]; ! 18: ! 19: setup(pw) ! 20: char *pw; ! 21: { ! 22: int ic, i, k, temp, pf[2]; ! 23: unsigned random; ! 24: long seed; ! 25: ! 26: strncpy(buf, pw, 8); ! 27: while (*pw) ! 28: *pw++ = '\0'; ! 29: buf[8] = buf[0]; ! 30: buf[9] = buf[1]; ! 31: pipe(pf); ! 32: if (fork()==0) { ! 33: close(0); ! 34: close(1); ! 35: dup(pf[0]); ! 36: dup(pf[1]); ! 37: execl("/usr/lib/makekey", "-", 0); ! 38: execl("/lib/makekey", "-", 0); ! 39: exit(1); ! 40: } ! 41: write(pf[1], buf, 10); ! 42: wait((int *)NULL); ! 43: if (read(pf[0], buf, 13) != 13) { ! 44: fprintf(stderr, "crypt: cannot generate key\n"); ! 45: exit(1); ! 46: } ! 47: seed = 123; ! 48: for (i=0; i<13; i++) ! 49: seed = seed*buf[i] + i; ! 50: for(i=0;i<ROTORSZ;i++) { ! 51: t1[i] = i; ! 52: deck[i] = i; ! 53: } ! 54: for(i=0;i<ROTORSZ;i++) { ! 55: seed = 5*seed + buf[i%13]; ! 56: random = seed % 65521; ! 57: k = ROTORSZ-1 - i; ! 58: ic = (random&MASK)%(k+1); ! 59: random >>= 8; ! 60: temp = t1[k]; ! 61: t1[k] = t1[ic]; ! 62: t1[ic] = temp; ! 63: if(t3[k]!=0) continue; ! 64: ic = (random&MASK) % k; ! 65: while(t3[ic]!=0) ic = (ic+1) % k; ! 66: t3[k] = ic; ! 67: t3[ic] = k; ! 68: } ! 69: for(i=0;i<ROTORSZ;i++) ! 70: t2[t1[i]&MASK] = i; ! 71: } ! 72: ! 73: main(argc, argv) ! 74: char *argv[]; ! 75: { ! 76: register i, n1, n2, nr1, nr2; ! 77: int secureflg = 0; ! 78: ! 79: if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 's') { ! 80: argc--; ! 81: argv++; ! 82: secureflg = 1; ! 83: } ! 84: if (argc != 2){ ! 85: setup(getpass("Enter key:")); ! 86: } ! 87: else ! 88: setup(argv[1]); ! 89: n1 = 0; ! 90: n2 = 0; ! 91: nr2 = 0; ! 92: ! 93: while((i=getchar()) >=0) { ! 94: if (secureflg) { ! 95: nr1 = deck[n1]&MASK; ! 96: nr2 = deck[nr1]&MASK; ! 97: } else { ! 98: nr1 = n1; ! 99: } ! 100: i = t2[(t3[(t1[(i+nr1)&MASK]+nr2)&MASK]-nr2)&MASK]-nr1; ! 101: putchar(i); ! 102: n1++; ! 103: if(n1==ROTORSZ) { ! 104: n1 = 0; ! 105: n2++; ! 106: if(n2==ROTORSZ) n2 = 0; ! 107: if (secureflg) { ! 108: shuffle(deck); ! 109: } else { ! 110: nr2 = n2; ! 111: } ! 112: } ! 113: } ! 114: } ! 115: ! 116: shuffle(deck) ! 117: char deck[]; ! 118: { ! 119: int i, ic, k, temp; ! 120: unsigned random; ! 121: static long seed = 123; ! 122: ! 123: for(i=0;i<ROTORSZ;i++) { ! 124: seed = 5*seed + buf[i%13]; ! 125: random = seed % 65521; ! 126: k = ROTORSZ-1 - i; ! 127: ic = (random&MASK)%(k+1); ! 128: temp = deck[k]; ! 129: deck[k] = deck[ic]; ! 130: deck[ic] = temp; ! 131: } ! 132: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.