Kryptographie - Enigma

zerix

Hausmeister
Moderator
enigma funktioniert so entschlüsselung = verschlüsselung das heisst klartext W ergibt Chiffrat B und umgekehrt
Stimmt, hatte ich vergessen. In der Theorie müsste man nur die Walzenstellung suchen, die bei der Verschlüsselung war. Das heißt solange rotieren, bis 'B'=='W'.
Habe ich mal so implementiert, funktioniert leider nicht. Es kommt bisher nie das Wort 'WETTERBERICHT' heraus.
 

Technipion

Erfahrenes Mitglied
@zerix: Ich habe nebenbei auch ein kleines Python-Skript zur Entschlüsselung geschrieben, und dem System dabei so viele Freiheitsgrade wie möglich gegeben (beliebige Walzenstellungen 1 bis 4). Außerdem die Rotationsrichtung (im und gegen Uhrzeigersinn) variabel gelassen. Hat alles nicht gepasst.
Dann habe ich sogar noch alle Walzenpermutationen durchprobiert, aber wieder Fehlanzeige. Ich glaube die Aufgabe ist unlösbar. (Ich hatte auch bedacht die Buchstaben nach der Umkehr rückwärts durch die Walzenkanäle zu transformieren)

@javama: Mich würde mal interessieren was in der Auflösung rauskam?
 

zerix

Hausmeister
Moderator
@zerix: Ich habe nebenbei auch ein kleines Python-Skript zur Entschlüsselung geschrieben, und dem System dabei so viele Freiheitsgrade wie möglich gegeben (beliebige Walzenstellungen 1 bis 4). Außerdem die Rotationsrichtung (im und gegen Uhrzeigersinn) variabel gelassen. Hat alles nicht gepasst.
Dann habe ich sogar noch alle Walzenpermutationen durchprobiert, aber wieder Fehlanzeige. Ich glaube die Aufgabe ist unlösbar. (Ich hatte auch bedacht die Buchstaben nach der Umkehr rückwärts durch die Walzenkanäle zu transformieren)

@javama: Mich würde mal interessieren was in der Auflösung rauskam?

Ich habe das implementiert was oben gegen war. Wie die Walze rotiert. Das ist für W1 u W2 gegeben. Bei W1 bin ich davon ausgegangen, dass diese nach jeder Eingabe rotiert und W2 nach jeder 21. Eingabe. Über W3 und U wird keine Aussage getroffen, also habe ich diese auch bei jedem 21. mal und gar nicht rotieren lassen.
 

StormChaser

Mitglied
Purer Zufall: Beim Einsortieren einiger Filme stiess ich auf
Enigma - Das Geheimnis
Sehr passend zum Themenbereich, wenn auch nicht ganz zur Fragestellung.
Im Film sieht man auch die Turing-Bombe bei der Arbeit, also bei dem, was wir hier ja auch versuchen. Nur haben wir heute dazu sehr leistungsstarke Computer - es hapert lediglich an der Findung des passenden Algorithmus :cool:
 

Technipion

Erfahrenes Mitglied
Nur haben wir heute dazu sehr leistungsstarke Computer - es hapert lediglich an der Findung des passenden Algorithmus
Unsere Computer sind sogar so schnell, dass wir die Lösung über Brute-Force finden können (wie in der Aufgabe verlangt). Ist es dir denn gelungen die Nachricht zu entschlüsseln? Weil mein Python-Skript hat zwar alle erdenklichen Kombinationen durchprobiert, jedoch leider kein "WETTERBERICHT" ausfindig machen können... :unsure:
 

zerix

Hausmeister
Moderator
Unsere Computer sind sogar so schnell, dass wir die Lösung über Brute-Force finden können (wie in der Aufgabe verlangt). Ist es dir denn gelungen die Nachricht zu entschlüsseln? Weil mein Python-Skript hat zwar alle erdenklichen Kombinationen durchprobiert, jedoch leider kein "WETTERBERICHT" ausfindig machen können... :unsure:

Alle möglichen Kombinationen hast du noch nicht ausprobiert. ;)
Von Enigma ist bekannt, dass die Walzen unabhängig voneinander rotieren können. Meist wurden sie aber wie ein Kilometerzähler verwendet. Es kann aber auch ganz anders sein, beispielsweise dass Walze 1 jede 10. und Walze 3 jede 2. Eingabe iteriert.
 

Technipion

Erfahrenes Mitglied
Von Enigma ist bekannt, dass die Walzen unabhängig voneinander rotieren können. Meist wurden sie aber wie ein Kilometerzähler verwendet. Es kann aber auch ganz anders sein
Boah, ist das fies :eek:

Dann muss ich aber sagen ist die Aufgabe sehr komisch gestellt. Ich habe jetzt schon 2 Anläufe gehabt den Code mit einem Python-Programm zu knacken. Bin sogar so weit gegangen mir eine eigene Klasse für die Rollen zu bauen. Aber immer noch Fehlanzeige. Finde das unverständlich so eine Aufgabe an Studenten weiterzureichen. Damit demotiviert man die ja nur.
 

zerix

Hausmeister
Moderator
Hier ist mein aktuelles Script. Wenn ich richtig denke, sollten so alle Möglichkeiten durchgegangen werden.
Nur vorwärts rotieren habe ich noch nicht getestet. Vorwärts bedeutet hier: Nach einer Rotation aus der Grundstellung verschlüsselt Walze 1 B zu C, C zu E , D zu G usw. Die Funktion ist schon implementiert und heißt rf (rotate forward). Man muss nur rb durch rf ersetzen für W3 (Walze 3).
Python:
import sys
ALPHABET = [chr(x) for x in range(0x41,0x41+26)]
X1= ('B','D','F','H','J','L','C','P','R','T','X','V','Z','N','Y','E','I','W','G','A','K','M','U','S','Q','O')
X2= ('A','J','D','K','S','I','R','U','X','B','L','H','W','T','M','C','Q','G','Z','N','P','Y','F','V','O','E')
X3= ('E','K','M','F','L','G','D','Q','V','Z','N','T','O','W','Y','H','X','U','S','P','A','I','B','R','C','J')
XU= ('Y','R','U','H','Q','S','L','D','P','X','N','G','O','K','M','I','E','B','F','Z','C','W','V','J','A','T')
E = 'BGLRAOGHKRWRGSKCNSJAXXUUEXNSRXQUDXOSZHNIWLUVKXIPJSNJTM'
to_dict = lambda x: {chr(k+0x41):v for k,v in enumerate(x)}
# key for value
kfv = lambda d,x : [y for y,z in d.items() if z==x][0]
# encrypt
e = lambda x: kfv(W1,kfv(W2, kfv(W3,U[W3[W2[W1[x]]]])))
# predecessor
p = lambda x : ALPHABET[((ord(x)-0x41-1)+26)%26]
# successor
s = lambda x : ALPHABET[((ord(x)-0x41+1)+26)%26]
# rotate back
rb = lambda x : { p(k): p(v) for k,v in x.items() }
# rotate forward
rf = lambda x : { s(k): s(v) for k,v in x.items() }
ow1 = to_dict(X1)
ow2 = to_dict(X2)
ow3 = to_dict(X3)
ou = to_dict(XU)
W1 = to_dict(X1)
W2 = to_dict(X2)
W3 = to_dict(X3)
U = to_dict(XU)
counter_0 = 0
counter_1 = 0
counter_2 = 0
counter_3 = 0
D = ''
r3 = 1
rotated3 = False
rotated2 = False
rotated1 = False
for rw3 in range(1,26*26+1):
    for rw1 in range(1,26*26+1):
        counter_0 = 0
        rotated1 = False
        rotated2 = False
        rotated3 = False
        print(rw3, rw1)
        while True:
            if e(E[0])+\
            e(E[1])+\
            e(E[2])+\
            e(E[3])+\
            e(E[4])+\
            e(E[5]) == 'WETTER':
                for l in E:
                    D += e(l)
                print(D)
                sys.exit()
            counter_0 += 1
           
            if (counter_0) % rw1 == 0:
                W1 = rb(W1)
                rotated1 = True
            if (counter_0) % 21 == 0:
                W2 = rb(W2)
                rotated2 = True
            if counter_0 % rw3 == 0:
                W3 = rb(W3)
                rotated3 = True
            if rotated1 and rotated2 and rotated3 and ow1 == W1 and ow2 == W2 and ow3 == W3 and ou == U:
                break
 
Zuletzt bearbeitet:

StormChaser

Mitglied
Nur vorwärts rotieren habe ich noch nicht getestet. Vorwärts bedeutet hier: Nach einer Rotation aus der Grundstellung verschlüsselt Walze 1 B zu C, C zu E , D zu G usw.
@zerix: Bist du sicher, dass das richtig ist? Denn laut Aufgabe heisst es:
Walze 1 transformiert also in Grundstellung
beispielsweise A zu B, B zu D und C zu F. Nach einer Rotation aus der Grundstellung verschlusselt Walze 1 ¨ Z zu A, A zu C , B zu E und so fort

Aber durch dein rb() und rf() ist mir erst klar geworden, dass die Rotation auch in die andere Richtung gehen kann - vielleicht ist das ja in der Aufgabenstellung mit "jeweils in umgekehrter Richtung" gemeint. Dann hiesse das, dass die Walzen bei Eingabe eines einzigen Buchstabens in zwei verschiedene Richtungen drehen (können). In der Umsetzung erhöht das die Anzahl zu berücksichtigender Möglichkeiten; bisher hatten meine Walzen nur die Vorwärts-Richtung gekannt.