home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / CRYPT / SES152.ZIP / MSCODE1.153 < prev    next >
Encoding:
Text File  |  1987-01-14  |  20.6 KB  |  770 lines

  1.      '
  2.      '
  3.      '      <<<<<  M S - C O D E 1 . 1 5 3  >>>>>
  4.      '
  5.      '
  6.      '     * * * * * * * * * * * * * * * * * * * *
  7.      '     *                                     *
  8.      '     *  COPYRIGHT 1984 by                  *
  9.      '     *           Richard Nolen COLVARD     *
  10.      '     *           Freeware distribution OK  *
  11.      '     *           Public Domain use OK      *
  12.      '     *                                     *
  13.      '     *  WARNING: This Program must be      *
  14.      '     *           COMPILED with Microsoft   *
  15.      '     *           BASCOM/T/O/N              *
  16.      '     *           Donot use BASICA          *
  17.      '     *                                     *
  18.      '     *  Highly recommend 8087 Link Libs    *
  19.      '     *                                     *
  20.      '     * * * * * * * * * * * * * * * * * * * *
  21.      '
  22.      '
  23.      DIM B#(37), C#(99), CONS!(7), CONS#(6)
  24.      DIM ZI$(4), ZO$(4)   ' Dummy dimensions for field stmst ND error
  25.      DIM BCNT%(37), CCNT%(99), CHNO%(256)
  26.      DIM BIT%(1024), CH%(1024), PW2%(8)
  27.      CONS!(1)=8: CONS!(2)=131072! : CONS!(3)=8192: CONS!(4)=128
  28.      CONS!(5)=2: CONS!(6)=32 : CONS!(7)=2048
  29.      CONS#(1)=1: CONS#(2)=128 : CONS#(3)=32768#: CONS#(4)=8388608#
  30.      CONS#(5)=4096 : CONS#(6)=1048576# : ACNT!=0
  31.      M%=7: N%=17: YY# = 999991! : MU# = 16807 : MD# = 2147483647#
  32.      SAME1! = 0 : SAME2! = 0 : TOT! = 0 : CL% = 0 : IBM% = 0
  33.      YES% = ASC("Y") : NO% = ASC("N")
  34.      WZ$="P C   C o m p u t e r   S e c u r i t y    V1.53   MS-CODE1"
  35.      FOR J%=1 TO 37 : BCNT%(J%)=0 : NEXT J%
  36.      FOR J%=1 TO 99 : CCNT%(J%)=0 : NEXT J%
  37.      FOR J%=1 TO 256: CHNO%(J%)=0 : NEXT J%
  38.      PRINT WZ$ : PRINT : PRINT
  39. '    PRINT "Does your Terminal Support IBM Clear (CLS) Screen";
  40. '    GOSUB 8300 : IBM% = REPLY%
  41. '    PRINT: PRINT
  42. '    PRINT "Do you have COLOR installed on your PC";
  43. '    GOSUB 8300 : CL% = REPLY%
  44. '    IF CL% = 0 THEN 1530
  45. '    SCREEN 0,1
  46. '    COLOR 15,9,1
  47. '    GOSUB 8190
  48. '1530 PRINT: PRINT
  49.      YES% = ASC("B") : NO% = ASC("C")
  50.      PRINT "Do you want Character (C) or Bit (B) Scrambling";
  51.      GOSUB 8300 : XL% = REPLY%
  52.      IF XL% = 0 THEN 1600
  53.      PW2%(1) = 1
  54.      PW2%(2) = 2
  55.      PW2%(3) = 4
  56.      PW2%(4) = 8
  57.      PW2%(5) = 16
  58.      PW2%(6) = 32
  59.      PW2%(7) = 64
  60.      PW2%(8) = 128
  61.      JK% = 1
  62.      FOR J% = 1 TO 128
  63.      FOR K% = 1 TO 8
  64.      BIT%(JK%) = PW2%(K%)
  65.      CH%(JK%) = J%
  66.      JK% = JK% + 1
  67.      NEXT K%
  68.      NEXT J%
  69.      GOTO 1650
  70. 1600 FOR J%=1 TO 128
  71.      CH%(J%) = 129 - J%
  72.      NEXT J%
  73. 1650 YES% = ASC("Y") : NO% = ASC("N")
  74.      PRINT : PRINT
  75.      PRINT "Do You wish some Instructions/Help";
  76.      GOSUB 8300 : IF REPLY% = 1 THEN GOSUB 6600
  77.      PRINT : PRINT
  78.      YES% = ASC("Y") : NO% = ASC("N")
  79.      PRINT "Do You Wish to Load KEYS from a FILE";
  80.      GOSUB 8300 : IF REPLY% = 1 THEN GOSUB 6800 : GOTO 2740
  81.      GOSUB 8190
  82.      FOR J% = 10 TO 15
  83. '    IF CL% = 1 THEN COLOR J%,9,1
  84.      PRINT "P C - C O D E 1 ......SuperEncipherment......"
  85.      NEXT J%
  86. '    IF CL% = 1 THEN COLOR 15,9,1
  87.      PRINT: PRINT : PRINT : PRINT : PRINT : PRINT
  88.      YES% = ASC("N") : NO% = ASC("A")
  89.      PRINT " Enter the type of KEY desired"
  90.      PRINT "    Numeric; Number Only key ";
  91. '    IF CL% = 1 THEN COLOR 13,0,0: PRINT "N": COLOR 15,9,1
  92.      IF CL% = 0 THEN PRINT "N"
  93.      PRINT "    Alphabetic; alphanumeric ";
  94. '    IF CL% = 1 THEN COLOR 13,0,0: PRINT "A" : COLOR 15,9,1
  95.      IF CL% = 0 THEN PRINT "A"
  96.      GOSUB 8300 : TY% = REPLY% : IF REPLY% = 0 THEN 3960
  97.      '
  98.      '
  99.      '
  100.      GOSUB 8190
  101.      YES% = ASC("H"): NO% = ASC("L")
  102.      PRINT " There are two(2) levels of Security HIGH and LOW"
  103.      PRINT " Enter H for HIGH or L for LOW";
  104.      GOSUB 8300 : IF REPLY% = 1 THEN 2170
  105.      '
  106.      '   ----------- LOW level of SECURITY -------------
  107.      '
  108.      PRINT " LOW Level of Security Selected"
  109.      PRINT
  110.      PRINT " You must now enter SEVEN (7) KEY numbers as indicated:"
  111.      PRINT
  112.      GOSUB 4170
  113.      GOTO 2740
  114.      '
  115.      '
  116.      '
  117. 2170 PRINT
  118.      PRINT " You have Selected HIGH security"
  119.      PRINT
  120.      PRINT " You must enter ";1+N%+M%;" key numbers between 1 and 2,147,483,646"
  121. 2210 INPUT " A( 1 ) ? "; A#
  122.      A# = INT(A#)
  123.      IF A# < 1 OR A# >= MD# THEN GOSUB 2590: GOTO 2210
  124.      PRINT
  125.      '
  126.      '
  127.      FOR J%=1 TO M%
  128. 2280 PRINT " B(";J%;") ";
  129.      INPUT B#(J%)
  130.      B#(J%) = INT(B#(J%))
  131.      IF B#(J%) < 1 OR B#(J%) >= MD# THEN GOSUB 2590: GOTO 2280
  132.      NEXT J%
  133.      GOSUB 8190
  134.      '
  135.      '
  136.      FOR J%=1 TO N%
  137. 2370 PRINT " C(";J%;") ";
  138.      INPUT C#(J%)
  139.      C#(J%) = INT(C#(J%))
  140.      IF C#(J%) < 1 OR C#(J%) >= MD# THEN GOSUB 2590: GOTO 2370
  141.      IF J% = 18 THEN GOSUB 8190
  142.      IF J% = 36 THEN GOSUB 8190
  143.      NEXT J%
  144.      '
  145.      GOTO 2740
  146.      '
  147.      '
  148.      '
  149. 2490 PRINT "[";X%;"] ";
  150.      PRINT "Enter a NUMBER between 1 and 9,999,999 ";
  151.      INPUT K2!
  152.      IF K2! < 1.00! OR K2! > 9999999! THEN GOSUB 2590: GOTO 2490
  153.      Z! = K2!
  154.      GOSUB 2680
  155.      S! = Z!
  156.      RETURN
  157.      '
  158.      '
  159.      '   ---------- ERROR Messages ----------
  160. '2590 IF CL% = 1 THEN COLOR 4+16,0,0
  161. 2590 PRINT " ERROR: Number RANGE must be 1 to 9,999,999"
  162. '    IF CL% = 1 THEN COLOR 15,1,9
  163.      RETURN
  164.      '
  165.      '
  166.      '   ------ scaling ---------
  167. 2680 Z! = Z! / 100.00!
  168.      IF Z! > 1.00! THEN 2680
  169.      RETURN
  170.      '
  171.      '
  172.      '
  173. 2740 GOSUB 8190
  174.      PRINT : PRINT
  175.      PRINT " Input and Output File may be the same file"
  176.      PRINT " Only Valid files; no use of 'CON:' or 'LPT1:'"
  177.      PRINT : PRINT
  178.      INPUT "Enter Output file name (Full name): "; U$
  179.      OPEN "R",2,U$,512
  180.      INPUT "Enter Input FILE (full name): "; F1$
  181.      OPEN "I",1,F1$
  182.      CLOSE 1
  183.      OPEN "R",1,F1$,512
  184.      FIELD #1,128 AS ZI$(1),128 AS ZI$(2),128 AS ZI$(3),128 AS ZI$(4)
  185.      FIELD #2,128 AS ZO$(1),128 AS ZO$(2),128 AS ZO$(3),128 AS ZO$(4)
  186.      L! = LOF(1) : SIZE% = L! / 128
  187.      IF (SIZE% * 128!) <> L! THEN SIZE% = SIZE% + 1
  188.      SIZ2% = L! / 512
  189.      IF (SIZ2% * 512) <> L! THEN SIZ2% = SIZ2% + 1
  190.      PRINT
  191.      YES% = ASC("E") : NO% = ASC("D")
  192.      PRINT "Encode or Decode";
  193.      GOSUB 8300 : EN% = REPLY%
  194.      GOSUB 8190
  195.      ZER$ = STRING$(128,0)
  196. '    IF CL% = 1 THEN COLOR 4+16,0,0
  197. '    IF CL% = 0 THEN COLOR 7+16,0
  198.      PRINT " * * * R U N N I N G * * *"
  199. '    IF CL% = 1 THEN COLOR 15,9,1
  200. '    IF CL% = 0 THEN COLOR 7,0
  201.      PRINT
  202.      LAST%=0
  203.      IF XL% = 1 THEN GOSUB 9100
  204.      FOR Z9% = 1 TO SIZ2%
  205.      GET 1, Z9%
  206.      IF XL% = 0 THEN GOSUB 9100
  207.      IF XL% = 1 AND (Z9% MOD 9) = 0 THEN GOSUB 9100
  208.      FOR JK% = 1 TO 4
  209.      IF LAST% >= SIZE% THEN LSET ZO$(JK%) = ZER$ : GOTO 3450
  210.      M$=ZI$(JK%)
  211.      IF Z9% = SIZ2% AND EN% = 0 AND M$ = ZER$ THEN 3430
  212.      IF EN% = 0 THEN GOSUB 9200
  213.      FOR J% = 1 TO 128
  214.      H%=ASC( MID$(M$,J%,1) )
  215.      S#=A#
  216.      L=M%
  217.      GOSUB 3530
  218.      A#=S#
  219.      B%=O%
  220.      L=N%
  221.      S#=B#(B%)
  222.      BCNT%(B%) = BCNT%(B%) + 1
  223.      GOSUB 3530
  224.      B#(B%)=S#
  225.      B%=O%
  226.      S#=C#(B%)
  227.      CCNT%(B%) = CCNT%(B%) + 1
  228.      L=256
  229.      GOSUB 3530
  230.      C#(B%)=S#
  231.      H% = H% XOR O%
  232.      H% = H% AND 255
  233.      CHNO%(H%) = CHNO%(H%) + 1
  234.      MID$(M$,J%,1) = CHR$(H%)
  235.      NEXT J%
  236.      IF EN% = 1 THEN GOSUB 9200
  237. 3430 LSET ZO$(JK%) = M$
  238.      LAST% = LAST% + 1
  239. 3450 NEXT JK%
  240.      PUT 2, Z9%
  241.      NEXT Z9%
  242.      '
  243.      GOTO 3680
  244.      '
  245.      '
  246.      '   -------- RANDOM NUMBER GENERATOR (1) ------
  247. 3530 S# = S# * MU#
  248.      S# = S# - ( MD# * INT( S# / MD# )  )
  249.      O%=1 + INT(L * (S# / MD#) )
  250.      RETURN
  251.      '
  252.      '
  253.      '   -------- RANDOM NUMBER GENERATOR (2) ------
  254. 3600 S!=(S! + 1.352968) ^ 1.256973
  255.      S!=S! - INT(S!)
  256.      O%=1 + INT(L * S!)
  257.      RETURN
  258.      '
  259.      '
  260.      '
  261.      ' ------- CLEAR STORAGE & PREPARE TO STOP ---------
  262. 3680 LSET ZO$(4)=ZER$ : LSET ZI$(4)=ZER$
  263.      LSET ZO$(1)=ZER$ : LSET ZI$(1)=ZER$
  264.      LSET ZO$(2)=ZER$ : LSET ZI$(2)=ZER$
  265.      LSET ZO$(3)=ZER$ : LSET ZI$(3)=ZER$
  266.      CLOSE 2
  267.      CLOSE 1
  268.      YES% = ASC("Y") : NO% = ASC("N")
  269.      PRINT "Wish to Save newly Computed Keys to a File";
  270.      GOSUB 8300 : IF REPLY% = 1 THEN GOSUB 7030
  271.      PRINT "Wish to Save Log Statistics for Keys used";
  272.      GOSUB 8300 : IF REPLY% = 1 THEN GOSUB 7630
  273.      Z!=0: A#=0# : M2$=ZER$ : M$=M2$ : S! = 0: S# = 0
  274.      FOR J%=1 TO M%
  275.      B#(J%)=0# : BCNT%(J%) = 0
  276.      NEXT J%
  277.      FOR J%=1 TO N%
  278.      C#(J%)=0# : CCNT%(J%) = 0
  279.      NEXT J%
  280.      FOR J%=1 TO 1024
  281.      BIT%(J%) = 0 : CH%(J%) = 0
  282.      NEXT J%
  283. '    IF CL% = 1 THEN COLOR 7,0,0
  284. '    IF IBM% = 1 THEN CLS
  285.      END              '   S T O P
  286.      '
  287.      '   ----------- ALPHANUMERIC KEYS -----------
  288.      '
  289. 3960 GOSUB 8190
  290.      YES% = ASC("H") : NO% = ASC("L")
  291.      PRINT
  292.      PRINT " There are two(2) levels of Security HIGH and LOW"
  293.      PRINT " Enter H for HIGH or L for LOW ";
  294.      GOSUB 8300 : IF REPLY% = 1 THEN 5270
  295.      '
  296.      '   ----------- LOW level of SECURITY -------------
  297.      '
  298.      PRINT " LOW Level of Security Selected"
  299.      PRINT
  300.      PRINT " You must now enter SEVEN (7) key Alphanumerics as indicated:"
  301.      PRINT
  302.      GOSUB 4170
  303.      GOTO 2740
  304.      '
  305.      '
  306.      '   ---------- KEY 1 ---------
  307. 4170 X%=1 : M% = 11 : N% = 47
  308.      IF TY% = 0 THEN GOSUB 5410  ' Alpha
  309.      IF TY% = 1 THEN GOSUB 2490  ' Numeric
  310.      GOSUB 3600
  311.      GOSUB 3600
  312.      A#=INT((1# - S!) * MD#)
  313.      '
  314.      '
  315.      '   ---------- KEY 2 ----------
  316.      X%=2
  317.      IF TY% = 0 THEN GOSUB 5410  ' Alpha
  318.      IF TY% = 1 THEN GOSUB 2490  ' Numeric
  319.      GOSUB 3600
  320.      L=4
  321.      FOR J%=1 TO M%
  322.      GOSUB 3600
  323.      O2% = O%
  324.      FOR K%=1 TO O2%
  325.      GOSUB 3600
  326.      NEXT K%
  327.      GOSUB 3600
  328.      B#(J%)=INT((1# - S!) * MD#)
  329.      NEXT J%
  330.      '
  331.      '
  332.      '   ---------- KEY 3 -----------
  333.      X%=3
  334.      IF TY% = 0 THEN GOSUB 5410  ' Alpha
  335.      IF TY% = 1 THEN GOSUB 2490  ' Numeric
  336.      GOSUB 3600
  337.      L=3
  338.      FOR J%=1 TO N%
  339.      GOSUB 3600
  340.      O2% = O%
  341.      FOR K%=1 TO O2%
  342.      GOSUB 3600
  343.      NEXT K%
  344.      GOSUB 3600
  345.      C#(J%)=INT((1# - S!) * MD#)
  346.      NEXT J%
  347.      '
  348.      '
  349.      '   ---------- KEY 4 -------------
  350.      X%=4
  351.      IF TY% = 0 THEN GOSUB 5410   ' Alpha
  352.      IF TY% = 1 THEN GOSUB 2490   ' Numeric
  353.      GOSUB 3600
  354.      L=INT(N%/2)
  355.      GOSUB 3600
  356.      K%=O% + 1
  357.      L=N%
  358.      FOR J%=1 TO K%
  359.      GOSUB 3600
  360.      L%=O%
  361.      GOSUB 3600
  362.      C#(L%)=INT(S! * MD#)
  363.      NEXT J%
  364.      '
  365.      '
  366.      '   ----------- KEY 5 ---------------
  367.      X%=5
  368.      IF TY% = 0 THEN GOSUB 5410    ' Alpha
  369.      IF TY% = 1 THEN GOSUB 2490    ' Numeric
  370.      GOSUB 3600
  371.      L=INT(M%/2)
  372.      GOSUB 3600
  373.      K%=O% + 1
  374.      L=M%
  375.      FOR J%=1 TO K%
  376.      GOSUB 3600
  377.      L%=O%
  378.      GOSUB 3600
  379.      B#(L%)=INT(S! * MD#)
  380.      NEXT J%
  381.      '
  382.      '
  383.      '   ------------ KEY 6 ---------------
  384.      X%=6
  385.      IF TY% = 0 THEN GOSUB 5410   ' Alpha
  386.      IF TY% = 1 THEN GOSUB 2490   ' Numeric
  387.      GOSUB 3600
  388.      L=M%
  389.      FOR J%=1 TO M%
  390.      GOSUB 3600
  391.      D#=B#(O%)
  392.      B#(O%)=B#(J%)
  393.      B#(J%)=D#
  394.      NEXT J%
  395.      '
  396.      '
  397.      '   ------------- KEY 7 --------------
  398.      X%=7
  399.      IF TY% = 0 THEN GOSUB 5410    ' Alpha
  400.      IF TY% = 1 THEN GOSUB 2490    ' Numeric
  401.      GOSUB 3600
  402.      L=N%
  403.      FOR J%=1 TO N%
  404.      GOSUB 3600
  405.      D#=C#(O%)
  406.      C#(O%)=C#(J%)
  407.      C#(J%)=D#
  408.      NEXT J%
  409.      '
  410.      GOSUB 7400  ' Display generated Keys
  411.      '
  412.      RETURN
  413.      '
  414.      '   ---------- end of LOW security ------------
  415.      '
  416.      '
  417. 5270 GOSUB 8190
  418.      PRINT " You must enter 3 long PASSWORDS of alphanumeric data"
  419.      X%=1
  420.      GOSUB 5600
  421.      X%=M%
  422.      GOSUB 5600
  423.      X%=N%
  424.      GOSUB 5600
  425.      GOSUB 7400  ' Display generated keys
  426.      '
  427.      GOTO 2740
  428.      '
  429.      '
  430.      '   --------- alphanumeric password to RND ------------
  431. 5410 PRINT "[";X%;"] Enter Password: ";
  432.      LINE INPUT P$
  433.      L%=LEN(P$)
  434.      IF L% < 6 THEN PRINT "*** Password Too SHORT; not > 5": GOTO 5410
  435.      IF X%=1 THEN K#=0#
  436.      FOR J%=1 TO L%
  437.      C%=ASC( MID$(P$,J%,1) )
  438.      LL%=J%
  439.      IF LL% > 7 THEN LL% = LL% MOD 7 : LL% = LL% + 1
  440.      K# = K# + (CONS!(LL%) * C%)
  441.      NEXT J%
  442.      Z! = K#
  443.      GOSUB 2680
  444.      K# = K# - ( YY# * INT( K# / YY#))
  445.      S! = Z!
  446.      RETURN
  447.      '
  448.      '
  449.      '   ------- alphanumeric to DECIMAL --------
  450. 5600 X2%=X% * 6
  451.      X3%=X2% : X4%=0
  452.      IF X%=1 THEN PRINT " (A) Enter Password of at least (MIN) ";X2%;" Chars"
  453.      IF X%=M% THEN PRINT " (B) Enter Password of at least (MIN) ";X2%;" Chars"
  454.      IF X2% > 60 THEN X3%=60: X4%=X2% - 60: GOSUB 8190
  455.      IF X%=N% THEN PRINT " (C) Enter Password of at least (MIN) ";X2%;" Chars"
  456.      W1$="123456789012345678901234567890123456789012345678901234567890"
  457.      W2$="         1         2         3         4         5         6"
  458.      W3$=".........+.........+.........+.........+.........+.........+"
  459.      W4$="         7         8         9        10        11        12"
  460.      PRINT
  461.      PRINT "         "; LEFT$(W2$,X3%)
  462.      PRINT "         "; LEFT$(W1$,X3%)
  463.      PRINT "         "; LEFT$(W3$,X3%)
  464.      PRINT "Password:";
  465.      LINE INPUT P$
  466.      PRINT
  467.      IF X4% = 0 THEN 5810
  468.      PRINT
  469.      PRINT "         "; LEFT$(W4$,X4%)
  470.      PRINT "         "; LEFT$(W1$,X4%)
  471.      PRINT "         "; LEFT$(W3$,X4%)
  472.      PRINT "Password:";
  473.      LINE INPUT P2$
  474.      P$ = P$ + P2$
  475. 5810 L%=LEN(P$)
  476.      IF L% < X2% THEN PRINT "   *** Password TOO SHORT reenter ": GOTO 5600
  477.      T%=INT(L%/X%)
  478.      K#=0
  479.      FOR K%=1 TO X%
  480.      P2$=LEFT$(P$,T%)
  481.      L%=L%-T%
  482.      IF L% < 1 THEN 5900
  483.      P$=RIGHT$(P$,L%)
  484. 5900 FOR J%=1 TO T%
  485.      LL%=J%
  486.      IF LL% > 6 THEN LL% = LL% MOD 6 : LL% = LL% + 1
  487.      C% = ASC( MID$(P2$,J%,1) )
  488.      K# = K# + (CONS#(LL%) * C%)
  489.      NEXT J%
  490.      IF X%=1 THEN A#=K#
  491.      IF X%=M% THEN B#(K%) = K#
  492.      IF X%=N% THEN C#(K%) = K#
  493.      K# = K# - (MD# * INT( K# / MD# ))
  494.      NEXT K%
  495.      RETURN
  496.      '
  497.      '
  498.      '   ------ bit TRANSPOSITION -------
  499.      '
  500. 6060 FOR JJ% = 1 TO 1024
  501.      L=M%
  502.      S#=A#
  503.      GOSUB 3530
  504.      A#=S#
  505.      B%=O%
  506.      L=N%
  507.      S#=B#(B%)
  508.      GOSUB 3530
  509.      B#(B%)=S#
  510.      B%=O%
  511.      S#=C#(B%)
  512.      L=1024
  513.      GOSUB 3530
  514.      C#(B%)=S#
  515.      IS% = BIT%(JJ%)
  516.      BIT%(JJ%) = BIT%(O%)
  517.      BIT%(O%) = IS%
  518.      IS% = CH%(JJ%)
  519.      CH%(JJ%) = CH%(O%)
  520.      CH%(O%) = IS%
  521.      NEXT JJ%
  522.      RETURN
  523.      '
  524.      '
  525.      '
  526. 6340 FOR JJ% = 1 TO 512
  527.      X1% = CH%(JJ%)
  528.      B1% = BIT%(JJ%)
  529.      IS% = JJ% + 512
  530.      X2% = CH%(IS%)
  531.      B2% = BIT%(IS%)
  532.      C1% = ASC( MID$(M$,X1%,1) )
  533.      IF X1% = X2% THEN GOSUB 6500 : GOTO 6390
  534.      C2% = ASC( MID$(M$,X2%,1) )
  535.      S1% = B1% AND C1%
  536.      S2% = B2% AND C2%
  537.      IF S1% = 0 AND S2% = 0 THEN 6400
  538.      IF S1% > 0 AND S2% > 0 THEN 6400
  539.      C1% = C1% XOR B1%
  540.      C2% = C2% XOR B2%
  541.      MID$(M$,X2%,1) = CHR$(C2%)
  542. 6390 MID$(M$,X1%,1) = CHR$(C1%)
  543. 6400 NEXT JJ%
  544.      RETURN
  545.      '
  546.      '
  547.      '
  548.      ' ----- SAME CHARACTER different bits ----
  549. 6500 S1% = B1% AND C1%
  550.      S2% = B2% AND C1%
  551.      IF S1% = 0 AND S2% = 0 THEN 6550
  552.      IF S1% > 0 AND S2% > 0 THEN 6550
  553.      C1% = C1% XOR B1%
  554.      C1% = C1% XOR B2%
  555. 6550 RETURN
  556.      '
  557.      '
  558.      '
  559.      '
  560.      ' ------ Help / Instructions -----
  561. 6600 OPEN "I",#3,"MS-CODE1.DOC"
  562. 6620 GOSUB 8190
  563.      JJ%=1
  564. '6650 IF EOF(3) <> 0 THEN 6740
  565. 6650 IF EOF(3) <> 0 THEN 6750
  566.      LINE INPUT #3, M$
  567.      PRINT M$
  568.      JJ%=JJ%+1
  569.      IF JJ% < 18 THEN 6650
  570.      PRINT "=======================": PRINT
  571.      PRINT "Wish More Documentation <CR>=Yes  ";
  572.      NO% = ASC("N") : YES% = 32
  573.      GOSUB 8300 : IF REPLY% = 1 THEN 6620 ELSE 6750
  574. '6740 GOSUB 7220  '  Pause
  575. 6750 GOSUB 8190
  576.      CLOSE 3
  577.      RETURN
  578.      '
  579.      '
  580.      '
  581. 6800 INPUT "Enter the fully qualified Input Key File Name: "; F$
  582.      OPEN "I", 5, F$
  583.      LINE INPUT #5, P$
  584.      IF LEFT$(P$,1) <> "*" THEN A#=VAL(P$) : GOTO 6870
  585.      INPUT #5, T%, M%, N%
  586. 6850 IF T% <> 1 THEN PRINT "*** ERROR *** Bad Key File": END
  587.      INPUT #5, A#
  588. 6870 A# = ABS( INT( A# ) )
  589.      IF A# = 0# THEN T% = 99 : GOTO 6850
  590.      T% = M% + N% + 1
  591.      FOR J%=1 TO M% : INPUT #5, B#(J%)
  592.      B#(J%) = ABS( INT( B#(J%) ) ) : NEXT J%
  593.      FOR J%=1 TO N% : INPUT #5, C#(J%)
  594.      C#(J%) = ABS( INT( C#(J%) ) ) : NEXT J%
  595.      IF EOF(5) <> 0 THEN PRINT "*** ERROR *** Reading key file": END
  596.      PRINT "*** Loaded "; T% ;" Keys from "; F$; " Successfully"
  597. '    GOSUB 7220     ' Pause
  598.      CLOSE 5
  599.      RETURN
  600.      '
  601.      '
  602.      '
  603. 7030 INPUT "Enter the fully qualified Output Key File Name: "; F$
  604.      OPEN "O", 5, F$
  605.      PRINT #5, "* HDR MS-CODE1 saved KEYS "
  606.      WRITE #5, 1, M%, N%
  607.      PRINT #5, A#
  608.      FOR J%=1 TO M% : PRINT #5, B#(J%)
  609.      NEXT J%
  610.      FOR J%=1 TO N% : PRINT #5, C#(J%)
  611.      NEXT J%
  612.      PRINT #5, "* Keys Computed on " + DATE$ + " " + TIME$
  613.      T% = M% + N% + 1
  614.      PRINT "*** Saved "; T% ;" Keys to "; F$; " Successfully"
  615. '    GOSUB 7220     ' Pause
  616.      CLOSE 5
  617.      RETURN
  618.      '
  619.      '
  620.      ' ----- Generated Key Seeds display ------
  621. 7400 GOSUB 8190
  622.      PRINT "The following Numeric Keys/Seeds were generated:"
  623.      PRINT : PRINT
  624.      P$=SPACE$(15)
  625.      PRINT "     ( A ):    "; A#
  626.      PRINT
  627.      PRINT "     ( B ):"
  628.      FOR J%=1 TO M%
  629.      IF (J% MOD 5) = 0 THEN PRINT
  630.      PRINT LEFT$(STR$(B#(J%))+P$,15);
  631.      NEXT J%
  632.      PRINT : PRINT
  633.      PRINT "     ( C ):"
  634.      FOR J%=1 TO N%
  635.      IF (J% MOD 5) = 0 THEN PRINT
  636.      PRINT LEFT$(STR$(C#(J%))+P$,15);
  637.      NEXT J%
  638.      PRINT: PRINT
  639.      PRINT " --- To Print this screen depress 'Shift PrtSc' ---"
  640. '    GOSUB 7220    ' Pause
  641.      RETURN
  642.      '
  643.      '
  644.      '
  645.      ' ---- Save Log Statistics for Keys used -----
  646. 7630 PRINT "Enter Stat Log File Name or 'LPT1:' or default of blank"
  647.      F$ = " "
  648.      INPUT "Enter Log File Name: "; F$
  649.      IF LEN(F$)=0 OR LEFT$(F$,1)=" " THEN F$="MS-STAT1.LOG"
  650.      OPEN "O", 6, F$
  651.      FOR J%=1 TO M% : ACNT! = ACNT! + BCNT%(J%) : NEXT J%
  652.      PRINT #6, " "
  653.      PRINT #6, " <<<<< MS-CODE1 Statistics for Keys Used >>>>>"
  654.      PRINT #6, " " : PRINT #6, " "
  655.      PRINT #6, " Date and Time Stamp        = "; DATE$ + " " + TIME$
  656.      PRINT #6, " Keys Setup (B) size        = "; M%
  657.      PRINT #6, " Keys Setup (C) size        = "; N%
  658.      PRINT #6, " Total Characters processed = "; ACNT!
  659.      PRINT #6, " "
  660.      PRINT #6, " ----- Key Utilitization/Balance -----"
  661.      PRINT #6, " " : PRINT #6, " "
  662.      PRINT #6, " * For Key Group (B)"
  663.      PRINT #6, " "
  664.      PRINT #6, "    KEY      Count"
  665.      FOR J%=1 TO M%
  666.      PRINT #6, USING "    ###    ####### "; J%, BCNT%(J%)
  667.      NEXT J%
  668.      PRINT #6, " " : PRINT #6, " "
  669.      PRINT #6, " * For Key Group (C)"
  670.      PRINT #6, " "
  671.      PRINT #6, "    KEY      Count"
  672.      FOR J%=1 TO N%
  673.      PRINT #6, USING "    ###    ####### "; J%, CCNT%(J%)
  674.      NEXT J%
  675.      PRINT #6, " " : PRINT #6, " "
  676.      PRINT #6, " * Output Character Set Statistics:"
  677.      PRINT #6, " "
  678.      PRINT #6, "    CHR$    Char     Count"
  679.      PRINT #6, "    Num     ----     Occur"
  680.      FOR J%=0 TO 255
  681.      IF CHNO%(J%)=0 THEN 7980
  682.      IF J% > 31 AND J% < 127 THEN P$=CHR$(J%) ELSE P$=" "
  683.      PRINT #6, USING "    ####      !    ####### "; J%, P$, CHNO%(J%)
  684. 7980 NEXT J%
  685.      PRINT #6, " "
  686.      PRINT #6, " *** END of STATISTICAL LOG ***"
  687.      PRINT " *** Saved Log file to ";F$;" ***"
  688.      CLOSE 6
  689.      RETURN
  690.      '
  691.      '
  692.      '  C L E A R       S C R E E N
  693. 8190 IF IBM% = 0 THEN 8195
  694. '    CLS
  695.      GOTO 8200
  696. 8195 PRINT
  697.      PRINT "..........................................................."
  698.      PRINT
  699. 8200 PRINT WZ$ : PRINT : PRINT
  700.      RETURN
  701.      '
  702.      '
  703.      '
  704.      '    Y E S  /   N O     Prompt Subroutine
  705. 8300 IF YES% <> 32 THEN PRINT " (";CHR$(YES%);" or ";CHR$(NO%);") ";
  706.      IF YES% = 32 THEN PRINT " ( ";CHR$(NO%);" or <CR> ) ";
  707.      Z$=" "
  708.      INPUT Z$
  709.      IF Z$ = "" AND YES% = 32 THEN REPLY% = 1 : GOTO 8400
  710.      IF Z$ = "" THEN 8300
  711.      REPLY% = 99
  712.      ANS% = ASC(Z$)
  713.      IF ANS% > 90 THEN ANS% = ANS% - 32
  714.      IF ANS% = YES% THEN REPLY% = 1
  715.      IF ANS% = NO%  THEN REPLY% = 0
  716.      IF REPLY% <> 99 THEN 8400
  717.      PRINT "    ERROR: Re-enter as follows: ";
  718.      GOTO 8300
  719. 8400 RETURN
  720.      '
  721.      '
  722.      '   ------ character TRANSPOSITION -------
  723.      '
  724. 8600 FOR JJ% = 1 TO 128
  725.      L=M%
  726.      S#=A#
  727.      GOSUB 3530
  728.      A#=S#
  729.      B%=O%
  730.      L=N%
  731.      S#=B#(B%)
  732.      GOSUB 3530
  733.      B#(B%)=S#
  734.      B%=O%
  735.      S#=C#(B%)
  736.      L=128
  737.      GOSUB 3530
  738.      C#(B%)=S#
  739.      IS% = CH%(JJ%)
  740.      CH%(JJ%) = CH%(O%)
  741.      CH%(O%) = IS%
  742.      NEXT JJ%
  743.      RETURN
  744.      '
  745.      '
  746.      '
  747. 8800 FOR JJ% = 1 TO 64
  748.      G1%=CH%(JJ%)
  749.      G2%=CH%(JJ% + 64)
  750.      G1$=MID$(M$,G1%,1)
  751.      G2$=MID$(M$,G2%,1)
  752.      MID$(M$,G1%,1)=G2$
  753.      MID$(M$,G2%,1)=G1$
  754.      NEXT JJ%
  755.      RETURN
  756.      '
  757.      '
  758.      '
  759. 9100 IF XL% = 1 THEN GOSUB 6060 ELSE GOSUB 8600
  760.      RETURN
  761.      '
  762.      '
  763.      '
  764. 9200 IF XL% = 1 THEN GOSUB 6340 ELSE GOSUB 8800
  765.      RETURN
  766.      '
  767.      '
  768.      '
  769.      ' END
  770.