' Verschlsseln durch Substitution und Addieren
' von Georg Scheibler, 4920 Lemgo
' (c) 1992 MAXON Computer GmbH
DIM c%(256),d%(256)
a$="dies ist ein test"
TEXT 0,13,a$
z%=451
s1%=23
s2%=65
@crypt(z%,s1%,s2%,a$,*b$)
TEXT 0,30,b$
@decrypt(z%,s1%,s2%,b$,*c$)
TEXT 0,50,c$
PROCEDURE crypt(z%,key1%,key2%,s$,d%)
  LOCAL key_1%,key_2%,l%,d$
  IF z%<>c%(256)
    @zufall(z%)
  ENDIF
  l%=LEN(s$)
  d$=s$ !damit nicht zuviel stringmll entsteht
  key_1%=0
  key_2%=0
  FOR i%=1 TO l%
    key_0%=c%(ASC(MID$(s$,i%,1)))
    key_1%=c%((key_1%+key1%+key_0%) AND &HFF)
    key_2%=c%((key_2%+key2%+key_1%) AND &HFF)
    MID$(d$,i%,1)=CHR$(key_2%)
  NEXT i%
  *d%=d$
RETURN
PROCEDURE decrypt(z%,key1%,key2%,s$,d%)
  LOCAL key_1%,key_2%,h1%,h2%,l%,d$
  IF z%<>c%(256)
    @zufall(z%)
  ENDIF
  l%=LEN(s$)
  d$=s$ !damit nicht zuviel stringmll entsteht
  h1%=0
  h2%=0
  FOR i%=1 TO l%
    key_2%=(ASC(MID$(s$,i%,1)))
    key_1%=(d%(key_2%)-h2%-key2%) AND &HFF
    key_0%=(d%(key_1%)-h1%-key1%) AND &HFF
    MID$(d$,i%,1)=CHR$(d%(key_0%))
    h1%=key_1%
    h2%=key_2%
  NEXT i%
  *d%=d$
RETURN
PROCEDURE zufall(x%)
  LOCAL h1%,h2%,xx%
  ' erzeugen einer "zuf„lligen"
  ' Verschlsselungstabelle
  ' mit Pseudozufallzahlen
  '
  h1%=2^11  !maske fr bit 1 (+ obergrenze)
  h2%=2^2  !maske fr bit 2
  x%=x% MOD h1%
  IF x%=0
    INC x%
  ENDIF
  ARRAYFILL c%(),-1
  c%(256)=x% !Schlssel merken
  cnt%=0
  WHILE cnt%<256 !codiertabelle aufbauen
    xx%=x% AND &HFF
    IF c%(xx%)<0 !wert noch nicht dagewesen
      c%(xx%)=cnt% !codiertabelle
      d%(cnt%)=xx% !decodiertabelle
      INC cnt%
    ENDIF
    ADD x%,x%
    IF (x% AND h1%)<>0 XOR (x% AND h2%)<>0
      INC x%
    ENDIF
    IF x%=>h1%
      SUB x%,h1%
    ENDIF
  WEND
RETURN
