[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;
	}
}