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