• Offizieller Beitrag

    Ich brauchte gerade eine Verschlüsselungsroutine für Texte, wollte aber _StringEncrypt nicht benutzen und so habe ich diese Funktionen geschrieben:

    Den Beispieltext "!cryptfile.txt" findet ihr als Anhang.

    Spoiler anzeigen
    [autoit]


    $sText = FileRead(@ScriptDir & '\!cryptfile.txt') ; Beispieltext zum verschlüsseln

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

    $sPass = 'ßYm3Ü5Q$Y4AfDIM0tch0V2"8zg7i&U#Xn26=' ; Passwort zum verschlüsseln
    $sFilename = @ScriptDir & '\!cryptfile.cr' ; Pfad + Dateiname für die verschlüsselte Datei

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

    _FileCryptSave($sText, $sPass, $sFilename) ; Text verschlüsseln und abspeichern

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

    $sPass = 'abcdefgh' ; Passwort zum entschlüsseln (hier extra falsch eingegeben, um zu zeigen, dass dann der Text nicht richtig entschlüsselt wird)
    $sFilename = @ScriptDir & '\!cryptfile.cr' ; Pfad + Dateiname für die zu entschlüsselnde Datei

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

    MsgBox(0, 'Falsches Passwort:', _FileCryptRead($sPass, $sFilename)) ; Datei laden, entschlüsseln und anzeigen

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

    $sPass = 'ßYm3Ü5Q$Y4AfDIM0tch0V2"8zg7i&U#Xn26=' ; Passwort zum entschlüsseln (jetzt mit richtigem Passwort)
    $sFilename = @ScriptDir & '\!cryptfile.cr' ; Pfad + Dateiname für die zu entschlüsselnde Datei

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

    MsgBox(0, 'Richtiges Passwort:', _FileCryptRead($sPass, $sFilename)) ; Datei laden, entschlüsseln und anzeigen

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

    Func _FileCryptSave($sText, $sPass, $sFile)
    Local $hFile = FileOpen($sFile, 2 + 8)
    If $hFile <> -1 Then
    FileWrite($hFile, StringToBinary(_StringEncryptXOR($sText, $sPass, -2)))
    FileClose($hFile)
    Else
    SetError(1)
    EndIf
    EndFunc ;==>_FileCryptSave

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

    Func _FileCryptRead($sPass, $sFile)
    Local $hFile = FileOpen($sFile, 0)
    If $hFile <> -1 Then
    Local $out = _StringEncryptXOR(FileRead($hFile), $sPass, 2)
    FileClose($hFile)
    Return $out
    Else
    SetError(1)
    EndIf
    EndFunc ;==>_FileCryptRead

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

    Func _StringEncryptXOR($sText, $sPass, $crypt)
    Local $sOut, $c, $p, $iLen = StringLen($sPass)
    For $i = 1 To StringLen($sText) ; Zeichen für Zeichen des Textes durchgehen
    $p = Mod($i, $iLen) ; Position im Passwort (Null bis Passwortlänge minus 1)
    $c = Asc(StringMid($sPass, $p, 1)) ; das Zeichen, was an Position $p im Passwort steht
    $sOut &= Chr(BitXOR(Asc(StringMid($sText, $i, 1)), $c, BitRotate($p, 4, 'B'))) ; das momentane Zeichen im Text mit $c1 und $p XOR'en
    Next
    Return $sOut
    EndFunc ;==>_StringEncryptXOR

    [/autoit]

    _FileCryptSave() speichert einen Text verschlüsselt ab. Text, Passwort und Dateiname müssen der Funktion übergeben werden (siehe Beispiel).

    _FileCryptRead() liest einen Text aus einer Datei und gibt den entschlüsselten Text zurück. Passwort und Dateiname müssen der Funktion übergeben werden (siehe Beispiel).

    _StringEncryptXOR() ist die eigentliche Ver-/Entschlüsselungsroutine. Text und Passwort müssen der Funktion übergeben werden.

    Vielleicht kann die Funktionen ja noch jemand gebrauchen...

    • Offizieller Beitrag

    Ich habe mich noch ein wenig mit der XOR-Verschlüsselung beschäftigt.

    Die eigentliche Schwachstelle bei der XOR-Verschlüsselung soll doch die statistische Verteilung der Buchstaben sein, habe ich das richtig verstanden?
    Bei meinem obigen Script, benutze ich aber für die XOR-Verschlüsselung nicht nur das Passwort, sondern zusätzlich wird noch die momentane Position des Passwort-Zeichens geXORrt, was beim "knacken" eine zusätzliche Unbekannte (Passwortlänge) bedeutet.
    Nun habe ich mir den Ursprungstext, sowie den verschlüsselten Text mal mit einem Hex-Editor angesehen und mir die Statistik anzeigen lassen. Dabei erhalte ich folgende Statistiken:

    unverschlüsselter Text:
    Pers.Einst..jpg

    verschlüsselter Text:
    Imagemap2.bmp

    Nun ist es aber keineswegs so, dass die 44 (Hex-Wert) aus dem verschlüsselten Text immer ein und denselben Buchstaben repräsentieren würde. Das ist mal ein "t", mal ein Leerzeichen und mal ein "s" (jeweils bezogen auf den unverschlüsselten Text).
    Wie soll da nun aber eine Angriffsmöglichkeit über die statistische Verteilung aussehen?
    Oder anders ausgedrückt, wie müßte ein AutoIt-Script aussehen, mit dem man diese Verschlüsselung "knacken" kann (außer BruteForce)?

    • Offizieller Beitrag

    Ich habe den Algo nicht genau angeschaut. Falls es Vigeniere ist, ist es zweistufig:
    1. Passwortlänge finden. Also von 1 an prüfen, wann die Verteilungen auffällig werden.
    2. Passwort finden. Wie bei Cäsar-Verschlüsselung (RotX).

    Ist bei kurzem Text oder langem Passwort natürlich schwer bis unmöglich (one-time-pad ist 100% sicher gegen solche Angriffe).

    peethebee

    • Offizieller Beitrag

    Ich habe den Algorithmus jetzt noch etwas verändert und bei der Analyse über die statistische Verteilung führt das dann zu diesem Ergebnis:

    Verteilung unverschlüsselt:
    FahneDE.zip

    Verteilung verschlüsselt:
    Wiki.zip

    Wobei der Maximum-Ausschlag beim verschlüsselten Text bei "nur" 1.39% liegt. Die Verteilung an sich ist aber doch relativ ausgeglichen?!
    Ich bin aber kein Krypto-Experte, von daher kann ich nicht sagen, ob man das nicht trotzdem knacken kann... :huh:

    Vorerst (bis mich jemand vom Gegenteil überzeugt) bin ich mit der Funktion zufrieden, was Sicherheit und Schnelligkeit angeht. :)

    Und für die wirklich wichtigen Sachen gibt's PGP (Mailverschlüsselung) und Truecrypt (sicherer Daten-Container). ;)