[comp.sys.amiga] ENCODE.SHAR data encryption/decryption

dillon@CORY.BERKELEY.EDU (Matt Dillon) (10/31/87)

	Here's a neat little program that you can use to encrypt files.
It's basically a modified DES algorithm..  Take DES, remove the 32-48-32
submaster permutation core, and add a dynamically changing master permutation
array.

	It's rather slow, but that's the tradeoff when you do a 64 bit
permutation.  Oh yah, I almost forgot... I read the entire source file into
memory so if you are encrypting 100K files you should remember that.  You
can encrypt a file on floppy (since it reads the whole file in there isn't
a lot of seeking).  If a write error occurs writing the file back you loose
the file.

	I encourage all those who are serious about encryption to modify
the program.

				Don't forget your passwords!

					-Matt



#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	encode.c
#	bmov.asm
#	bset.asm
#	encode.uue
# This archive created: Fri Oct 30 17:47:00 1987
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'encode.c'" '(5236 characters)'
if test -f 'encode.c'
then
	echo shar: "will not over-write existing file 'encode.c'"
else
cat << \!Funky!Stuff! > 'encode.c'

/*
 *  ENCODE  key file file file ... file 	encrypt specified files
 *  DECODE  key file file file ... file 	decrypt specified files
 *
 *  Aztec Compilation please.  Use the +L option (32 bit ints).
 *
 *  Both are the same program.	The program looks at Arg0 to tell whether
 *  it is encrypting or decrypting.  If arg0 is one of "uUdD" it decrypts,
 *  else encrypts.  Files are a couple of bytes larger after encryption.
 *
 *  The method used is a variation of the DES algorithm.  Take your
 *  everyday DES, remove the 32->48->32 submaster permutation core, and
 *  add a dynamically changing permutation table... simple.
 *
 *  Feel free to modify the algorithm!
 *
 *				Matthew Dillon
 *
 *				...!ihnp4!ucbvax!dillon
 */

#include <stdio.h>
#include <fcntl.h>

#define FUNC(b48,b32)	(b48.b[0] ^ b32)

typedef unsigned long ulong;
typedef unsigned short uword;
typedef unsigned char ubyte;

typedef ulong	B32;
typedef struct { ulong b[2]; } B48;
typedef struct { ulong b[2]; } B56;
typedef struct { ulong b[2]; } B64;

extern ubyte *malloc();

/*
 *  Top level permutation (sets of 64 bits).  Mix it up as much as you
 *  want!
 */

static ubyte Perm[64] = {
     9,57,25,38,13,31,44,32,11,29, 8, 5,37,16,40,62,41, 0,53,47,48,22,24,
    54,45,39,52,34,43,12,63,36,10,55,51,33,28, 3,50,58,35,61,21, 6,26, 2,
    19,23,17, 1,27,42,49,14,56,60,18, 4, 7,20,59,46,15,30
};

static ubyte Iperm[64];
B48 SubMaster[16];	/*  The SUB-MASTER keys */
ubyte	Decrypt;

main(ac,av)
char *av[];
{
    register short i;
    register ubyte *buf;
    long len, elen, cnt;
    B64 key;
    ubyte padchar;

    if (av[0][0] == 'd' || av[0][0] == 'D' || av[0][0] == 'u' || av[0][0] == 'U')
	Decrypt = 1;
    if (ac == 1) {
	puts("DES key [files...]");
	exit(1);
    }
    bzero(&key,sizeof(key));
    bmov(av[1],&key,((strlen(av[1])>sizeof(key))?sizeof(key):strlen(av[1])));
    makeiperm();
    makesubmaster(&key);
    for (i = 2; i < ac; ++i) {
	int fd = open(av[i], O_RDWR);
	if (fd > 0) {
	    /*
	     *	We encrypt at least one more byte than the filesize, and
	     *	additionaly pad to 8 byte boundries.  This last byte is
	     *	the 'pad' byte and is different from the last byte in the
	     *	file... thus allowing the decrypt to restore the file
	     *	completely.
	     */

	    len = lseek(fd, 0L, 2);
	    elen = (len + 8) & ~7;
	    if (buf = malloc(elen)) {
		lseek(fd, 0L, 0);
		read(fd, buf, len);
		close(fd);
		padchar = buf[len-1] + 1;
		bset(buf+len,elen-len,padchar);
		for (cnt = 0; cnt < elen; cnt += 8)
		    cypher(buf+cnt);
		fd = open(av[i], O_WRONLY|O_CREAT|O_TRUNC);
		if (fd >= 0) {
		    if (Decrypt) {
			padchar = buf[(elen=len)-1];
			while (elen && buf[elen-1] == padchar)
			    --elen;
		    }
		    write(fd, buf, elen);
		} else {
		    printf("Unable to reopen for write: %s\n", av[i]);
		}
	    } else {
		printf("Unable to allocate memory for %s\n", av[i]);
	    }
	    close(fd);
	} else {
	    printf("Unable to open %s\n", av[i]);
	}
    }
}

makeiperm()
{
    register short i;
    for (i = 0; i < 64; ++i)
	Iperm[Perm[i]] = i;
}

cypher(b64)
B64 *b64;
{
    B64 Tmp;
    register B32 A,B,T;
    register short i;
    ulong dmod;

    for (i = 0; i < 64; ++i)
	setbit(&Tmp,i,getbit(b64,Perm[i]));
    A = Tmp.b[0];
    B = Tmp.b[1];

    if (Decrypt) {
	for (i = 15; i >= 0; --i) {
	    T = B;
	    B = A;
	    A = T ^ FUNC(SubMaster[i],A);
	}
    } else {
	for (i = 0; i < 16; ++i) {
	    T = A;
	    A = B;
	    B = T ^ FUNC(SubMaster[i],B);
	}
    }
    dmod = (Tmp.b[0] ^ A) >> 8;
    Tmp.b[0] = A;
    Tmp.b[1] = B;
    for (i = 0; i < 64; ++i)
	setbit(b64,i,getbit(&Tmp,Iperm[i]));

    /*
     *	Swap two entries in the Perm/IPerm array depending on dmod:
     */

    {
	short a = dmod & 63;
	short b = (dmod >> 6) & 63;
	short t;

	t = Perm[a]; Perm[a] = Perm[b]; Perm[b] = t;
	a = Perm[a]; b = Perm[b];
	t = Iperm[a]; Iperm[a] = Iperm[b]; Iperm[b] = t;
    }
}

/*
 *  Generate SubMaster keys
 */

makesubmaster(key)
B64 *key;
{
    static ubyte smiperm[64] = {    /*	initial sub-master permutation	*/
	 5,40,29,53, 2,39,25,42,46,35,23,16,49,62,34,63,17, 7,55,11,19,32,
	28, 4, 9, 3,22,21,38,41,20,58,45,37,24,36,57,15,26,54,10, 0,47,14,
	60,12,43, 6, 1,30,31,51,48, 8,44,13,50,61,59,52,18,33,27,56
    };
    static ubyte smselect[48] = {   /*	sub-master select bits		*/
	39,13,15, 4,45,32, 8,62,46,41,20,42,52,54,28, 5,25, 0,31, 2,
	30,36,23, 1,56,37,43,50,34,10, 9,55,51,58,47,26,24, 6,48,49,
	35,14,44, 3,38,60,63,17
    };
    static short shift[16] = { 2,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2 };
    B64 icd;
    register short i, j;

    for (i = 0; i < 64; ++i)
	setbit(&icd,i,getbit(key,smiperm[i]));
    for (i = 0; i < 16; ++i) {
	for (j = shift[i]; j; --j) {
	    icd.b[0] = (icd.b[0] << 1) | (icd.b[0] >> 31);
	    icd.b[1] = (icd.b[1] << 1) | (icd.b[1] >> 31);
	}
	for (j = 0; j < 48; ++j)
	    setbit(&SubMaster[i],j,getbit(&icd,smselect[j]));
    }
}

/*
 *  Set/get bit in 64 bit quantities
 *
 *  63....0
 *
 */

setbit(ptr,bno,val)
ubyte *ptr;
short bno;
ubyte val;
{
    if (val)
	ptr[7-(bno>>3)] |= 1 << (bno&7);
    else
	ptr[7-(bno>>3)] &= ~(1 << (bno&7));
}

getbit(ptr,bno)
ubyte *ptr;
short bno;
{
    if (ptr[7-(bno>>3)] & (1 << (bno&7)))
	return(1);
    return(0);
}

!Funky!Stuff!
fi  # end of overwriting check
echo shar: "extracting 'bmov.asm'" '(1176 characters)'
if test -f 'bmov.asm'
then
	echo shar: "will not over-write existing file 'bmov.asm'"
else
cat << \!Funky!Stuff! > 'bmov.asm'

;BMOV.ASM
;      4    8	12
;BMOV(src,dest,bytes)
;
;   Matthew Dillon
;
;   -Handles ascending/descending moves
;   -Optimizes the move if addresses longword boundries and #bytes
;    is a multiple of 4.
;   -Completely tested

	xdef  _bmov

_bmov
	movem.l 4(A7),A0/A1	;source, destination
	move.l	12(A7),D0	;bytes
	clr.b	D1		;long word boundry flag
	andi.b	#3,15(A7)	;byte count multiple of 4?
	bne	notlwb
	andi.b	#3,7(A7)	;source mulitple of 4?
	bne	notlwb
	andi.b	#3,11(A7)	;destination multiple of 4?
	seq.b	D1		;set longword boundry flag if true
notlwb	cmp.l	A0,A1
	beq	end		;trivial case
	ble	ascend		;ascending copy
	add.l	D0,A0		;descending copy
	add.l	D0,A1

decend	tst.b	D1		;DESCEND
	beq	decbyte
declong lsr.l	#2,D0		;DESCEND LONGWORD
	bra	ab00
ab0	move.l	-(A0),-(A1)
ab00	dbf.w	D0,ab0
	sub.l	#$10000,D0
	bpl	ab0
end	rts

ab1	move.b	-(A0),-(A1)	;DESCEND BYTE
decbyte dbf.w	D0,ab1
	sub.l	#$10000,D0
	bpl	ab1
	rts

ascend	tst.b	D1		;ASCEND
	beq	ascbyte
asclong lsr.l	#2,D0		;ASCEND LONGWORD
	bra	ab22
ab2	move.l	(A0)+,(A1)+
ab22	dbf.w	D0,ab2
	sub.l	#$10000,D0
	bpl	ab2
	rts

ab3	move.b	(A0)+,(A1)+	;ASCEND BYTE
ascbyte dbf.w	D0,ab3
	sub.l	#$10000,D0
	bpl	ab3
	rts


!Funky!Stuff!
fi  # end of overwriting check
echo shar: "extracting 'bset.asm'" '(1076 characters)'
if test -f 'bset.asm'
then
	echo shar: "will not over-write existing file 'bset.asm'"
else
cat << \!Funky!Stuff! > 'bset.asm'

;BSET.ASM
;BZERO.ASM
;
;   Uses longword operations if data is aligned on a longword boundry
;   and the size is a mulitple of 4.  Otherwise, uses byte operations.

	xdef  _bset
	xdef  _bzero

_bzero
	clr.l	D1
	bra	begin
_bset
	move.b	15(A7),D1	;12(A7)-> msb . . lsb	(D1 = data)
begin
	move.l	4(A7),A0	;A0 = address
	move.l	8(A7),D0	;D0 = byte count
	andi.b	#3,11(A7)	;byte count on long word boundry?
	bne	drop
	andi.b	#3,7(A7)	;address on longword boundry?
	bne	drop
	bra	lwb
loop	move.b	D1,(A0)+	;BYTE SET LOOP
drop	dbf.w	D0,loop 	;remember, only effects lower word
	sub.l	#$10000,D0	;for buffers >65535
	bpl	loop		;branch to loop because D0.W now is FFFF
	rts

lwb	lsr.l	#2,D0		;byte count / 4 (longword chunks)
	tst.l	D1		;BZERO
	beq	dropl
	move.b	D1,14(A7)	;15(A7) already contains the byte
	move.w	14(A7),D1	;D1 0..15 set
	swap	D1
	move.w	14(A7),D1	;D1 16..31 set
	bra	dropl

loopl	move.l	D1,(A0)+	;BYTE SET LOOP
dropl	dbf.w	D0,loopl	;remember, only effects lower word
	sub.l	#$10000,D0	;for buffers >65535
	bpl	loopl		;branch to loop because D0.W now is FFFF
	rts



!Funky!Stuff!
fi  # end of overwriting check
echo shar: "extracting 'encode.uue'" '(10663 characters)'
if test -f 'encode.uue'
then
	echo shar: "will not over-write existing file 'encode.uue'"
else
cat << \!Funky!Stuff! > 'encode.uue'
begin 644 encode
M```#\P`````````#``````````(```:L```!#`````$```/I```&K$[Z!LA.
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
M+0`(2'H$KDZZ`)!/[P`,3EU.=4Y5``!(YP@@)&T`$`RM````!``49@@@;0`(
M*!!@%$JM``QO""!M``@H$&`&(&T`""@00JT`%$JM``QL$D2M``Q*A&P*1(0K
M?`````$`%"(M``P@!$ZZ`])![(#24XH4L`@`(BT`#"`$3KH#RB@`9MY*K0`4
M9P93BA2\`"T@"DS?!!!.74YU3E7_%$CG"#`D;0`()FT`#$*M__@K;0`0__P@
M2U*+$!!(@$C`*`!G``,PN+P````E9@`#"D(M_R(K?`````'_]"M\````(/_P
M*WP``"<0_^P@2U*+$!!(@$C`*`"PO````"UF$$*M__0@2U*+$!!(@$C`*`"X
MO````#!F%"M\````,/_P($M2BQ`02(!(P"@`N+P````J9AH@;?_\6*W__"M0
M_^@@2U*+$!!(@$C`*`!@-$*M_^A@(G(*("W_Z$ZZ"<#0A)"\````,"M`_^@@
M2U*+$!!(@$C`*`!![(#E"#```D@`9M*XO````"YF8B!+4HL0$$B`2,`H`+"\
M````*F8:(&W__%BM__PK4/_L($M2BQ`02(!(P"@`8#1"K?_L8")R"B`M_^Q.
MN@E6T(20O````#`K0/_L($M2BQ`02(!(P"@`0>R`Y0@P``)(`&;2*WP````$
M_^2XO````&QF%B!+4HL0$$B`2,`H`"M\````!/_D8!2XO````&AF#"!+4HL0
M$$B`2,`H`"`$8'XK?`````C_X&`<*WP````*_^!@$BM\````$/_@8`@K?/__
M__;_X"\M_^1(;?\B+RW_X"\M__Q.NOVT3^\`$"M`_]P@+?_DT:W__&!:(&W_
M_%BM__PK4/_<+RW_W$ZZ`AQ83RM`_^1@2B!M__Q8K?_\*!!![?\A*TC_W!"$
M8"B0O````&-GXE.`9Y20O`````MG`/]N68!GM%6`9P#_;E>`9P#_<F#,0>W_
M(I'M_]PK2/_D("W_Y+"M_^QO!BMM_^S_Y$JM__1G<"!M_]P,$``M9PHB;?_<
M#!$`*V8T#*T````P__!F*E.M_^@@;?_<4JW_W!`02(!(P"\`3I)83["\____
M_V8*</],WPP03EU.=6`8+RW_\$Z26$^PO/____]F!'#_8.)2K?_X("W_Z%.M
M_^BPK?_D;MI"K?_@8"0@;?_<4JW_W!`02(!(P"\`3I)83["\_____V8$</]@
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
M`@("`@("`@("0$!`0"```````````````````0`````!````````````````
M``````$!`````0`````````````````````!`@````$`````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
9````````%``````#\@```^L````!```#\@``
`
end
!Funky!Stuff!
fi  # end of overwriting check
exit 0
#	End of shell archive