Path: cactus.org!news.dell.com!swrinde!cs.utexas.edu!not-for-mail
From: boucher@csl.sri.com (Peter K. Boucher)
Newsgroups: sci.crypt

Subject: Dynamic Substitution?
Date: 15 Nov 1994 18:31:06 -0600
Organization: UTexas Mail-to-News Gateway
Lines: 59
Sender: nobody@cs.utexas.edu
Message-ID: <9411160031.AA15776@redwood.csl.sri.com>
NNTP-Posting-Host: news.cs.utexas.edu

I coded this up based on a description under a thread about
improving RC4.  It runs a little faster than optimized DES.

Does it infringe on Ritter's Dynamic Substitution patent?

Anyone see a weakness (assuming rand32() is good)?

-Peter

======================== clip clip ========================

extern unsigned char estab[256]; /* A substitution table */
extern unsigned char dstab[256]; /* Its inverse */

extern unsigned long rand32();

#define BUFSIZE 8192
#define IV_SIZE 256

#define SWAP_TABS(TMP1,TMP2,A,B) \
	TMP1=estab[A]; \
	TMP2=estab[B]; \
	dstab[TMP1]=B; \
	dstab[TMP2]=A; \
	estab[B]=TMP1; \
	estab[A]=TMP2;


void stream_crypt(buf, buf_length, encrypting)
unsigned char *buf;
register int buf_length, encrypting;
{
    register unsigned char cleart, rnd_char1, rnd_char2, tmp1, tmp2;
    register unsigned long rnd_long;
    register int i, need_a_long=1;

    for (i=buf_length; i--;) {

	if (need_a_long) {
	    rnd_long = rand32();
	    rnd_char1 = ( rnd_long        & 255);
	    rnd_char2 = ((rnd_long >>  8) & 255);
	    need_a_long = 0;
	} else {
	    rnd_char1 = ((rnd_long >> 16) & 255);
	    rnd_char2 =  (rnd_long >> 24)       ;
	    need_a_long = 1;
	}

	if (encrypting == 0) { /* DECRYPTING */
	    cleart = buf[i] = dstab[rnd_char1^estab[buf[i]]];
	} else { /* ENCRYPTING */
	    cleart = buf[i];
	    buf[i] = dstab[rnd_char1^estab[cleart]];
	}

	SWAP_TABS(tmp1, tmp2, rnd_char2, cleart);
    }
}