Kryptographie - Enigma


javama

Erfahrenes Mitglied
Hallo kann mir jemand helfen die Aufgabe zu lösen:

Mit einer Enigma wurde folgendes Chiffrat erzeugt:

BGLRAOGHKRWRGSKCNSJAXXUUEXNSRXQUDXOSZHNIWLUVKXIPJSNJTM

Entschlusseln Sie das Chiffrat per Brute-Force-Angriff unter der Annahme, dass ¨ der Klartext mit dem Wort WETTERBERICHT beginnt, kein Steckerbrett verwendet wurde und die Verschlusselung wie folgt abl ¨ auft: ¨ Jeder Buchstabe passiert bei der Verschlusselung zuerst die Walzen 1, 2 und 3, dann ¨ die Umkehrwalze und anschließend die Walzen 3, 2 und 1 jeweils in umgekehrter Richtung. Die untenstehenden Tabellen beschreiben die jeweiligen Transformationen. Dabei steht der transformierte Buchstabe an der alphabetischen Position des hereinkommenden Buchstabens; 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; Entsprechendes gilt fur Walze 2. Sie dürfen außerdem als bekannt voraussetzen, dass Walze ¨ 2 in der unten angegebenen Grundstellung zum ersten Mal unmittelbar vor der zweiundzwanzigsten Eingabe rotiert.
Walze 1: {’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’}
Walze 2: {’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’}
Walze 3: {’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’}
Umkehrwalze: {’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’}
 

StormChaser

Mitglied
Leider verstehe ich die Aufgabe nicht richtig, denn statt des "B" als ersten Buchstaben erhalte ich "R", und zwar durch:
Eingabe: W
nach Walze #1 => U
nach Walze #2 => P
nach Walze #3 => H
nach Walze #4 => D
nach Walze #3 => F
nach Walze #2 => I
nach Walze #1 => R

Wenn ich LeerEingaben so weit laufen lasse, bis ich das "B" erhalte, klappt es zwar noch bis zum "G", aber dann ist auch Schluss. Wobei ich da auch wieder nicht sicher bin, ob und wie die 2. Walze mit der 22. Eingabe konkret zu behandeln ist und gehe einfach davon aus, dass es eine zusätzliche Rotation ist. Vielleicht liegt ja da schon der erste Fehler bei mir.

Mir ist auch nicht klar, was
anschließend die Walzen 3, 2 und 1 jeweils in umgekehrter Richtung
konkret bedeuten soll. "3, 2, 1" ist ja schon die umgekehrte Richtung bezogen auf die Walzennummerierung. Was hat es da mit "jeweils in umgekehrter Richtung" auf sich ?
 

zerix

Hausmeister
Moderator
Leider verstehe ich die Aufgabe nicht richtig, denn statt des "B" als ersten Buchstaben erhalte ich "R", und zwar durch:
Eingabe: W
nach Walze #1 => U
nach Walze #2 => P
nach Walze #3 => H
nach Walze #4 => D
nach Walze #3 => F
nach Walze #2 => I
nach Walze #1 => R

Wenn ich LeerEingaben so weit laufen lasse, bis ich das "B" erhalte, klappt es zwar noch bis zum "G", aber dann ist auch Schluss. Wobei ich da auch wieder nicht sicher bin, ob und wie die 2. Walze mit der 22. Eingabe konkret zu behandeln ist und gehe einfach davon aus, dass es eine zusätzliche Rotation ist. Vielleicht liegt ja da schon der erste Fehler bei mir.

Mir ist auch nicht klar, was
konkret bedeuten soll. "3, 2, 1" ist ja schon die umgekehrte Richtung bezogen auf die Walzennummerierung. Was hat es da mit "jeweils in umgekehrter Richtung" auf sich ?
Na es soll doch mittels brute-force gelöst werden. Das einzige was du noch 'brute-force'n kannst ist wann die Ẃalzen gedreht werden. Damit es möglich ist, hast du auch Fixpunkte erhalten, beispielsweise wann die zweite Walze dreht und was das erste Wort ist. Beispielsweise kann Walze 1,3 oder die Umkehrwalze nach einem Durchlauf gedreht werden.

Das mit "3, 2, 1" und umgekehrt ist wahrscheinlich einfach nur doppelt um es deutlich zu machen.

Viele Grüße
Sascha
 

StormChaser

Mitglied
Hallo Sascha,
danke für die Hinweise.
Zur Enigma hatte ich nochmal einiges nachgelesen. So, wie ich das mit den Walzen (für die Aufgabe) verstehe, handelt es sich um mehrere nacheinander geschaltete "Kilometerzähler": Nach jeder Eingabe der 1. Walze wird die Walze gedreht. Nach 26 Eingaben ist es eine vollständige Rotation und es wird die 2. Walze gedreht. Laut Aufgabe erfolgt vor der 22. Eingabe bereits eine Rotation der 2. Walze. Nach der 26. Rotation der 2. Walze rotiert die 3. Walze. Die Umkehrwalze (Walze 4) rotiert nicht. (Sie soll eigentlich die Dechiffrierung ermöglichen; wie, weiss ich auch noch nicht.)

Soweit ist eigentlich alles klar. Bis auf "jeweils in umgekehrter Richtung".
 

Technipion

Erfahrenes Mitglied
Ich finde es schön, dass der Thread hier Fahrt aufnimmt, aber:
Hallo kann mir jemand helfen die Aufgabe zu lösen:
So nicht mein Lieber. Erst mal zeigst du uns, welche Gedanken du dir bis hierher gemacht hast und welchen Lösungsweg (Code?) du bis jetzt erarbeitet hast. Die Aufgabe klingt mir nämlich sehr nach einem Übungsblatt einer Uni, und wir machen hier nicht deine Hausaufgaben für dich!
 

javama

Erfahrenes Mitglied
Ich finde es schön, dass der Thread hier Fahrt aufnimmt, aber:

So nicht mein Lieber. Erst mal zeigst du uns, welche Gedanken du dir bis hierher gemacht hast und welchen Lösungsweg (Code?) du bis jetzt erarbeitet hast. Die Aufgabe klingt mir nämlich sehr nach einem Übungsblatt einer Uni, und wir machen hier nicht deine Hausaufgaben für dich!
ich habe schon einiges versucht, meine farge ist wenn ich "B" eingebe sollte "W" rauskommen, kann mir jemand das erläutern?
 

zerix

Hausmeister
Moderator
Ich glaube das hast du falsch verstanden. Gibst du W ein, muss ein B herauskommen.

Viele Grüße
Sascha
 

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.