VARIABLE'AREA:
       MAP1 KEY,S,16
       MAP1 FLNM,S,10
       MAP1 EXT,S,3
       MAP1 BULK,S,510
       MAP1 MOD,S,510
       MAP1 A(95),F
       MAP1 B(95),F
       MAP1 PASS,S,16
       MAP1 EC,S,1
       MAP1 NULL,S,510,""
       MAP1 R$,S,3
       KEY[5;1]="6"
START'UP:
 ? tab(-1,0);"CRYPTO Code/Decode PROGRAM for software security...10/25/79"
 call PASSWORD
 ? tab(4,1);:input "Enter password? ",PASS
   if KEY<>PASS ?"Bad Password....":END
KEYWORD:
 ? tab(4,8);"________________<";tab(4,1);
 input "Keyword >",KEY
   L=len(KEY):? tab(-1,0);
   if L<4 ?"Keyword must be a least 4 characters long.":goto KEYWORD
 input "Filename to be coded/decoded? ",FLNM
CODEALPHA:
 ? "Coding new alphabet....."
       FLNM=ucs(FLNM)
   POS=0
   CHAR=31
  OK:
       POS=POS+1
         if POS>L POS=1
       CHAR=CHAR+1
         if CHAR>126 goto FINISH
       ? "Coding ";chr(CHAR)
       P=CHAR-31
       A(P)=CHAR+asc(KEY[POS;1])-31
  SEARCH:
       if A(P)>126 A(P)=A(P)-95
          if P=1 goto OK2
          for j=1 to P-1
               if A(j)=A(P) A(P)=A(P)+1:j=P:next:goto SEARCH
               next
  OK2:
       POS=POS+1
         if POS>L POS=1
       CHAR=CHAR+1
         if CHAR>126 goto FINISH
       ? "Coding ";chr(CHAR)
       P=CHAR-31
       A(P)=CHAR-asc(KEY[POS;1])+31
  SEARCH2:
       if A(P)<32 A(P)=A(P)+95
          for j=1 to P-1
               if A(j)=A(P) A(P)=A(P)-1:j=P:next:goto SEARCH2
               next
        goto OK
 FINISH:
       x=instr(1,FLNM,".")
       for i=1 to L
         CHARTL=CHARTL+ASC(KEY[i;1])
         next
       INSERT=int(CHARTL/100)
       if FLNM[x;4]=".CDE" goto DECODE
CODE:
       ?:? "The original file will be destroyed and a new file,"
       ?"   with the extension .CDE will be created."
       open#1,FLNM,input
               open#2,FLNM[1;x]+"CDE",output
  NEXT'LINE:
       input line#1,BULK
               if EOF(1)=1 goto END'OF'FILE
       k=len(BULK)
       MOD=NULL
       call PATTERN
       call REVERSE
  CODE'IT:
       j=0
       for i=1 to k
               j=j+1
               if asc(BULK[i;1])<32 MOD[j;1]=BULK[i;1]:goto INEXT
               MOD[j;1]=chr(A(asc(BULK[i;1])-31))
                 if i/INSERT=int(i/INSERT) call EXTRACHAR
               INEXT:
               next
       ?#2 MOD:? MOD
       goto NEXT'LINE
 END'OF'FILE:
       close#2
       close#1
       kill FLNM
       END
DECODE:
       ?:? "The original file will be recreated for your use."
       ?"   The Coded file will remain on disk as is."
       input "Extension name of file being decoded? ",EXT
               EXT=ucs(EXT)
       open#1,FLNM,input
               open#2,FLNM[1,x]+EXT,output
 CONVERTALPHA:
       for i=1 to 95
          B(A(i)-31)=i+31
          next
  NEXT'LINE2:
       input line#1,MOD
               if EOF(1)=1 goto END'OF'FILE2
       k=len(MOD)
       BULK=NULL
  DECODE'IT:
       j=0
       for i=1 to k
           j=j+1
           if asc(MOD[i;1])<32 BULK[j;1]=MOD[i;1]:goto IINEXT
           BULK[j;1]=chr(B(asc(MOD[i;1])-31))
             if j/INSERT=int(j/INSERT) goto DELCHAR
           goto IINEXT
       DELCHAR:
           i=i+1
         IINEXT:
           next
       k=len(BULK)
       call REVERSE
       call PATTERN
       ?#2 BULK:? BULK
       goto NEXT'LINE2
 END'OF'FILE2:
       close#2
       close#1
       END
EXTRACHAR:
       EC=chr(int(RND(x)*94+32))
       j=j+1
       MOD[j;1]=EC
       RETURN
LETTER4:
       KEY[4,4]="/"
       RETURN
PATTERN:
       k=len(BULK)
       UPDOWN=5*(k/5-int(k/5))+8
               for fxit=8 to 13
                 if UPDOWN>fxit-.1 and UPDOWN<fxit+.1 UPDOWN=fxit
                 next
       if k<UPDOWN RETURN
  VALID:
       if asc(BULK[UPDOWN;1])<32 UPDOWN=UPDOWN+1:goto VALID
       if k<UPDOWN RETURN
       FREQ=5*(CHARTL/5-int(CHARTL/5))+3
               for fxit=3 to 8
                 if FREQ>fxit-.1 and FREQ<fxit+.1 FREQ=fxit
                 next
       for i=UPDOWN to k step FREQ
          if asc(BULK[i;1])<32 goto PNEXT
          if FLNM[x;4]=".CDE" goto DEPATTERN
               ec=asc(BULK[i;1])+UPDOWN
               if ec>126 ec=ec-95
               goto XIT
          DEPATTERN:
               ec=asc(BULK[i;1])-UPDOWN
               if ec<32 ec=ec+95
          XIT:
               BULK[i;1]=chr(ec)
          PNEXT:
               next
       RETURN
LETTER3:
       KEY[3;1]="X"
       goto LETTER4
LETTER2:
       KEY[2;1]="B"
       goto LETTER3
REVERSE:
       RP=0
       if k/2=int(k/2) RP=1
       if k/4=int(k/4) RP=2
       if k/6=int(k/6) RP=3
       if RP=0 RETURN
       for i=1 to k step RP*2
               R$=BULK[i;RP]
               BULK[i;RP]=BULK[i+RP;RP]
               BULK[i+RP;RP]=R$
               next
       RETURN
PASSWORD:
       KEY[1;1]="C"
       goto LETTER2