Kryptographie - Enigma

ikosaeder

Teekannen-Agnostiker
Vielleicht habe ich es überlesen, aber mein letzter Gedanke war, das es 2 Arten von Versatz gibt.
1. Die Walze wird verdreht eingesetzt, was einer Anzahl von X Rotationen vor der ersten Eingabe entspricht
2. Der Haken, der die Rotation der nächsten Walze steuert ist variable an der Walze angebracht.
Das würde bedeuten, das es zu B eine dritte Variante gibt.
 

StormChaser

Mitglied
Fall 1: Versatzzähler 0
Stellt man sich eine Walze als einen Ring vor, auf dem 26 Löcher angebracht sind, die zur Aufnahmen von "Haken" oder "Stiften" dienen, kann ein Haken/Stift an jeder beliebigen Position angebracht werden. Zieht man den Stift heraus, dreht die Walze (z. B. Versatz 8) und steckt den Stift wieder rein, wäre der Versatz 8, aber der Zähler bei 0, denn erst nach 26 Rotationen wäre der Stift wieder an derselben Stelle.

Fall 2: Versatzzähler = Versatz
Wie in Fall 1, doch man zieht den Stift nicht heraus, sondern dreht die Walze mitsamt Stift. Bei Versatz 8 müsste der Eingabezaehler auch auf 8 gestellt werden.

Soll z. B. bei jeder 2. Eingabe die nächste Walze rotiert werden, müsste die aktuelle Walze 13 Stifte erhalten.

Als neue Varianten wären dann hinzuzunehmen, wieviele Stifte und an welchen Positionen. Nach dem ich mir das als Datas aufgeschrieben hatte, habe ich das aber erstmal verworfen, weil das mMn mit Haushaltsmittteln nicht mehr in vernünftiger Zeit zu bruteforcen ist:

;Stifte
;db '--- STIFTE ---'
;s1: db 255, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;s2: db 255, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;s3: db 255, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
;s4: db 255, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 

ikosaeder

Teekannen-Agnostiker
Die meisten Enigmas hatten 1 Stift pro Walze. Wenn der Stift der 1. Walze in der Grundstellung bei 4 (notch) ist und die und die Walze um 8 (offset) verdreht wird, ist der Versatz bei den Buchstaben 8, die erste Rotation der 2. Walze findet aber bei 14 (26-8 -4) statt. Also die Rotation ist damit (Rot W1-notch -offset)%26.
 

StormChaser

Mitglied
Ich denke, ich verstehe jetzt, was Du mit der dritten Möglichkeit gemeint hast.

Ab der 2. Rotation werden die Walzen (bei Schaltung als "Kilometerzähler") bei 1 Stift nur alle 26 Rotationen der Vorgängerwalze rotiert.

Wie sich die erste Rotation aus deinem Beispiel auswirkt, müsste ich erstmal ausprobieren, fehlt mir momentan die Vorstellungskraft.
 

ikosaeder

Teekannen-Agnostiker
Hier mal meine aktuelle Version:
Python:
#!python
import sys


def rotate(walzeIn):
    walzeIn.insert(0, walzeIn.pop())
    return walzeIn


def encrypt(plainText, X1E, X2E, X3E, XUE, offset1, offset2, offset3,offset4,notch1,notch2, r=False):
    count1 = notch1
    count2 = notch2
    count3 = 0
    if r:
        X1E.reverse()
        X2E.reverse()
        X3E.reverse()

    for i in range(offset1):
        if offset1 == 0:
            break
        rotate(X1E)

    for i in range(offset2):
        if offset2 == 0:
            break
        rotate(X2E)

    for i in range(offset3):
        if offset3 == 0:
            break
        rotate(X3E)
    for i in range(offset4):
        if offset4 == 0:
            break
        rotate(XUE)

    encryptedText = ""
    for i in plainText:
        count1 += 1
        rotate(X1E)
        if (count1 == 25):
            rotate(X2E)
            count2 += 1
            count1 = 0
        if (count2 == 25):
            rotate(X3E)
            count3 += 1
            count2 = 0
        if (count3 == 25):
            count3 = 0
        letter = i
        chiffre = ALPHABET.index(letter)
        letter = X1E[chiffre]
        chiffre = ALPHABET.index(letter)
        letter = X2E[chiffre]
        chiffre = ALPHABET.index(letter)
        letter = X3E[chiffre]
        chiffre = ALPHABET.index(letter)
        letter = XUE[chiffre]
        chiffre = ALPHABET.index(letter)
        letter = X3E[chiffre]
        chiffre = ALPHABET.index(letter)
        letter = X2E[chiffre]
        chiffre = ALPHABET.index(letter)
        letter = X1E[chiffre]

        encryptedText += letter

    return encryptedText


def decrypt(encryptedText, X1D, X2D, X3D, XUD, offset1, offset2, offset3,offset4,notch1,notch2, r=False):
    count1 = notch1
    count2 = notch2
    count3 = 0
    if r:
        X1D.reverse()
        X2D.reverse()
        X3D.reverse()

    for i in range(offset1):
        if offset1 == 0:
            break
        rotate(X1D)

    for i in range(offset2):
        if offset2 == 0:
            break
        rotate(X2D)

    for i in range(offset3):
        if offset3 == 0:
            break
        rotate(X3D)
    for i in range(offset4):
        if offset4 == 0:
            break
        rotate(XUD)

    plainText = ""

    for i in encryptedText:
        count1 += 1
        rotate(X1D)
        if (count1 == 25):
            rotate(X2D)
            count2 += 1
            count1 = 0
        if (count2 == 25):
            rotate(X3D)
            count3 += 1
            count2 = 0
        if (count3 == 25):
            count3 = 0
        letter = i
        chiffre = X1D.index(letter)
        letter = ALPHABET[chiffre]
        chiffre = X2D.index(letter)
        letter = ALPHABET[chiffre]
        chiffre = X3D.index(letter)
        letter = ALPHABET[chiffre]
        chiffre = XUD.index(letter)
        letter = ALPHABET[chiffre]
        chiffre = X3D.index(letter)
        letter = ALPHABET[chiffre]
        chiffre = X2D.index(letter)
        letter = ALPHABET[chiffre]
        chiffre = X1D.index(letter)
        letter = ALPHABET[chiffre]
        plainText += letter

    return plainText


if __name__ == '__main__':

    ALPHABET = [chr(x) for x in range(0x41, 0x41 + 26)]

    ####['0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5']

    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']

    ####['0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5']

    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']

    ####['0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5']

    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']

    ####['0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5']

    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'

    kryptText = "BGLRAOGHKRWRGSKCNSJAXXUUEXNSRXQUDXOSZHNIWLUVKXIPJSNJTM"

    # kryptText = "RFVRQLTOEHZSFASDFASDFASDFSADFSADFSADFSDFSADFSADF"

    klarText = "WETTERBERICHT"

    # klarText="RFVRQLTOEHZSF"

    offset1 = 0
    offset2 = 3
    offset3 = 0
    offset4 = 0
    notch1=2
    notch2=2
    X1E = list(X1)
    X2E = list(X2)
    X3E = list(X3)
    XUE = list(XU)
    dekrypto = ""
    krypto = ""

    #kryptText=encrypt(klarText,X1E,X2E,X3E,XUE,offset1,offset2,offset3,offset4,notch1,notch2,True)
    print kryptText
    # dekrypto=decrypt(kryptText,X1D,X2D,X3D,XUD,count1,count2,count3,False)
    # print dekrypto
    # print "orig", X1D
    # for i in range(26):
    # rotate(X1D,True)

    # print i,X1D

    for a in range(26):
        for j in range(26):
            for k in range(26):
                for l in range(26):
                    for m in range(26):
                        for n in range(26):
                            X1D = list(X1)
                            X2D = list(X2)
                            X3D = list(X3)
                            XUD = list(XU)
                            dekrypto = decrypt(kryptText, X1D, X2D, X3D, XUD, k, j, a,l,n,m, True)
                            #print k, j, a
                            #print dekrypto
                            if ("WETTER" in dekrypto):
                                print dekrypto
                                print ('Walze 1: ' + str(k) + " Walze 2: " + str(j) + " Walze 3: " + str(a)+ " Walze 4: " + str(l))
                                print ('Notch 1: '+str(n), 'Notch 2: '+str(m))
                                sys.exit(0)
    print ("Krypto not cracked")
 

StormChaser

Mitglied
Zu den Rotationen habe ich mal ein kleines Tool erstellt und die einzelnen Rotationen aller Walzen in einem kurzen Video aufgenommen. Für Vergleichszwecke hoffentlich hilfreich, denn mit den richtigen Rotationen steht und fällt ja jeder Dechiffrierungsversuch.