Chaocipher

  • Servus Autoiler,

    vor ein paar Tagen bin ich über eine Alte "Bild der Wissenschaft" gestolpert und habe dabei einen sehr interessanten Artikel gelesen.
    Er ging über einen Herrn namens John Francis Bryne der ein Verschlüsselungsverfahren namens Chaocipher erfunden hat

    Was ist daran so besonderst:

    Entwickelt wurde Chaocipher über nacht 1918 nachdem John Francis Bryne einen Gedankenblitzes hatte (so heißt es) :D
    Das besondere ist das er bis heute nicht geknackt wurde und das obwohl schon viele proffesionelle wie auch Hobby-Kryptologen es versucht hatten ihn zu knacken.
    Erst nach seine Familie 2010 seine Hinterlassenschaften dem National Cryptologic Museum übergeben haben wurde eines der Kryptologischen Mysterien des 19. Jhr. gelüftet.
    Dementsprechen wurde Chaociphe nie wirklich geknackt.

    Funktionsweise

    In seiner ursprünglichen Form hatte Byrne sein Verfahren als mechanisches Gerät geplant, allerdings hat er es nie gebaut.(Eine Version aus Holz und Pappe wurde von seinem Sohn angefertigt.) Das Gerät besteht aus zwei nebeneinander liegenden Scheiben, an deren Umfang sich jeweils die 26 Buchstaben des Alphabets in veränderbarer Reihenfolge befinden. Die Scheiben sind drehbar gelagert und so miteinander verbunden, dass sich bei der Drehung der einen Scheibe in eine Richtung (im oder gegen den Uhrzeigersinn) die andere Scheibe gegenläufig mitdreht.
    Das Prinzip von Chaocipher besteht darin, dass beide Alphabete nach jeder Ver- oder Entschlüsselung eines Buchstabens permutiert werden. Da diese Permutation vom vorher ver- bzw. entschlüsselten Buchstaben abhängt, handelt es sich bei diesem Verfahren um einen selbstsynchronisierenden Stromchiffre.
    EIn Beispiel:
    Man verschlüsselt mit zwei Alphabeten, die man durcheinander würfelt und untereinander schreibt.(Oben Klartext-ABC, unten Chiffre-ABC)
    JCTUEGLPVAIOYHKNFXRDMQSBWZ
    NXMBQUJZOFIGCEYWAPVRHTKDLS
    Die Stelle 14 wird markiert(*)(Im Prinzip könnte man auch jede andere Stelle verwenden) Angenommen, das Wort WISSENSCHAFT soll verschlüsselt werden.
    Dazu sucht man zunächst den ersten Buchstaben (hier W) oben in der Zeile. Der Buchstabe darunter gibt den verschlüsselteb Buchtaben hier L

    ---------------------*
    JCTUEGLPVAIOYHKNFXRDMQSBWZ
    NXMBQUJZOFIGCEYWAPVRHTKDLS
    Bevor man den nächesten Buchstaben verschöü sselt werden beide Alphabete mithilfe des soeben erzeugten Buchstabenpaars Klartext (W) und Chiffre (L) neu gemischt, und zwar nach folgenden Regeln.

    1) Man stellt die erste Zeile zyklisch um (Permutiere sie), bis W ganz hinten steht.

    -----------------------*
    ZJCTUEGLPVAIOYHKNFXRDMQSBW
    NXMBQUJZOFIGCEYWAPVRHTKDLS

    2) Man entfernt den dritten Buchstaben (Es ist egal welcher) in der ersten Zeile (C) und füge ihn and der Stelle * ein. Alle Buchaben zwischen Position 4 und * wandern dadurch eine Stelle nach links.

    *
    ZJTUEGLPVAIOYCHKNFXRDMQSBW
    NXMBQUJZOFIGCEYWAPVRHTKDLS

    3) Man permutiert nun die zweite Zeile Zyklisch, bis der Aktuelle Chiffre-Buchstabe (L) ganz vorne steht.

    ---------------------*
    ZJTUEGLPVAIOYCHKNFXRDMQSBW
    LSNXMBQUJZOFIGCEYWAPVRHTKD

    4) Man entfernt den zweiten Buchstaben (S) in der zweiten Zeile ind füge ihn an der Stelle (*) ein.

    ---------------------*
    ZJTUEGLPVAIOYCHKNFXRDMQSBW
    LNXMBQUJZOFIGSCEYWAPVRHTKD
    Nun kann man den nächsten Buchstaben entschlüsseln.
    Zum Entschlüssen muss man nur die beiden Anfangs- Alphabete wissen damit man nach dem selben Verfahren entscglüssen kann.
    Ich habe das ganze mal in AutoIt nachgemacht, so gut es ging ich hoff es gefällt euch.


    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.6.1
    Author: myName

    [/autoit] [autoit][/autoit] [autoit]

    Script Function:
    Template AutoIt script.

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Einstellen des Schlüssels

    [/autoit] [autoit][/autoit] [autoit]

    Bleibt die Frage, wie die beiden Startalphabete eingestellt werden können. Natürlich können beide Kommunikationspartner im vornherein beide Alphabete zufällig verwürfeln und das dann als Startposition verwenden. Eine andere Möglichkeit besteht darin, die Alphabete mittels eines Codeworts und eines Links/Rechts-Musters einzustellen. Ob das einfacher ist, bleibe dahingestellt, aber diese Variante, die Byrne entwickelt hat, soll hier zumindest erläutert werden.

    [/autoit] [autoit][/autoit] [autoit]

    Benutzt man nur das Codewort, müsste man wie folgt vorgehen: Beide Alphabete werden auf die Standardposition ABCDEFGH… usw. eingestellt. Von dort ausgehend, wird das Codewort, z. B. HOLZKOPF, wie oben beschrieben „verschlüsselt“ (die so gefundenen Geheimtextbuchstaben werden nicht benötigt, dienen aber zur Permutation der Alphabete, weil man ja die Buchstaben im ersten Schritt der Permutation so verschieben muss, dass eben dieser Geheimtextbuchstabe an Position 1 steht). Hinterher befinden sich beide Alphabete in genau definierter Anordnung, von der aus man seine eigentliche Botschaft verschlüsseln kann.

    [/autoit] [autoit][/autoit] [autoit]

    Jetzt zu dem Links/Rechts-Muster. Ein solches könnte lauten RRLRL. Zum besseren Verständnis nochmal einen Schritt zurück: Verwendet man nur das Codewort (oder auch bei jedem normalen Verschlüsselungsvorgang) so sucht man den Klartextbuchstaben immer auf der rechten Scheibe (R) und findet den Geheimtextbuchstaben immer auf der linken Scheibe (L). Mit dem Links/Rechts-Muster wird genau dies nun variiert.

    [/autoit] [autoit][/autoit] [autoit]

    Wir kombinieren also Codewort HOLZKOPF und Muster RRLRL. (Codewort und Muster müssen nicht gleichlang sein, wie wir sehen werden.) Statt dass jeder Buchstabe des Codewortes auf der rechten Scheibe gesucht wird, wird nun durch das Muster vorgegeben, auf welcher Scheibe zu suchen ist. Konkret: Der erste Buchstabe des Codewortes H wird bei diesem Beispiel auf der rechten Scheibe (R) gesucht. Dann werden die Scheiben wie gehabt permutiert. Der zweite Buchstabe des Codewortes O wird ebenfalls auf der rechten Scheibe (R) gesucht. Die Scheiben werden permutiert. Der dritte Buchstabe L wird auf der linken Scheibe (L) gesucht, und so weiter. Hat man das Muster einmal durchlaufen, fängt man wieder von vorne an (das zweite O wird also wieder rechts (R) gesucht).

    [/autoit] [autoit][/autoit] [autoit]

    Übrigens: Egal, ob man den Buchstaben des Codewortes links oder rechts sucht – beide Scheiben werden immer nach demselben Schema permutiert!

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    ; Script Start - Add your code below here

    [/autoit] [autoit][/autoit] [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;$File = FileOpenDialog("",@ScriptDir,"txt (*.txt)")

    [/autoit] [autoit][/autoit] [autoit]

    ;$hFile = FileOpen($File)

    [/autoit] [autoit][/autoit] [autoit]

    ;$Text = FileRead($File)

    [/autoit] [autoit][/autoit] [autoit]

    $Timer_Encode = TimerInit()
    $Encode = _Encode("Hallo","Peterpan")
    $Timer_Encode = TimerDiff($Timer_Encode)

    [/autoit] [autoit][/autoit] [autoit]

    $Timer_Decode = TimerInit()
    $Decode = _Decode($Encode,"Peterpan")
    $Timer_Decode = TimerDiff($Timer_Decode)

    [/autoit] [autoit][/autoit] [autoit]

    ;$Timer_CreateABC = TimerInit()
    ;$Return = _CreateABC(""Hallo")
    ;$Timer_CreateABC = TimerDiff($Timer_CreateABC)
    ;_ArrayDisplay($Return)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"Chaocipher","Encode: " & $Encode & " Zeit:" & $Timer_Encode & @LF & "Decode: " & $Decode & " Zeit:" & $Timer_Decode )

    [/autoit] [autoit][/autoit] [autoit]

    Func _Encode($Text, $Pas = 13)
    Local $ABC_KLARTEXT[26]
    Local $ABC_CHIFFRE[26]
    Local $Password = 0

    [/autoit] [autoit][/autoit] [autoit]

    ;$ABC_KLARTEXT = StringSplit("j c t u e g l p v a i o y h k n f x r d m q s b w z", " " )
    ;$ABC_CHIFFRE = StringSplit("n x m b q u j z o f i g c e y w a p v r h t k d l s", " ")
    ;$ABC_CHIFFRE[26] =

    [/autoit] [autoit][/autoit] [autoit]

    $Return = _CreateABC($Pas)

    [/autoit] [autoit][/autoit] [autoit]

    $ABC_KLARTEXT = StringSplit($Return[0], " ")
    $ABC_CHIFFRE = StringSplit($Return[1], " ")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _ArrayDelete($ABC_CHIFFRE,0)
    _ArrayDelete($ABC_KLARTEXT,0)

    [/autoit] [autoit][/autoit] [autoit]

    ;_ArrayDisplay($ABC_CHIFFRE," 1")
    ;_ArrayDisplay($ABC_KLARTEXT)
    ;MsgBox(0,$Password,"$Password")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $Return = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 1 To StringLen($Text)
    $Letter = StringMid($Text,$x,1)
    ;ConsoleWrite($Letter & @LF)

    [/autoit] [autoit][/autoit] [autoit]

    $Found = _ArraySearch($ABC_KLARTEXT, $Letter,0, UBound($ABC_KLARTEXT) - 1)
    If $Found = -1 Then
    $Return &= " "
    Else
    $Return &= $ABC_CHIFFRE[$Found]
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $y = $Found + 1 To UBound($ABC_KLARTEXT) - 1 ;Warum +1 u -1 weiß ich auc net anderst geht es aber net
    $Temp = _ArrayPop($ABC_KLARTEXT)
    _ArrayInsert($ABC_KLARTEXT,0,$Temp )
    Next;Stimmt jetzt
    ;=====================================================================================
    $temp = $ABC_KLARTEXT[2];Momentan 3(Habe ein 0 array)kann aber als second schlüssel verwendet werden.
    _ArrayDelete($ABC_KLARTEXT,2)
    _ArrayInsert($ABC_KLARTEXT,$Password,$temp );klappt auch
    ;========================================================================================
    For $z = 0 To $Found - 1
    $Temp = $ABC_CHIFFRE[0]
    _ArrayDelete($ABC_CHIFFRE,0)
    _ArrayInsert($ABC_CHIFFRE,25,$Temp)
    Next;Stimmt jetzt
    ;===========================================================================================
    $temp = $ABC_CHIFFRE[1];Momentan 2(Habe ein 0 array)kann aber als second schlüssel verwendet werden.
    _ArrayDelete($ABC_CHIFFRE,1)
    _ArrayInsert($ABC_CHIFFRE,$Password,$temp );klappt auch

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;_ArrayDisplay($ABC_CHIFFRE)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Next
    Return $Return
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Decode($Text, $Pas = 13)
    Local $ABC_KLARTEXT[26]
    Local $ABC_CHIFFRE[26]
    Local $Password = 0

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Return = _CreateABC($Pas)

    [/autoit] [autoit][/autoit] [autoit]

    $ABC_KLARTEXT = StringSplit($Return[0], " ")
    $ABC_CHIFFRE = StringSplit($Return[1], " ")

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDelete($ABC_CHIFFRE,0)
    _ArrayDelete($ABC_KLARTEXT,0)

    [/autoit] [autoit][/autoit] [autoit]

    ;_ArrayDisplay($ABC_CHIFFRE," 1")
    ;_ArrayDisplay($ABC_KLARTEXT)
    ;MsgBox(0,$Password,"$Password")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $Return = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 1 To StringLen($Text)
    $Letter = StringMid($Text,$x,1)

    [/autoit] [autoit][/autoit] [autoit]

    $Found = _ArraySearch($ABC_CHIFFRE, $Letter,0 , UBound($ABC_CHIFFRE))
    If $Found = -1 Then
    $Return &= " "
    Else
    $Return &= $ABC_KLARTEXT[$Found]
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $y = $Found + 1 To UBound($ABC_KLARTEXT) - 1
    $Temp = _ArrayPop($ABC_KLARTEXT)
    _ArrayInsert($ABC_KLARTEXT,0,$Temp )
    Next;Stimmt jetzt
    ;=====================================================================================
    $temp = $ABC_KLARTEXT[2]
    _ArrayDelete($ABC_KLARTEXT,2)
    _ArrayInsert($ABC_KLARTEXT,$Password,$temp )
    ;========================================================================================
    For $z = 0 To $Found - 1
    $Temp = $ABC_CHIFFRE[0]
    _ArrayDelete($ABC_CHIFFRE,0)
    _ArrayInsert($ABC_CHIFFRE,25,$Temp)
    Next;Stimmt jetzt
    ;===========================================================================================
    $temp = $ABC_CHIFFRE[1]
    _ArrayDelete($ABC_CHIFFRE,1)
    _ArrayInsert($ABC_CHIFFRE,$Password,$temp )

    [/autoit] [autoit][/autoit] [autoit]

    Next
    Return $Return
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _CreateABC($Password)
    $ABC = "abcdefghijklmnopqrstuvwxyz"

    [/autoit] [autoit][/autoit] [autoit]

    $ABC_KLARTEXT = StringSplit($ABC, "" )
    $ABC_CHIFFRE = StringSplit($ABC, "")

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDelete($ABC_KLARTEXT,0)
    _ArrayDelete($ABC_CHIFFRE,0)

    [/autoit] [autoit][/autoit] [autoit]

    Local $Return[2]

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 1 To StringLen($ABC)
    $Letter = StringMid($Password,$x,1)
    ;ConsoleWrite($Letter & @LF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Found = _ArraySearch($ABC_CHIFFRE, $Letter,0 , UBound($ABC_CHIFFRE))
    If $Found = -1 Then
    $Return &= " "
    Else
    $Return &= $ABC_KLARTEXT[$Found]
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $y = $Found + 1 To UBound($ABC_KLARTEXT) - 1
    $Temp = _ArrayPop($ABC_KLARTEXT)
    _ArrayInsert($ABC_KLARTEXT,0,$Temp )
    Next;Stimmt jetzt
    ;=====================================================================================
    $temp = $ABC_KLARTEXT[2]
    _ArrayDelete($ABC_KLARTEXT,2)
    _ArrayInsert($ABC_KLARTEXT,14,$temp )
    ;========================================================================================
    For $z = 0 To $Found - 1
    $Temp = $ABC_CHIFFRE[0]
    _ArrayDelete($ABC_CHIFFRE,0)
    _ArrayInsert($ABC_CHIFFRE,25,$Temp)
    Next;Stimmt jetzt
    ;===========================================================================================
    $temp = $ABC_CHIFFRE[1]
    _ArrayDelete($ABC_CHIFFRE,1)
    _ArrayInsert($ABC_CHIFFRE,14,$temp )

    [/autoit] [autoit][/autoit] [autoit]

    Next
    $Return[0] = _ArrayToString($ABC_KLARTEXT," ")
    $Return[1] = _ArrayToString($ABC_CHIFFRE," ")
    Return $Return
    EndFunc

    [/autoit]


    Wenn man mehr wissen möchte:


    http://www.nplaumann.de/kryptografie/chaocipher.html
    http://de.wikipedia.org/wiki/Chaocipher
    http://www.buha.info/board/redirect…cts/chaocipher/
    http://www.buha.info/board/redirect…cipher-revealed
    http://www.buha.info/board/redirect…/forum/3003636/
    http://www.buha.info/board/redirect…com/chaocipher/
    http://www.buha.info/board/redirect…olvedCodes.html
    http://www.buha.info/board/redirect…d-Algorithm.pdf


    Zuletzt ist noch zu sagen der Chiffre hier kann sich wohl kaum noch mit den aktuellen Verfahren messen (zB. RSA) da er nur einen Schlüssel verwendet. Aber ich finde dafür das er knapp 100 Jahre nicht geknackt wurde hat er such gut geschlagen.
    Bitte schreibt mir bei Fragen Anmerkungen Verbesserungsvorschlägen.

    Ps. Sorry für dei Striche aber andesrt sind mir immer die Punkte verutscht.

  • Ich hab ein Buch über Verschlüsselungen gelesen, das ist wirklich interessant. Kann ich nur empfehlen! Fals es dich interessiert:

    Titel:
    "Geheime Botschaften- Die Kunst der Verschöüsselung von der Antike bis in die Zeiten des Internet"
    Author:
    Simon Singh

  • Ich hab ein Buch über Verschlüsselungen gelesen, das ist wirklich interessant. Kann ich nur empfehlen! Fals es dich interessiert:

    Titel:
    "Geheime Botschaften- Die Kunst der Verschöüsselung von der Antike bis in die Zeiten des Internet"
    Author:
    Simon Singh

    Soso, Verschöusselung :D
    Nach der Art war übrigens die "Keyscheibe" für Monkey-Island 1, oder 2, ich weiß nicht; aber nur dass sich die andere nicht dagegen drehte, aber sonst so ähnlich :D
    €: da könnte man ja glatt ein neues Serial-System machen - Das Produkt wird direkt selbst mit einer ID & der passenden Schablone geliefert - Man kann es nur Cracken aber niemals nen anderen Key verwenden weil der eingefleischte Key nur mit dem entschlüsseln der Schablone zu kombinieren ist - BSP:
    Produkt 1 hat: KEEEEEY
    Produkt 2 hat: KKEEEEY
    Usw, halt nur ganz komplex :D

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • @ BadBunny
    Werds mir auf jedenfall mal anschauen. Interessiert mich wirklich.
    Bei weiteren Lektüren bitte melden. :P

    Ich hab ein Buch über Verschlüsselungen gelesen, das ist wirklich interessant. Kann ich nur empfehlen! Fals es dich interessiert:

    Titel:
    "Geheime Botschaften- Die Kunst der Verschöüsselung von der Antike bis in die Zeiten des Internet"
    Author:
    Simon Singh

    @Matthias.

    Meiner Meinung ist dieser Chiffre nicht nur zur Serial Berechnung gut (wobei du mir dein Bsp nochmal erklären musst weil ich es nicht ganz durchsteig)

    zB. könnte man den Buchstaben den mann auschneidet und wieder einfügt aufgrund eines Algos(Hashing fällt mir da Spontan ein) berechnen, dass wäre dann der zweite geheime Schlüssel wie bei RSA.

    So köönte man sicher diesen Chiffre der " heutigen Zeit anpassen " xD

    msg omasgehstock