10 PRINT "+-----------------------------------------------+"
20 PRINT "| Simulátor německého šifrovacího stroje ENIGMA |"
30 PRINT "| v1.1 - vojenské modely I, M3, M4 |"
40 PRINT "+-----------------------------------------------+"
|
100 DIM p$(10),q$(10),o$(10),r$(4),k$(4),tr(4),op(4),ov(4)
110 DEF FNv$(w$)=CHR$(ASC(w$)-(w$>="a" AND w$<="z")/(1>0)*32)
120 DEF FNn(w$)=w$<"A" OR w$>"Z"
|
200 READ s$:RESTORE
210 FOR i=0 TO 10
220 READ q$(i),o$(i):p$(i)=q$(i)
230 FOR j=1 TO 26
240 MID$(p$(i),ASC(MID$(q$(i),j,1))-64)=CHR$(j+64)
250 NEXT j
260 NEXT i
270 FOR i=0 TO 4
280 READ r$(i)
290 NEXT i
300 FOR i=0 TO 4
310 READ k$(i)
320 NEXT i
330 mo=3
400 DATA "ABCDEFGHIJKLMNOPQRSTUVWXYZ"," "
410 DATA "EKMFLGDQVZNTOWYHXUSPAIBRCJ","Q"
420 DATA "AJDKSIRUXBLHWTMCQGZNPYFVOE","E"
430 DATA "BDFHJLCPRTXVZNYEIWGAKMUSQO","V"
440 DATA "ESOVPZJAYQUIRHXLNFTGKDCMWB","J"
450 DATA "VZBRGITYUPSDNHLXAWMJQOFECK","Z"
460 DATA "JPGVOUMFYQBENHZRDKASXLICTW","ZM"
470 DATA "NZJHGRCXMYSWBOUFAIVLPEKQDT","ZM"
480 DATA "FKQHTLXOCBJSPDZRAMEWNIUYGV","ZM"
490 DATA "LEYJVCNIXWPBQMDRTAKZGFUHOS"," "
500 DATA "FSOKANUERHMBTIYCWLQPZXVGJD"," "
510 DATA "EJMZALYXVBWFCRQUONTSPIKHGD"
520 DATA "YRUHQSLDPXNGOKMIEBFZCWVJAT"
530 DATA "FVPJIAOYEDRZXWGCTKUQSBNMHL"
540 DATA "ENKQAUYWJICOPBLMDXZVFTHRGS"
550 DATA "RDOBJNTKVEHMLFCWZAXGYIPSUQ"
560 DATA "B123","AAA","AAA",""
570 DATA "BJELRQZVJWARXSNBXORSTNCFME"
|
1000 PRINT " Zadej sestavení kotoučů (Einstellung)"
1010 PRINT "ENIGMA I - například A213"
1020 PRINT " 1. znak = typ reflektoru: A (Umkehrwalze)"
1030 PRINT " 2.-4. znak = rotory zleva doprava: 1 až 3 (Walzen)"
1040 PRINT "ENIGMA M3 - například B213"
1050 PRINT " 1. znak = typ reflektoru: B,C (Umkehrwalze)"
1060 PRINT " 2.-4. znak = rotory zleva doprava: 1 až 8 (Walzen)"
1070 PRINT "ENIGMA M4 - například CG864"
1080 PRINT " 1. znak = typ 'tenkého' reflektoru: B,C (Umkehrwalze 'dünn')"
1090 PRINT " 2. znak = typ 'tenkého' rotoru: B=Beta,G=Gamma (Griechenwalze)"
1100 PRINT " 3.-5. znak = rotory zleva doprava: 1 až 8 (Walzen)"
1200 PRINT "Aktuální nastavení: ";k$(0)
1210 PRINT "Zapiš novou konfiguraci nebo nic pro ponechání:"
1220 INPUT "",t$:GOSUB 7000:IF LEN(t$)=0 THEN t$=k$(0)
1230 mo=LEN(t$)-1:IF mo<3 OR mo>4 THEN PRINT "*** Chybná konfigurace!"+CHR$(7):GOTO 1200
1240 IF LEFT$(t$,1)<"A" OR LEFT$(t$,1)>"C" THEN PRINT "*** Špatný typ reflektoru!"+CHR$(7):GOTO 1200
1250 tr(0)=ASC(LEFT$(t$,1))-65
1260 IF mo=3 THEN GOTO 1400
1300 IF tr(0)=0 THEN PRINT "*** ENIGMA M4 nemohla používat reflektor A!"+CHR$(7):GOTO 1200
1310 tr(0)=tr(0)+2
1320 z$=MID$(t$,2,1)
1330 IF z$<>"B" AND z$<>"G" THEN PRINT "*** Špatný typ 'tenkého' rotoru!"+CHR$(7):GOTO 1200
1340 tr(1)=(ASC(z$)-61)/5+8
1400 FOR i=mo-2 TO mo
1410 z$=MID$(t$,i+1,1)
1420 IF z$<"1" OR z$>"8" THEN PRINT "*** Špatný typ rotoru!"+CHR$(7):GOTO 1200
1430 tr(i)=VAL(z$)
1440 NEXT i
1450 k$(0)=t$
|
2000 PRINT " Zadej nastavení prstenců (Ringstellung),"
2010 PRINT "například EZY pro ENIGMU M3 nebo AEZY pro ENIGMU M4:"
2020 PRINT "Aktuální nastavení: ";k$(1)
2030 PRINT "Zapiš novou hodnotu nebo nic pro ponechání:"
2040 INPUT "",t$:GOSUB 7000:IF LEN(t$)=0 THEN t$=k$(1)
2050 IF LEN(t$)<>mo THEN PRINT "*** Chybná délka!"+CHR$(7):GOTO 2000
2060 FOR i=1 TO mo
2070 z$=MID$(t$,i,1)
2080 IF FNn(z$) THEN PRINT "*** Chybné nastavení!"+CHR$(7):GOTO 2000
2090 op(i)=ASC(z$)-65
2200 NEXT i
2210 k$(1)=t$
|
3000 PRINT " Zadej počáteční postavení rotorů (Grundstellung),"
3010 PRINT "například XPI pro ENIGMU M3 nebo FXPI pro ENIGMU M4"
3020 PRINT "Aktuální otočení: ";k$(2)
3030 PRINT "Zapiš novou pozici nebo nic pro ponechání:"
3040 INPUT "",t$:GOSUB 7000:IF LEN(t$)=0 THEN t$=k$(2)
3050 IF LEN(t$)<>mo THEN PRINT "*** Chybná délka!"+CHR$(7):GOTO 3000
3060 FOR i=1 TO mo
3070 z$=MID$(t$,i,1)
3080 IF FNn(z$) THEN PRINT "*** Chybné nastavení!"+CHR$(7):GOTO 3000
3090 ov(i)=ASC(z$)-65
3200 NEXT i
3210 k$(2)=t$
|
4000 PRINT " Zadej propojovací kabely (Steckerverbindungen),"
4010 PRINT "max. 13 dvojic písmen, oddělených jednou mezerou,"
4020 PRINT "například AF ZM XV WN CP KL"
4030 PRINT "Aktuální nastavení: ";k$(3)
4040 PRINT "Zapiš nové propojení, tečku pro zrušení nebo nic pro ponechání:"
4050 INPUT "",t$:GOSUB 7000:IF LEN(t$)=0 THEN GOTO 5000
4060 IF LEFT$(t$,1)=" " THEN t$=MID$(t$,2):GOTO 4060
4070 IF RIGHT$(t$,1)=" " THEN t$=LEFT$(t$,LEN(t$)-1):GOTO 4070
4080 IF LEFT$(t$,1)="." THEN PRINT "Odpojuji vše.":RESTORE:READ s$:k$(3)="":GOTO 5000
4090 t$=t$+" ":IF LEN(t$)<3 THEN GOTO 5000
4100 RESTORE:READ z$
4110 PRINT "Zapojuji: ";
4120 FOR i=1 TO LEN(t$) STEP 3
4130 PRINT MID$(t$,i,3);
4140 IF FNn(MID$(t$,i,1)) OR FNn(MID$(t$,i+1,1)) THEN PRINT " *** Chybný znak!"+CHR$(7):GOTO 4000
4150 x=ASC(MID$(t$,i,1))-64:y=ASC(MID$(t$,i+1,1))-64
4160 IF MID$(z$,x,1)<>CHR$(x+64) OR MID$(z$,y,1)<>CHR$(y+64) THEN PRINT " *** Pozice už je obsazena!"+CHR$(7):GOTO 4000
4170 w$=MID$(z$,x,1):MID$(z$,x)=MID$(z$,y,1):MID$(z$,y)=w$
4180 NEXT i:PRINT
4190 s$=z$:k$(3)=t$
|
|
5000 PRINT " Napiš text pro (de)šifrování: "
5010 INPUT "",t$:GOSUB 7000:IF LEN(t$)=0 THEN t$=k$(4)
5020 FOR i=1 TO LEN(t$)
5030 z$=MID$(t$,i,1)
5040 IF FNn(z$) THEN GOTO 5600
5100 FOR j=1 TO LEN(o$(mo-1))
5110 IF ov(mo-1)+65<>ASC(MID$(o$(tr(mo-1)),j,1)) THEN GOTO 5150
5120 ov(mo-2)=(ov(mo-2)+1)MOD 26
5130 ov(mo-1)=(ov(mo-1)+1)MOD 26
5140 GOTO 5190
5150 NEXT j
5160 FOR j=1 TO LEN(o$(mo))
5170 IF ov(mo)+65=ASC(MID$(o$(tr(mo)),j,1)) THEN ov(mo-1)=(ov(mo-1)+1)MOD 26
5180 NEXT j
5190 ov(mo)=(ov(mo)+1)MOD 26
5300 PRINT "|";
5310 FOR j=1 TO mo
5320 PRINT CHR$(ov(j)+65)+"|";
5330 NEXT j
5340 PRINT " "+z$;
5400 z$=MID$(s$,ASC(z$)-64,1)
5410 FOR j=mo TO 1 STEP -1
5420 z$=CHR$(65+(ASC(MID$(q$(tr(j)),1+(ASC(z$)+ov(j)-op(j)-13)MOD 26,1))-ov(j)+op(j)-13)MOD 26)
5430 NEXT j
5440 z$=MID$(r$(tr(0)),ASC(z$)-64,1)
5450 FOR j=1 TO mo
5460 z$=CHR$(65+(ASC(MID$(p$(tr(j)),1+(ASC(z$)+ov(j)-op(j)-13)MOD 26,1))-ov(j)+op(j)-13)MOD 26)
5470 NEXT j
5480 z$=MID$(s$,ASC(z$)-64,1)
5490 PRINT " = "+z$:MID$(t$,i)=z$
5600 NEXT i
5700 PRINT t$:k$(4)=t$
5710 PRINT "Konečné postavení rotorů: ";
5720 FOR i=1 TO mo
5730 z$=CHR$(ov(i)+65)
5740 PRINT z$;
5750 MID$(k$(2),i)=z$
5760 NEXT i
5770 PRINT
|
6000 INPUT "Pokračovat v práci? (A/N) ",t$:t$=t$+" "
6010 IF LEFT$(FNv$(t$),1)<>"N" THEN GOTO 1000
6020 PRINT "(C)2010 FARAON"
6030 END
|
|
|
7000 FOR i=1 TO LEN(t$)
7010 MID$(t$,i) = FNv$(MID$(t$,i,1))
7020 NEXT i
7030 RETURN
|
|