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)
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
#cs ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]AutoIt Version: 3.3.6.1
Author: myName
Script Function:
Template AutoIt script.
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)
$Timer_Decode = TimerInit()
$Decode = _Decode($Encode,"Peterpan")
$Timer_Decode = TimerDiff($Timer_Decode)
;$Timer_CreateABC = TimerInit()
;$Return = _CreateABC(""Hallo")
;$Timer_CreateABC = TimerDiff($Timer_CreateABC)
;_ArrayDisplay($Return)
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
;$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] =
$Return = _CreateABC($Pas)
[/autoit] [autoit][/autoit] [autoit]$ABC_KLARTEXT = StringSplit($Return[0], " ")
$ABC_CHIFFRE = StringSplit($Return[1], " ")
_ArrayDelete($ABC_CHIFFRE,0)
_ArrayDelete($ABC_KLARTEXT,0)
;_ArrayDisplay($ABC_CHIFFRE," 1")
;_ArrayDisplay($ABC_KLARTEXT)
;MsgBox(0,$Password,"$Password")
Local $Return = ""
[/autoit] [autoit][/autoit] [autoit]For $x = 1 To StringLen($Text)
$Letter = StringMid($Text,$x,1)
;ConsoleWrite($Letter & @LF)
$Found = _ArraySearch($ABC_KLARTEXT, $Letter,0, UBound($ABC_KLARTEXT) - 1)
If $Found = -1 Then
$Return &= " "
Else
$Return &= $ABC_CHIFFRE[$Found]
EndIf
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
;_ArrayDisplay($ABC_CHIFFRE)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Next
Return $Return
EndFunc
Func _Decode($Text, $Pas = 13)
Local $ABC_KLARTEXT[26]
Local $ABC_CHIFFRE[26]
Local $Password = 0
$Return = _CreateABC($Pas)
[/autoit] [autoit][/autoit] [autoit]$ABC_KLARTEXT = StringSplit($Return[0], " ")
$ABC_CHIFFRE = StringSplit($Return[1], " ")
_ArrayDelete($ABC_CHIFFRE,0)
_ArrayDelete($ABC_KLARTEXT,0)
;_ArrayDisplay($ABC_CHIFFRE," 1")
;_ArrayDisplay($ABC_KLARTEXT)
;MsgBox(0,$Password,"$Password")
Local $Return = ""
[/autoit] [autoit][/autoit] [autoit]For $x = 1 To StringLen($Text)
$Letter = StringMid($Text,$x,1)
$Found = _ArraySearch($ABC_CHIFFRE, $Letter,0 , UBound($ABC_CHIFFRE))
If $Found = -1 Then
$Return &= " "
Else
$Return &= $ABC_KLARTEXT[$Found]
EndIf
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 )
Next
Return $Return
EndFunc
Func _CreateABC($Password)
$ABC = "abcdefghijklmnopqrstuvwxyz"
$ABC_KLARTEXT = StringSplit($ABC, "" )
$ABC_CHIFFRE = StringSplit($ABC, "")
_ArrayDelete($ABC_KLARTEXT,0)
_ArrayDelete($ABC_CHIFFRE,0)
Local $Return[2]
[/autoit] [autoit][/autoit] [autoit]For $x = 1 To StringLen($ABC)
$Letter = StringMid($Password,$x,1)
;ConsoleWrite($Letter & @LF)
$Found = _ArraySearch($ABC_CHIFFRE, $Letter,0 , UBound($ABC_CHIFFRE))
If $Found = -1 Then
$Return &= " "
Else
$Return &= $ABC_KLARTEXT[$Found]
EndIf
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 )
Next
$Return[0] = _ArrayToString($ABC_KLARTEXT," ")
$Return[1] = _ArrayToString($ABC_CHIFFRE," ")
Return $Return
EndFunc
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.