Portál AbcLinuxu, 30. dubna 2025 13:12
#! /usr/bin/python from re import findall rotor={ 'I': ('EKMFLGDQVZNTOWYHXUSPAIBRCJ','Q'), 'II': ('AJDKSIRUXBLHWTMCQGZNPYFVOE','E'), 'III': ('BDFHJLCPRTXVZNYEIWGAKMUSQO','V'), 'IV': ('ESOVPZJAYQUIRHXLNFTGKDCMWB','J'), 'V': ('VZBRGITYUPSDNHLXAWMJQOFECK','Z'), 'VI': ('JPGVOUMFYQBENHZRDKASXLICTW','MZ'), 'VII': ('NZJHGRCXMYSWBOUFAIVLPEKQDT','MZ'), 'VIII':('FKQHTLXOCBJSPDZRAMEWNIUYGV','MZ'), 'BETA': ('LEYJVCNIXWPBQMDRTAKZGFUHOS',''), 'GAMMA':('FSOKANUERHMBTIYCWLQPZXVGJD',''), } reflector={ 3:{ 'A':'EJMZALYXVBWFCRQUONTSPIKHGD', 'B':'YRUHQSLDPXNGOKMIEBFZCWVJAT', 'C':'FVPJIAOYEDRZXWGCTKUQSBNMHL',}, 4:{ 'B':'ENKQAUYWJICOPBLMDXZVFTHRGS', 'C':'RDOBJNTKVEHMLFCWZAXGYIPSUQ',},} def enigma(rot,pos,sst='',rst='1-1-1',ref='B'): O=lambda c:ord(c)-65 # setup rotors N=findall('(\w+)',rot) rot=[map(O,rotor[n][0]) for n in N] nxt=[map(O,rotor[n][1]) for n in N] rst=[int(r)-1 for r in findall('(\d+)',rst)] pos=[O(p)-r for p,r in zip(findall('(\w)',pos),rst)] # setup 'steckerbrett' xlt=range(26) for i,j in findall('(\w)[->]?(\w)',sst): i=O(i);j=O(j);xlt[i],xlt[j]=xlt[j],xlt[i] # select reflector ref=map(O,reflector[len(N)][ref]) def enc(c): if not 'A'<=c<='Z':return c # move rotors if (pos[-2]+rst[-2])%26 in nxt[-2]:pos[-3]+=1;pos[-2]+=1 elif (pos[-1]+rst[-1])%26 in nxt[-1]:pos[-2]+=1 pos[-1]+=1 # encode c=xlt[O(c)] for r,p in reversed(zip(rot,pos)): c=r[(c+p)%26]-p c=ref[c%26] for r,p in zip(rot,pos): c=r.index((c+p)%26)-p return chr(65+xlt[c%26]) return lambda s:''.join(map(enc,s)) e=enigma('I-II-III','FOK','DO PI CE') print e('ETHS OUATY QSUXULM AH BGQA VMDCU FCID')
Tiskni
Sdílej:
stale existuji zpravy z WW II sifrovane enigmou ktere jeste nikdo nerozsifroval ....
Note that although the ring settings (ringstellung) were a required part of the setup, they did not actually affect the message encryption because the rotors were positioned independently of the rings.Nojo, máš pravdu, asi fakt kecají. Jestli jsou posouvací čudlíky na těch prstencích a ne přímo na rotorech, tak to vliv na šifrování určitě má. Vypadá to na +3 řádky kódu :) Ta odkazovaná verze simulátoru neumí tenkej reflektor a 4 rotory.. nebo se mi to tak aspoň jeví.. ale pro odladění to snad bude dobrý. Na to byla nejlepší papárová enigma: http://mckoss.com/Crypto/Paper%20Enigma.pdf
10 PRINT "+-----------------------------------------------+" 20 PRINT "| Simulátor německého šifrovacího stroje ENIGMA |" 30 PRINT "| v1.0 - 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 RESTORE:READ s$:GOTO 5000 4090 RESTORE:READ s$ 4100 t$=t$+" " 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$(s$,x,1)<>CHR$(x+64) OR MID$(s$,y,1)<>CHR$(y+64) THEN PRINT " *** Pozice už je obsazena!"+CHR$(7):GOTO 4000 4170 w$=MID$(s$,x,1):MID$(s$,x)=MID$(s$,y,1):MID$(s$,y)=w$ 4180 NEXT i:PRINT 4190 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
30 PRINT "| v1.1 - vojenské modely I, M3, M4 |" 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$ 4120 FOR i=1 TO LEN(t$)-2 STEP 3 4130 MID$(t$,i+2)=" ":PRINT MID$(t$,i,3); 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$ 4190 s$=z$:k$(3)=t$
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.