Contributor: BAS VAN GAALEN
{Here follow the two files to encode and decode files...}
>--- Begin of file ENCODE.PAS
{$v-,x+}
(*
** 'Encode' ASCII textfile to binary mess.
** Written by Bas van Gaalen.
**
** This is suposed to be unhackable...
*)
program _encode; { ENCODE.PAS }
uses
dos;
var
key:string[8];
{ encode file ---------------------------------------------------------------}
procedure encode(infname:pathstr);
var
infile,outfile:file;
fdir:dirstr; fname:namestr; fext:extstr;
inbuf,outbuf:pointer;
fsize:longint;
srcseg,dstseg,
srcofs,dstofs,
nofbytes,idx,start,rep,outsize:word;
i,src:byte;
begin
assign(infile,infname);
{$i-} reset(infile,1); {$i+}
if ioresult<>0 then halt;
fsize:=filesize(infile);
if fsize>65500 then halt;
getmem(inbuf,fsize);
blockread(infile,inbuf^,fsize,nofbytes);
close(infile);
if nofbytes<>fsize then halt;
if maxavail1 then begin
mem[dstseg:dstofs]:=$f0 or rep;
mem[dstseg:dstofs+1]:=src;
inc(dstofs,2);
end
else begin
if src>=$f0 then begin mem[dstseg:dstofs]:=$f1; inc(dstofs); end;
mem[dstseg:dstofs]:=src; inc(dstofs);
end;
inc(idx,rep);
end;
outsize:=dstofs-start;
freemem(inbuf,fsize);
randseed:=ord(key[length(key)]); i:=0;
for idx:=0 to outsize do begin
mem[dstseg:start+idx]:=mem[dstseg:start+idx] xor
(ord(key[i])+random(ord(key[i]))); i:=1+i mod 8;
end;
fsplit(infname,fdir,fname,fext);
assign(outfile,fdir+fname+'.dat');
rewrite(outfile,1);
blockwrite(outfile,outbuf^,outsize);
freemem(outbuf,fsize);
end;
{ main ----------------------------------------------------------------------}
begin
if (paramcount<>2) or (pos('?',paramstr(1))>0) then begin
writeln('Syntax: ENCODE ');
writeln('Both parameters are required!');
halt;
end;
key:=paramstr(2);
encode(paramstr(1));
writeln('File successfully encoded!');
end.
>--- End of file ENCODE.PAS
>--- Begin of file DECODE.PAS
{$v-}
(*
** 'Decode' Binary mess to textfile.
** Written by Bas van Gaalen.
**
** This is suposed to be unhackable...
*)
program _decode; { DECODE.PAS }
uses
dos;
var
key:string[8];
{ decode file ---------------------------------------------------------------}
procedure decode(infname:pathstr);
var
infile,outfile:file;
fdir:dirstr; fname:namestr; fext:extstr;
dbuf,sbuf:pointer;
idx,i,j,srcseg,srcofs,dstseg,dstofs,start,csize:word;
src,rep:byte;
begin
if maxavail<2*65500 then halt;
getmem(dbuf,65500);
getmem(sbuf,65500);
srcseg:=seg(sbuf^); srcofs:=ofs(sbuf^);
dstseg:=seg(dbuf^); dstofs:=ofs(dbuf^); start:=dstofs;
assign(infile,infname);
{$i-} reset(infile,1); {$i+}
if ioresult<>0 then halt;
if filesize(infile)>65500 then halt;
blockread(infile,sbuf^,filesize(infile));
csize:=filesize(infile);
close(infile);
randseed:=ord(key[length(key)]); j:=0;
for i:=0 to csize do begin
mem[srcseg:srcofs+i]:=mem[srcseg:srcofs+i] xor
(ord(key[j])+random(ord(key[j]))); j:=1+j mod 8;
end;
idx:=0;
while idx0 then halt(4);
blockwrite(outfile,dbuf^,csize);
close(outfile);
freemem(sbuf,65500);
freemem(dbuf,65500);
end;
{ main ----------------------------------------------------------------------}
begin
if (paramcount<>2) or (pos('?',paramstr(1))>0) then begin
writeln('Syntax: DECODE ');
writeln('Both parameters are required!');
halt;
end;
key:=paramstr(2);
decode(paramstr(1));
writeln('File successfully decoded!');
end.
>--- End of file DECODE.PAS