PROGRAM d7r13 (input,output,dfile); (* driver for routine DES *) LABEL 5,10,99; TYPE gl32array = ARRAY [1..32] OF integer; gl48array = ARRAY [1..48] OF integer; gl56array = ARRAY [1..56] OF integer; gl64array = ARRAY [1..64] OF integer; VAR glicd,ipc1 : gl56array; i,idirec,idum,j,jdum,k,l : integer; m,mm,nciphr,newkey,twopwr : integer; icmp,iin,iout,key,ip,ipm : gl64array; hin,hkey,hout,hcmp : string[17]; verdct : string[8]; txt : string[60]; txt2 : string[6]; ipc2,iet : gl48array; ipp : gl32array; is : ARRAY [1..16,1..4,1..8] OF integer; ibin : ARRAY [1..4,1..16] OF integer; ksflg,cyflg,desflg : boolean; dfile : text; (*$I MODFILE.PAS *) (*$I DESKS.PAS *) (*$I DES.PAS *) FUNCTION hex2int(ch:char) : integer; (* Coverts character representing hexadecimal number to its integer value in a machine-independent way. *) BEGIN IF (ch >= '0') AND (ch <= '9') THEN hex2int := ord(ch)-ord('0') ELSE hex2int := ord(ch)-ord('A')+10 END; FUNCTION int2hex(i:integer) : char; (* Inverse of hex2int *) BEGIN IF i <= 9 THEN int2hex := chr(i+ord('0')) ELSE int2hex := chr(i-10+ord('A')) END; BEGIN ksflg := true; cyflg := true; desflg := true; glopen(dfile,'destst.dat'); readln (dfile,txt); writeln (txt); 5: readln (dfile,txt); IF eof(dfile) THEN GOTO 99; writeln (txt); readln (dfile,nciphr); readln (dfile,txt2); IF (txt2 = 'encode') THEN idirec := 0; IF (txt2 = 'decode') THEN idirec := 1; 10: writeln ('key':10,'plaintext':20, 'expected cipher':21,'actual cipher':15); mm := 16; IF (nciphr < 16) THEN mm := nciphr; nciphr := nciphr-16; FOR m := 1 to mm DO BEGIN readln(dfile,hkey,hin,hcmp); FOR i := 1 to 16 DO BEGIN j := i+1; idum := hex2int(hin[j]); jdum := hex2int(hkey[j]); FOR k := 1 to 4 DO BEGIN l := 4*i+1-k; iin[l] := idum MOD 2; idum := idum DIV 2; key[l] := jdum MOD 2; jdum := jdum DIV 2 END END; newkey := 1; des(iin,key,newkey,idirec,iout); hout := ' '; FOR i := 1 to 16 DO BEGIN jdum := 0; twopwr := 16; FOR j := 1 to 4 DO BEGIN twopwr := twopwr DIV 2; jdum := jdum+twopwr*iout[4*(i-1)+j] END; hout[i+1] := int2hex(jdum) END; verdct := 'wrong '; IF (hcmp = hout) THEN verdct := 'o.k. '; writeln(hkey,hin,hcmp,hout,verdct:10) END; writeln ('press RETURN to continue ...'); readln; IF (nciphr <= 0) THEN GOTO 5; GOTO 10; 99: END.