📄 crypt.c
字号:
/*This routine is an exact implementation of Boris Hagelin'scryptographic machine. See U. S. Patent #2,089,603.*/int cagetable[] { 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 8, 8, 9, 10, 12, 16, 16, 17, 18, 20, 24, 32, 32, 33, 34, 36, 40, 48};int warr1[52];int warr2[50];int warr3[46];int warr4[42];int warr5[38];int warr6[34];int *wheel1 warr1;int *wheel2 warr2;int *wheel3 warr3;int *wheel4 warr4;int *wheel5 warr5;int *wheel6 warr6;char key[130];int xxx;/*subroutine to manufacture a wheel*/setup(list,n) int list[]; {int *lp; lp = list; while(--n){ *lp = lp+2; lp[1] = getbit(); if(xxx) putchar(lp[1]+'0'); lp = lp + 2; } *lp = list; lp[1] = getbit(); if(xxx){ putchar(lp[1]+'0'); putchar('\n'); } }/*subroutine to return the next bit from the main routinesargument*/getbit(){ static i,j; int b; b = (key[j] >> i) & 1; if (i++ > 5) { j++; i = 0; } return (b); }main(ncooky,cookyp) int ncooky; char *cookyp[]; { char *ip, *jp; int temp; int random; int i,j; int precious; int crypt; int cage[27]; xxx = 0;/*copy input key and pad with clever junk*/ jp = key; *jp++ = 004; *jp++ = 034; if(ncooky > 1){ while (*jp++ = *cookyp[1]++); jp--; } ip = key; while (jp < key+128) { *jp = jp[-1] ^ *ip++; jp++; }/*manufacture six wheels of various length*/ setup(wheel1,26); setup(wheel2,25); setup(wheel3,23); setup(wheel4,21); setup(wheel5,19); setup(wheel6,17);/*set up the cage bars from the key area*/ jp = key; i = 27; while (i--){ cage[i] = cagetable[*jp++ % 28]; if(xxx && (cage[i] != 0)){ putchar( cage[i]/8 + '0'); putchar( cage[i]%8 + '0'); putchar(' '); } } if(xxx) putchar('\n');/*the internal settings are now completeit's time to turn the crank, running the cagebars against the wheel lugs.*/while ((precious = getchar()) >=0){ temp = 040*wheel1[1] + 020*wheel2[1] + 010*wheel3[1] + 004*wheel4[1] + 002*wheel5[1] + 001*wheel6[1]; wheel1 = *wheel1; wheel2 = *wheel2; wheel3 = *wheel3; wheel4 = *wheel4; wheel5 = *wheel5; wheel6 = *wheel6; random = 0; i = 27; while (i--){ random = random + ((temp & cage[i]) != 0); } random =% 26;/*now we have a random number to use to encrypt the inputit is done in such a way that the process is its owninverse.*/ if ( precious=='\n' || precious==' ') crypt = precious; else{ crypt = ('a' + 'z' - precious + random)%0400; if (crypt >= 'a' && crypt <= 'z' && precious > 'z') crypt =+ 26; if (crypt > 'z' && precious >= 'a' & precious <= 'z') crypt =- 26; if (crypt == '\n' || crypt == ' ') crypt = precious; } putchar(crypt); }flush();return;}char ibuf[512];char obuf[512];char *ibufp;int icnt;int ocnt;getchar(){ if(icnt == 0) { icnt = read(0, ibuf, 512); if(icnt <= 0) return(-1); ibufp = ibuf; } icnt --; return(*ibufp++ & 0377);}putchar(c){ obuf[ocnt++] = c; if(ocnt >= 512) flush();}flush(){ if(ocnt > 0) write(1, obuf, ocnt); ocnt = 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -