[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
crypt last attempt
Problems with mailer on last post, again; Last try.
Recently, someone posted a message which contained a chaos-based crypt routine.
How, does this compare to the one-rotor crypt routine found in (UNIX) /bin?
Which would be easier to crack, and why?
Source listings attached. Thanks in advance, and sorry about my mail probs and
lack of experience regarding crypto (but, I am learning).
(Now, off to kill a mail tool...)
Buckley Collum
/* crypt.c */
/* CHAOS encryption/decryption routine */
/*-------------------------------------*/
/* Written by Chris Raile 1989 */
/* [email protected] */
/* [email protected] */
/*-------------------------------------*/
/* Implementation: */
/* */
/* 'in' File to be en/decrypted */
/* 'out' Resulting en/decrypted file */
#include "stdio.h"
main()
{
FILE *fptrin;
FILE *fptrout;
int i, ch;
double r = 3.56994571869;
double j, x=.31379412; /* <-- change numbers after 1st '3' */
fptrin = fopen("in","rb"); /* to alter encryption scheme (key) */ fptrout = fopen("out","wb");
while ( (ch=getc(fptrin)) != EOF)
{
x=(r*x)*(1-x);
j=x*100;
i=(int)j;
ch=i^ch;
putc(ch,fptrout);
}
fclose(fptrin);
fclose(fptrout);
}
static char *sccsid = "@(#)crypt.c 4.2 (Berkeley) 7/9/81";
/*
* A one-rotor machine designed along the lines of Enigma
* but considerably trivialized.
*/
#define ECHO 010
#include <stdio.h>
#define ROTORSZ 256
#define MASK 0377
char t1[ROTORSZ];
char t2[ROTORSZ];
char t3[ROTORSZ];
char deck[ROTORSZ];
char *getpass();
char buf[13];
setup(pw)
char *pw;
{
int ic, i, k, temp, pf[2];
unsigned random;
long seed;
strncpy(buf, pw, 8);
while (*pw)
*pw++ = '\0';
buf[8] = buf[0];
buf[9] = buf[1];
pipe(pf);
if (fork()==0) {
close(0);
close(1);
dup(pf[0]);
dup(pf[1]);
execl("/usr/lib/makekey", "-", 0);
execl("/lib/makekey", "-", 0);
exit(1);
}
write(pf[1], buf, 10);
wait((int *)NULL);
if (read(pf[0], buf, 13) != 13) {
fprintf(stderr, "crypt: cannot generate key\n");
exit(1);
}
seed = 123;
for (i=0; i<13; i++)
seed = seed*buf[i] + i;
for(i=0;i<ROTORSZ;i++) {
t1[i] = i;
deck[i] = i;
}
for(i=0;i<ROTORSZ;i++) {
seed = 5*seed + buf[i%13];
random = seed % 65521;
k = ROTORSZ-1 - i;
ic = (random&MASK)%(k+1);
random >>= 8;
temp = t1[k];
t1[k] = t1[ic];
t1[ic] = temp;
if(t3[k]!=0) continue;
ic = (random&MASK) % k;
while(t3[ic]!=0) ic = (ic+1) % k;
t3[k] = ic;
t3[ic] = k;
}
for(i=0;i<ROTORSZ;i++)
t2[t1[i]&MASK] = i;
}
main(argc, argv)
char *argv[];
{
register i, n1, n2, nr1, nr2;
int secureflg = 0;
if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 's') {
argc--;
argv++;
secureflg = 1;
}
if (argc != 2){
setup(getpass("Enter key:"));
}
else
setup(argv[1]);
n1 = 0;
n2 = 0;
nr2 = 0;
while((i=getchar()) >=0) {
if (secureflg) {
nr1 = deck[n1]&MASK;
nr2 = deck[nr1]&MASK;
} else {
nr1 = n1;
}
i = t2[(t3[(t1[(i+nr1)&MASK]+nr2)&MASK]-nr2)&MASK]-nr1;
putchar(i);
n1++;
if(n1==ROTORSZ) {
n1 = 0;
n2++;
if(n2==ROTORSZ) n2 = 0;
if (secureflg) {
shuffle(deck);
} else {
nr2 = n2;
}
}
}
}
shuffle(deck)
char deck[];
{
int i, ic, k, temp;
unsigned random;
static long seed = 123;
for(i=0;i<ROTORSZ;i++) {
seed = 5*seed + buf[i%13];
random = seed % 65521;
k = ROTORSZ-1 - i;
ic = (random&MASK)%(k+1);
temp = deck[k];
deck[k] = deck[ic];
deck[ic] = temp;
}
}