0 CLS:SCREEN 0:CLEAR:PRINT:PRINT" CFRJMK M2.0 by James Main Kenney 1997":PRINT:PRINT" Distribute exact copies freely":PRINT:PRINT:PRINT"At (letter) prompts press only ENTER for default; ESC to rerun or exit":PRINT:DEFSTR A-I:DEFINT J-Z:GOTO 40 1 IF A>""THEN IF EOF(1)OR IK=CHR$(27)THEN RETURN ELSE P=ASC(INPUT$(1,1))ELSE IF P=13 THEN P=10 ELSE P=ASC(INPUT$(1)):IF P=27 THEN RETURN 2 N=(P+224)AND 255:IF T THEN T=1+(N-1)\90:N=N-(T-1)*90 ELSE IF N>94 THEN 1 3 M=N:IF T THEN IF T<>U THEN M=90+T 4 FOR JL=0 TO K MOD SL:GOSUB 20:NEXT:Z!=Z!+1:M=(L+K-M)MOD L:Q=M+32:IF T=0 THEN IF M>90 THEN U=M-90:GOTO 1 ELSE Q=(Q+(U-1)*90)AND 255:P=Q 5 IF C>""THEN PRINT#3,CHR$(Q); 6 IF T THEN IF T<>U THEN U=T:GOTO 3 7 IF SC THEN W!=W!+1:M!=M!+M:N!=N!+N:Q!=Q!+M^2:R!=R!+N^2:P!=P!+M*N 8 Y!=Y!+1:SP=(SP+P)MOD L:IK=INKEY$:IF IK=""THEN IF S=1 THEN 1 ELSE IF S=0 THEN PRINT CHR$(P);:GOTO 1 ELSE IF S<5 THEN LOCATE 21,23:PRINT Y! 9 IF S=2 THEN LOCATE 3,1:PRINT G:LOCATE 15,1:PRINT F ELSE IF S=4 THEN PSET(K MOD L,K\L):PSET(109+(K AND 127),K\128):PSET(251+(K AND 63),K\64) 10 IF S=3 THEN PSET(N+1,M+1):IF W!>1 AND (KC OR IK>""OR EOF(1))THEN U!=SQR((W!*Q!-M!^2)*(W!*R!-N!^2)):IF U!THEN LOCATE 15,22:PRINT CSNG((W!*P!-M!*N!)/U!);SPACE$(6):LOCATE 17,13:PRINT W! 11 IF S=5 THEN TL=(TL+1)MOD L:PSET(TL,K MOD L):TA=(TA+1)MOD 81:PSET(99+TA,K MOD L):TB=(TB+1)MOD 69:PSET(184+TB,K MOD L):TC=(TC+1)MOD 59:PSET(257+TC,K MOD L):TV=TV+1:OV=OV+TV\(SW-SB):TV=TV MOD (SW-SB):PSET(TV,96+K MOD L) 12 IF IK=""OR IK=CHR$(27)THEN 1 ELSE IF IK<>" "THEN J=INSTR("CPBSOKT=cpbsokt",IK)MOD 8:IF J=1 AND S=3 THEN KC=KC+1 AND 1:GOTO 14 ELSE IF J>1 THEN S=J-2 ELSE IF S=3 THEN 1 ELSE IF S=5 THEN IF SB THEN SB=0 ELSE SB=(SW-TV)MOD SW:IF OV=0 THEN 1 13 TL=0:TA=0:TB=0:TC=0:TV=0:OV=0:CLS:IF SC=0 AND S>2 THEN SCREEN 1:SW=320:SC=1 14 IF S=2 THEN LOCATE 1,1:PRINT"Keystring:":LOCATE 13,1:PRINT"Fontstring:"ELSE IF S=3 THEN LOCATE 15,1:PRINT"Correlation coeff. = ":PRINT:PRINT"Data pairs: ":PRINT"Key C toggles auto/manual":IF KC THEN PRINT SPACE$(26)ELSE PRINT"ENTER updates correlation 15 IF S>1 AND S<5 THEN LOCATE 21,1:PRINT"Plaintext characters: ":PRINT"Spacebar clears screen":PRINT"Keys P,B,S,O,K,T change display 16 GOTO 1 20 IF UA THEN K=K+SP 21 IF RG THEN K=K+INT(L*RND(1)) 22 IF X THEN IF EOF(2)THEN GOSUB 30 23 IF X THEN K=K+ASC(INPUT$(1,2)):X!=X!+1 24 IF W THEN K=K+ASC(MID$(G,Z MOD W+1,1)):K=K+ASC(MID$(G,K MOD W+1,1)):MID$(G,Z MOD W+1)=CHR$(K MOD L+32) 25 IF F>""THEN K=K+ASC(MID$(F,K MOD L+1,1)):J=K MOD(L-Z MOD L)+1:I=MID$(F,J,1):F=LEFT$(F,J-1)+RIGHT$(F,L-J)+I:K=K+ASC(I)+J 26 K=K AND 8191:Z=(Z AND 16383)+1:RETURN 30 CLOSE 2:OPEN B FOR INPUT AS 2:X=X+1:XM!=X!:X!=0:RETURN 40 ON ERROR GOTO 100:L=95:D="Plaintext file":E="Ciphertext file":PRINT:PRINT"(E)ncrypt or (D)ecrypt";:I="DdEe":GOSUB 80:IF J THEN CLS:IF J>2 THEN T=1:H=" encrypt"ELSE F=D:D=E:E=F:H=" decrypt"ELSE BEEP:GOTO 40 41 FILES:PRINT D" to"H"? ";:LINE INPUT A:IF A>""THEN OPEN A FOR INPUT AS 1 ELSE IF T=0 THEN ERROR 49 42 G="To change, edit line 42 in the ASCII version of this program and replace this statement with random characters (247 max; no double quotes), or replace temporarily (or add to) from a file. Do not alter length if editing after program is compiled. 43 CLS:PRINT"Resident keytext: "G:PRINT" Use as is or:":PRINT" (C)ut length":PRINT" (A)dd to from file":PRINT" (S)ubstitute from file":PRINT" (N)o resident keytext";:I="CASN=casn":GOSUB 80:J=J MOD 5 44 IF J=1 THEN PRINT" Cut from"LEN(G)"characters to";:INPUT W:IF W>0 THEN G=LEFT$(G,W):GOTO 43 ELSE 43 ELSE CLS:IF J>2 THEN G=" 45 IF J=2 OR J=3 THEN FILES:LINE INPUT"Resident keytext file? ";B:IF B=""THEN 42 ELSE OPEN B FOR INPUT AS 2:WHILE EOF(2)=0 AND LEN(G)<255:G=G+INPUT$(1,2):WEND:CLOSE 2:GOTO 43 46 FILES:LINE INPUT"Keyfile? ";B:IF B=""THEN CLS:GOTO 49 ELSE INPUT" Skip 0 characters";SK!:PRINT" (F)or fontstring only";:I="FfYy":GOSUB 80:O=J:IF T THEN INPUT" Add 0 random characters to keyfile";M:IF M THEN OPEN B FOR APPEND AS 2 47 IF M THEN PRINT" Tap keys randomly; (ESC) ends":F=INPUT$(1):WHILE NCHR$(27):I="":WHILE I="":J=(J+INT(L*RND))MOD L:PRINT CHR$(J+32);:I=INKEY$:WEND:N=N+1:W=(W+J+ASC(I))MOD L:F=CHR$(W+32):PRINT#2,F;:COLOR 0,7:PRINT" "F;N;:COLOR 7,0:WEND 48 GOSUB 30:GOSUB 90:CLS 49 FILES:PRINT E"? ";:LINE INPUT C:IF C>""THEN OPEN C FOR OUTPUT AS 3 ELSE IF T THEN ERROR 49 50 CLS:PRINT"(N)o autokey";:I="Nn":GOSUB 80:UA=J:PRINT"(U)se pseudorandom generator";:I="UuYy":GOSUB 80:RG=J:INPUT"Security level 1";SL:IF SL<1 THEN SL=1 51 IF A>""THEN PRINT:PRINT"Display plaintext or:":PRINT"(B)lank screen":PRINT"(S)trings":PRINT"(O)ut-in":PRINT"(K)ey":PRINT"(T)ime-key";:I="BSOKT=bsokt":GOSUB 80:S=J MOD 6:IF S=3 THEN PRINT" (C)ontinuous correlation";:I="CcYy":GOSUB 80:IF J THEN KC=1 52 IF S>2 THEN SW=320:INPUT" Screen 1 for pixel plot";SC:IF SC=0 THEN SC=1 ELSE IF SC=2 OR SC=4 OR (SC>7 AND SC<13)THEN SW=640 53 N=0:K=0:PRINT:LINE INPUT"Passwords? ";F:V=LEN(F):IF V THEN FOR J=1 TO V:M=ASC(MID$(F,J,1)):N=M+N AND 16383:K=M*(1+(J AND 63))+K AND 16383:NEXT:PRINT V"chrs; chk:"N;K;CHR$(N MOD L+32);CHR$(K MOD L+32)" (R)edo";:I="RrYy":GOSUB 80:IF J THEN 53 54 IF G=""THEN G=F 55 W=LEN(G):M=W:IF V=0 THEN F=G:V=W ELSE IF V>W THEN M=V 56 IF M THEN PRINT:PRINT"Keystring:":FOR J=1 TO M:K=K+ASC(MID$(G,J MOD W+1,1))+ASC(MID$(F,J MOD V+1,1)):K=K+ASC(MID$(F,K MOD V+1,1)):K=K+ASC(MID$(G,K MOD W+1,1)):I=CHR$(K MOD L+32):GF=GF+I:PRINT I;:K=(K+ASC(MID$(GF,K MOD J+1,1)))AND 8191:NEXT 57 IF M THEN W=M:G=GF:GF="":F="":PRINT:PRINT" (F)or fontstring only";:I="FfYy":GOSUB 80:IF J THEN 59 ELSE UF=1 58 IF O=0 THEN PRINT"(N)o fontstring";:I="Nn":GOSUB 80:IF J THEN 63 59 FOR J=32 TO 126:F=F+CHR$(J):NEXT:CLS:PRINT"Fontstring: "F:INPUT" 3 permutations";P:IF P=0 THEN P=3 60 FOR N=1 TO P:PRINT"Pmt"N"of"STR$(P)": ";:PA=0:PS=0:Q=0:FOR V=1 TO L:GOSUB 20:PRINT I;:U=SGN(ASC(I)-PA):PA=ASC(I):IF V>1 AND U<>PS THEN Q=Q+1:PS=U 61 NEXT:PRINT:PRINT Q"runs";:T!=T!+Q:IF N>1 THEN M!=T!/N:S!=S!+(Q-M!)^2:PRINT"; mean:"M!" ssd:"CSNG(SQR(S!/(N-1)))ELSE PRINT 62 NEXT 63 IF X THEN X=0:IF O=0 THEN GOSUB 30:GOSUB 90 64 U=1:W=W*UF:Z=0:IF S THEN CLS ELSE PRINT:PRINT"Plaintext";:IF A=""THEN BEEP:PRINT"? (ESC) ends"ELSE PRINT": 65 IF S>2 THEN SCREEN SC:IF S=3 THEN FOR N=0 TO 1:FOR J=0 TO 77:PSET(J+J\4,N*96):NEXT:FOR J=0 TO 76:PSET(N*96,J+(J+1)\4+1):NEXT:NEXT 66 PRINT:BE=TIME$:GOSUB 14:EE=TIME$:BEEP:CLOSE:E!=3600*(VAL(EE)-VAL(BE))+60*(VAL(MID$(EE,4,2))-VAL(MID$(BE,4,2)))+VAL(RIGHT$(EE,2))-VAL(RIGHT$(BE,2)):IF S OR C=""THEN I=INPUT$(1) 67 CLS:PRINT"Began"H"ion "BE:PRINT"Ended"H"ion "EE:PRINT"Run time:";:IF E!>0 THEN PRINT E!"seconds"ELSE PRINT 86400+E!"seconds 68 PRINT:PRINT Y!"plaintext chrs; check:"SP+32;CHR$(SP+32):PRINT Z!"ciphertext chrs":IF X THEN PRINT:PRINT"Keyfile "B" used to chr"X!"on cycle"X:IF X>1 THEN PRINT"Keyfile size:"XM!"chrs"ELSE XM!=X!:PRINT"Keyfile not reused 69 IF A=""THEN 71 ELSE PRINT:PRINT"(O)verwrite "D" "A;:I="OoYy":GOSUB 80:IF J=0 THEN 71 70 PRINT" Wait":OPEN A FOR OUTPUT AS 1:FOR J!=1 TO Z!:PRINT#1," ";:NEXT:CLOSE:KILL A:IF C>""THEN PRINT" (R)ename "E;C" as "A;:I="RrYy":GOSUB 80:IF J THEN NAME C AS A 71 IF X THEN PRINT:PRINT"(O)verwrite keyfile "B;:I="OoYy":GOSUB 80:IF J THEN PRINT:PRINT"Wait":OPEN B FOR OUTPUT AS 2:FOR J!=1 TO XM!:PRINT#2," ";:NEXT:CLOSE:KILL B 72 PRINT:PRINT"(R)erun";:I="RrYy":GOSUB 80:IF J THEN 0 ELSE SYSTEM 80 PRINT"? ";:CH=INPUT$(1):PRINT CH:J=INSTR(I,CH):IF CH=CHR$(27)THEN 72 ELSE RETURN 90 IF SK!=0 THEN RETURN ELSE PRINT:PRINT"Wait":PRINT:FOR J!=1 TO SK!:IF EOF(2)THEN GOSUB 30 91 I=INPUT$(1,2):X!=X!+1:NEXT:RETURN 100 BEEP:IF ERR=6 THEN PRINT"Overflow":RESUME ELSE IF ERR=7 THEN PRINT"Out of memory":RESUME 67 ELSE IF ERR=49 THEN PRINT"Need ciphertext file"ELSE IF ERR=53 OR ERR=55 OR ERR=58 OR ERR=64 THEN PRINT"Name error"ERR 101 IF ERL=30 OR ERL=47 THEN RESUME 46 ELSE IF ERL=41 THEN RESUME 41 ELSE IF ERL=45 THEN RESUME 45 ELSE IF ERL=49 THEN RESUME 49 ELSE IF ERL=65 THEN SC=1:SW=320:RESUME 65 ELSE PRINT"Error"ERR"in line"ERL:RESUME NEXT .