Make-Grafik's Encryption Tool

  • Hallo Community!
    Ich hatte vor längerer Zeit eine wichtige Datei verschlüsselt. Diese Datei enthielt sämtliche Benutzernamen + Passwörter von diversen Seiten wo ich mich irgendwann einmal registriert habe. Leider ist das Skript dazu bei einem kleinen PC „Problem“ abhandengekommen. Daher hatte ich den ganzen Tag überlegt wie nun dieser Algorithmus war, womit ich diese Datei damals verschlüsselt habe. Nach langem Testen und probieren habe ich es dann doch tatsächlich hinbekommen den Algorithmus nochmal neu zu programmieren. Als meine Datei dann endlich wieder entschlüsselt war, habe ich angefangen einen Echtzeit Verschlüsselung Tool zu schreiben, welches meinen Algorithmus verwendet. Diesen wollte ich hier gerne einmal hochladen.

    Das erste Edit Control ist für die Eingabe des zu ver- bzw. entschlüsselnden Textes verantwortlich. Es erkennt automatisch ob es sich um zu entschlüsselnde Binärdaten oder zu verschlüsselnde Texte handelt.

    Das Input Control nimmt das Passwort entgegen. Wird kein Passwort eingetragen, so wird der String einfach nur in Binärdaten umgewandelt und kann mit BinaryToString() wieder in den Originaltext verwandelt werden.

    Das zweite Edit Control gibt die verschlüsselten Binärdaten oder der entschlüsselte Text aus.


    Vorteil des Algorithmus:
    Man kann den Text nicht durch die Häufigkeit der Buchstaben erschließen. Die einzig sinnvolle Methode um den Text zu entschlüsseln ist nach meiner Überlegung nur mit Bruteforce möglich.

    Nachteil des Algorithmus:
    Sind bestimmte Zeichen des Passwortes an ihren „richtigen“ Platz, so werden Teilstrings des Originaltextes entschlüsselt. So kann bei einem nicht vollständigen Passwortes trotzdem der Text noch erschließt werden.


    Vielleicht kann ja der eine oder andere das Tool bzw. den Algorithmus gebrauchen. Hier das Skript:

    Spoiler anzeigen
    [autoit]

    #include <EditConstants.au3>
    #include <GUIConstants.au3>
    #include <GUIEdit.au3>
    #include <WindowsConstants.au3>

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

    Opt('GUIOnEventMode', 1)
    Opt('MustDeclareVars', 1)

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

    Global $hGUI, $idInput, $idPassword, $idOutput, $idDummy, $avAccelertors[1][2], $sReadText, $sReadPassword, $sSaveText, $sSavePassword, $sSet

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $hGUI = GUICreate("Make-Grafik's Encryption Tool", 800, 600)
    $idInput = GUICtrlCreateEdit('', 0, 0, 800, 290, $ES_AUTOVSCROLL + $ES_MULTILINE + $ES_WANTRETURN + $WS_VSCROLL)
    $idPassword = GUICtrlCreateInput('', 0, 290, 800, 20)
    $idOutput = GUICtrlCreateEdit('', 0, 310, 800, 290, $ES_AUTOVSCROLL + $ES_READONLY + $WS_VSCROLL)
    $idDummy = GUICtrlCreateDummy()

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

    $avAccelertors[0][0] = '^a'
    $avAccelertors[0][1] = $idDummy

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

    GUISetAccelerators($avAccelertors)
    GUICtrlSetOnEvent($idDummy, '_SelAll')
    GUISetOnEvent($GUI_EVENT_CLOSE, 'GUI_EVENT_CLOSE')
    GUISetState()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    While Sleep(10)
    $sReadText = GUICtrlRead($idInput)
    $sReadPassword = GUICtrlRead($idPassword)

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

    If $sReadText <> $sSaveText Or $sReadPassword <> $sSavePassword Then
    $sSet = _MG_Encryption($sReadText, $sReadPassword, _IsBinaryString($sReadText))
    If _IsBinaryString($sReadText) Then $sSet = BinaryToString($sSet)
    GUICtrlSetData($idOutput, $sSet)
    EndIf

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

    $sSaveText = $sReadText
    $sSavePassword = $sReadPassword
    WEnd

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func _SelAll()
    Local $hFocus = ControlGetHandle($hGUI, '', ControlGetFocus($hGUI))
    Local $hInput = ControlGetHandle($hGUI, '', $idInput)
    Local $hPassword = ControlGetHandle($hGUI, '', $idPassword)
    Local $hOutput = ControlGetHandle($hGUI, '', $idOutput)

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

    If $hFocus = $hInput Or $hFocus = $hPassword Or $hFocus = $hOutput Then _GUICtrlEdit_SetSel($hFocus, 0, -1)
    EndFunc

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

    Func GUI_EVENT_CLOSE()
    Exit
    EndFunc

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

    Func _MG_Encryption($vData, $sPassword, $bMode)
    If _IsBinaryString($vData) Then $vData = BinaryToString($vData)
    If Not $vData Then $vData = Chr(0)
    If Not $sPassword Then $sPassword = Chr(0)

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

    Local $sTemp = $sPassword
    Local $iLen = StringLen($vData)
    Local $i, $iX, $iY

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

    While $iLen > StringLen($sPassword)
    $sPassword &= $sTemp
    WEnd
    $sPassword = StringLeft($sPassword, $iLen)

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

    $sTemp = ''
    For $i = 1 To $iLen
    $iX = Asc(StringLeft($vData, 1))
    $iY = Asc(StringLeft($sPassword, 1))

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

    If $bMode Then
    If $iX < $iY Then $iX += 255
    $iX -= $iY
    Else
    $iX += $iY
    If $iX > 255 Then $iX -= 255
    EndIf

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

    $sTemp &= Chr($iX)
    $vData = StringTrimLeft($vData, 1)
    $sPassword = StringTrimLeft($sPassword, 1)
    Next

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

    Return StringToBinary($sTemp)
    EndFunc

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

    Func _IsBinaryString($sString)
    Local $sLeft = StringLeft($sString, 2)
    Local $sRight = StringTrimLeft($sString, 2)

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

    If $sLeft <> '0x' Or Not $sRight Then Return False

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

    StringRegExpReplace($sRight, '[^0-9a-fA-F]', '')
    Return Not @extended
    EndFunc

    [/autoit]
  • Sehr schöne Methode. Erinnert mich an das One Time Pad (wenn ich mich nicht verguckt habe ist das Verfahren sehr ähnlich).
    In deinem Skript funktioniert bei mir das BinaryToString nicht, sodass unten nur der Hexcode angezeigt wird, ist aber nicht weiter Tragisch, ließ sich leicht beheben ;)

    M

  • ô.Ô - Ja, die beiden Verfahren ähneln sich wirklich sehr...

    Zu dem BinaryToString...
    Bin gerade etwas unsicher was du meinst.
    Die verschlüsselnden Daten werden in Binärer Form unten ausgegeben.
    Die entschlüsselnden Daten werden in einer Zeichenkette ausgegeben.

    Beispiel 1: (verschlüsseln)
    Eingabe = Beispieltext
    Passwort = MG
    Ausgabe: 0x8FACB6BABDB0B2B3C1ACC5BB

    Beispiel 2: (entschlüsseln)
    Eingabe = 0xAED4D6D9
    Passwort = asdf
    Ausgabe: Mars

    Beides funktioniert so wie es soll...

  • Aso, dann ist natürlich alles so wie es sein soll.
    Dachte die Ausgabe wäre für Normale Zeichen ausgelegt, damit man die Verschlüsselung besser begutachten kann.
    Bei einer Ausgabe als Hex sieht man auf den ersten Blick nämlich nichts außer Zahlen :D

  • Habe deine Methode zu verschlüsseln jetzt mal bei einem meiner Skripte angewendet und es geht mega schnell...

    Ich habe zwei Fragen:
    1. Für wie sicher haltet ihr diese Verschlüsselung?
    2. ist es mit dieser Methode möglich auch ganze Dateinen zu verschlüsseln?

  • Bis auf die Länge... :P*hust* *hust* *hust*
    Aber sieht gut aus! ;)

    Als ob das so besonderes wäre. :P

    1. Für wie sicher haltet ihr diese Verschlüsselung?
    2. ist es mit dieser Methode möglich auch ganze Dateinen zu verschlüsseln?

    1. Das erinnert denke ich eher an den Vigenère Chiffre als an das One-Time-Pad (bzw. ist eigentlich fast genau dasselbe). Dadurch wird es relativ einfach das Passwort (teilweise) zu erraten, wenn du einen Teil des unverschlüsselten Textes kennst. Je nach Passwort sollte es aber ausreichend sein, auch wenn ich eher zum One-Time-Pad (XOR Verschlüsselung) raten würde. Wenn das Passwort so lang ist wie der Text sollte es aber sicher genug sein, ansonsten taugt auch das OTP nicht sehr viel. :D
    2. Natürlich. Einfach Datei öffnen, Inhalt auslesen und verschlüsseln und dann in eine neue Datei schreiben.

  • Make-Grafik meinte man könne nur durch Bruteforce das Passwort erraten. Tja im XOR Thread kapiere ich es ja gerade nicht... Soll ja eigentlich eines der sichersten Verfahren sein.

    Diese Methode (geht finde ich sehr schnell) aber ist also nicht ganz so sicher. Im Vergleich mit AES? Bei AES ist halt das Problem, dass man ein ewig langes Passwort braucht um die 256 bit zuu nutzen.

  • Die Xor Verschlüsselung ist bei kurzen Passwörtern nur so sicher, wie das Passwort lang ist. Bei einem 5 Stelligen PW also 5*log(n)/log(2) Bit. (n = Anzahl zugelassener Zeichen)
    Nimmt man z.B. nur Zahlen hat man 5*log(10)/log(2) = 16,6 Bit. Das ist nicht sonderlich sicher.

    Ein Spezialfall dieser Methode ist das One Time Pad. Der Schlüssel muss sowohl vollkommen zufällig, als auch gleichlang wie die Eingabe sein. Dieses Verfahren ist nachweislich nicht entschlüsselbar.

  • Durch dein Rechenbeispiel steige ich nicht ganz durch... Mathe Grundkurs ;)
    Es heißt ja nun aber das ich wenn ich z.B. 20 Stellen alles mische (also die gesamte Tastaur nutze) es sicher ist.

    War die aussage mit nachweislich nicht entschlüsselbar auf XOR oder das one time pad bezogen?

  • Hi,

    Zitat

    Die XOR-Verschlüsselung ist wie schon gesagt recht einfach zu entschlüsseln, wenn du ein sehr schlechtes Passwort benutzt (z.B. 1234).

    :rofl: Made my day....
    JEDE Verschlüsselung ist recht einfach zu entschlüsseln wenn man ein "schlechtes" Passwort nutzt!

    Gandalf

    Zitat

    War die aussage mit nachweislich nicht entschlüsselbar auf XOR oder das one time pad bezogen?

    Sowohl als auch.
    Wenn man bei der XOR-Verschlüsselung einen zufällig erzeugten Schlüssel in der Größe der zu verschlüsselnden Nachricht hat, dann ist JEDE mögliche Nachricht als Ergebnis mit einer weiteren XOR-Verknüpfung enthalten.
    Das heisst, per XOR kann ich mit vorhandenem Geheimtext und dem "passenden" Schlüssel JEDEN MÖGLICHEN KLARTEXT erzeugen.
    Natürlich erhalte ich, wenn ich die XOR-Methode brutforce, irgendwann den Klartext. Genau wie alle Zitate aus der Bibel oder die Notation von Mozarts Zauberflöte oder eine MP3 oder eine Bitmap mit dem Bild der Mona Lisa.
    Ob der so gefundene Klartext dem gesuchten Klartext entspricht, ist ohne den exakten Schlüssel nicht feststellbar!
    Daher ist XOR mit zufälligem Schlüssel in der Länge der Nachricht sicher.

  • In der Länge der Nachricht also sicher...

    Wenn ich hetzt also z.B. den String "Gandalf" verschlüsseln will muss ich als Passwort z.B. "Passwor" nehmen damit es sicher ist?. Wenn ich jetzt aber nen Text verschlüsseln will dann brauche ich ein seeeehr langes Passwort welches ich ja auch sichern muss bzw. Wahrscheinlich zu lang ist um es sich zu merken...

    Die Sicherheit wird vermutlich stark reduziert wenn ich das Passwort mehrfach nutze alo mehrmals hintereinandern setze?

  • Lesen bildet:
    - Das PW muss absolut zufällig sein, damit 100%ige Sicherheit erreicht wird.
    - Wenn man das PW immer hintereinander setzt kann man es extrem leicht herausbekommen
    - Man darf für 100%ige sicherheit das PW niemals für mehr als eine Nachricht verwenden. (einfach mal One Time Pad googeln)

    Wenn man den Hash des PW zum Verschlüsseln nutzt (und sich einen Algorithmus baut der aus dem PW einen Hash der Länge der Nachricht machen kann), so hat man eine nicht mehr erratbare Verschlüsselung. In diesem Fall muss Brute Force angewendet werden. (Annahme: Gehashte Daten sind optimal zufallsverteilt).
    Für Brute Force gilt immer die Regel (wie oben bereits erwähnt): Sicherheit in Bit = LängePW * log(ZeichenSatz) / Log(2)

    lg
    M

  • Zitat von Gandalf

    Die Sicherheit wird vermutlich stark reduziert wenn ich das Passwort mehrfach nutze alo mehrmals hintereinandern setze?

    Wenn du 500Kb Text verschlüsseln willst, kannst du natürlch 10x einen ZUFÄLLIGEN Schlüssel von 50Kb hintereinanderhängen. Ob es dann "extrem" Leicht ist, wie von Mars beschrieben, wage ich mal zu bezweifeln^^
    Wenn du allerdings 50000x einen Schlüssel von 1Kilobyte aneinanderhängst, wird es kritisch, verstanden?
    AES und Konsorten rotieren daher die Bits, um den "kurzen" Schlüssel sicherer zu machen.
    Imho Schwachsinnig, da angreifbar!
    Wer meint, diese Verfahren seien sicher, der betrachtet bitte die Entwicklung in den letzten 5 Jahren. Was vor einigen Jahren als "unknackbar" galt, wird heute von keinem einzigen Sicherheitsexperten mehr empfohlen!
    Problem ist die geistige unflexibilität der Entscheider in den großen Firmen, die haben vor 10 Jahren gelernt "ist sicher" und sehen deshalb absolut keine Notwendigkeit, dieses Verfahren heute nicht mehr einzusetzen....

  • Hab eine kleine Funktion geschrieben, die aus einem kurzen PW einen pseudozufälligen String erzeugt.
    Verwendet wird folgendes:
    1. Solange Hashwerte erzeugen, bis die Ziellänge überschritten ist.
    2. Da nur der erste Hashwert Bezug zum PW besitzt, und alle anderen daraus abgeleitet sind, ist das Verfahren eventuell nicht so schön. Daher wird hier nochmal zeichenweise vermischt.
    3. Zu guter letzt wird der gemischte String in 16er Ketten nochmals gehasht. Der Hash ersetzt dann die Kette.

    Das was rauskommt ist nach einer kurzen Häufigkeitsanalyse nicht wirklich gleichverteilt, aber 100.000x besser als die Hintereinanderreihung des eigentlichen Passworts.
    Es sollte bedacht werden, dass der Output im Hex Format ist. (falls jemand die Funktion nutzen will)

    Spoiler anzeigen
    [autoit]


    #include <Crypt.au3>
    #include <Array.au3>

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

    ; 5KB langer Hash
    Global $sHash = _Hash('Passwort', 1024 * 5)
    ConsoleWrite($sHash & @CRLF)
    Global $a = _ArrayCountAbs($sHash)
    _ArrayDisplay($a)

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

    ; $sStr = Beliebiger String
    ; $iLen = Länge des Outputs in Byte
    Func _Hash($sStr, $iLen)
    _Crypt_Startup() ; Eine Runde MD5 gibt einen 16 Byte Hash
    Local $sRet = StringTrimLeft(_Crypt_HashData($sStr, $CALG_MD5), 2), $sRnd
    While StringLen($sRet) < $iLen * 2
    $sRet &= StringTrimLeft(_Crypt_HashData(BinaryToString('0x' & $sRet), $CALG_MD5), 2)
    WEnd ; Ab hier haben wir genug Zahlen. Jetzt müssen wir nur noch etwas durchmischen
    ;~ ConsoleWrite('Step 1: ' & $sRet & @CRLF)
    While $sRet
    $sRnd &= StringLeft($sRet, 1) & StringRight($sRet, 1)
    $sRet = StringTrimLeft(StringTrimRight($sRet, 1), 1)
    WEnd ; Nun nochmal, weil es so schön war, in 16Byte Schritten Hashen
    ;~ ConsoleWrite('Step 2: ' & $sRnd & @CRLF)
    While $sRnd
    $sRet &= StringTrimLeft(_Crypt_HashData(BinaryToString('0x' & StringLeft($sRnd, 32)), $CALG_MD5), 2)
    $sRnd = StringTrimLeft($sRnd, 32)
    WEnd ; Fertig. Der entstandene String sollte relativ zufällig aussehen
    ;~ ConsoleWrite('Step 3: ' & $sRet & @CRLF)
    _Crypt_Shutdown()
    Return StringLeft($sRet, $iLen * 2)
    EndFunc

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

    Func _ArrayCountAbs($a, $l = 1, $b = 0)
    If Not IsArray($a) Then Return _
    _ArrayCountAbs(_StringSplit($a, $l, $b))
    Local $u = UBound($a), $r[$u][2], _
    $c = __ArrayUnique($a)
    For $i = 0 To UBound($c) - 1 Step 1
    $r[$i][0] = $c[$i]
    For $e = 0 To $u - 1 Step 1
    If $a[$e] == $c[$i] Then $r[$i][1] += 1
    Next
    Next
    _ArraySort($r, 1, 0, 0, 1)
    ReDim $r[UBound($c)][2]
    Return $r
    EndFunc

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

    Func __ArrayUnique(Const ByRef $a)
    If UBound($a,0)>1 Then Return _ArrayUnique($a,1,0,1)
    Local $oD = ObjCreate('Scripting.Dictionary')
    $oD.CompareMode = 0
    For $i = 0 To UBound($a) - 1
    $oD.Item($a[$i])
    Next
    Return $oD.Keys()
    EndFunc

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

    Func _StringSplit($s, $l = 1, $b = 0)
    If $b Then Return _StringSplit(StringTrimLeft _
    (Binary($s), 2), $l * 2)
    If $l <= 1 Then Return StringSplit($s, '', 2)
    Local $c = Ceiling(StringLen($s) / $l), $a[$c]
    For $i = 0 To $c - 1 Step 1
    $a[$i] = StringMid($s, $i * $l + 1, $l)
    Next
    Return $a
    EndFunc

    [/autoit]
  • Hey
    Also zu deiner Funktion...

    Wenn ich sie benutzen will dann kann ich dort ja nur denn zu Hashenden Wert angeben. Aber woher will die Funktion wissen wie lang der mit XOR zu verschlüsselnde Text ist?

    Spoiler anzeigen
    [autoit]

    $sText = InputBox("Daten", "")
    $sKey = InputBox("Passwort", "")
    $sResult = _XORCrypt($sText, $sKey)
    ConsoleWrite('verschlüsselt: ' & $sResult & @CR)
    $sResult = _XORCrypt($sResult, $sKey)
    MsgBox (1,"",$sResult)
    ConsoleWrite('entschlüsselt: ' & $sResult & @CR)

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

    Func _XORCrypt($sText, $sKey)
    Local $sResult = ''
    For $i = 1 To StringLen($sText)
    $sResult &= Chr(BitXOR(Asc(StringMid($sText, $i, 1)), Asc(StringMid($sKey, Mod($i - 1, StringLen($sKey)) + 1, 1))))
    Next
    Return $sResult
    EndFunc ;==>_XORCrypt

    [/autoit]

    An welcher Stelle muss ich die Funktion von Mars denn aufrufen?
    Achja...wenn ich die Funktion nun verwende dann kann ich ja trotzdem ein möglichst langes Passwort benutzen um eine höhere Sicherheit zu erreichen.?

  • Du hast zu wenig Fantasie ;)
    Also die Abhandlung ist komplett als Binary Datentyp, damit es keine Probleme mit nicht anzeigbaren Zeichen, oder Chr(0) en gibt. (AutoIt spinnt da manchmal etwas, aber als Binarys kann man so ziemlich alles abhandeln).

    Die folgende Crypt Funktion kann daher nur mit Binarys benutzt werden. Um das Casten (StringToBinary und anderstherum muss sich der User kümmern, eine DAU Programmierung ist mir jetzt zu anstrengend).

    Im Beispiel wird ein String mit dem Passwort "0" Verschlüsselt.

    Spoiler anzeigen
    [autoit]

    #include <Crypt.au3>

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

    Global $sText = 'Hallo ich bin ein Passwort geschützter Text'; String !
    Global $sPW = '0' ; String !
    Global $bText = StringToBinary($sText)
    Global $bPW = StringToBinary($sPW)
    Global $bEncrypted = _XORCrypt($bText, $bPW) ; Ausgabe/$sText/$sPW - Hex
    Global $bDecrypted = _XORCrypt($bEncrypted, $bPW) ; Ausgabe/$sText/$sPW - Hex
    Global $sDecrypted = BinaryToString($bDecrypted) ; String

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

    ConsoleWrite('Text: ' & $sText & @CRLF & 'Text(bin): ' & $bText & @CRLF & 'Encrypt: ' & $bEncrypted & @CRLF & 'Decrypt: ' & $sDecrypted & @CRLF)

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

    Func _XORCrypt($sText, $sPW)
    Local $sHash = _StringHash($sPW, BinaryLen($sText)), $sRet = '0x'
    For $i = 3 To StringLen($sText) Step 2
    $sRet &= Hex(Int(BitXOR('0x' & StringMid($sText, $i, 2), '0x' & StringMid($sHash, $i, 2))), 2)
    Next
    Return Binary($sRet)
    EndFunc

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

    Func _StringHash($sStr, $iLen)
    _Crypt_Startup() ; Eine Runde MD5 gibt einen 16 Byte Hash
    Local $sRet = StringTrimLeft(_Crypt_HashData($sStr, $CALG_MD5), 2), $sRnd
    While StringLen($sRet) < $iLen * 2
    $sRet &= StringTrimLeft(_Crypt_HashData(BinaryToString('0x' & $sRet) & $sStr, $CALG_MD5), 2)
    WEnd ; Ab hier haben wir genug Zahlen. Jetzt müssen wir nur noch etwas durchmischen
    While $sRet
    $sRnd &= StringLeft($sRet, 1) & StringRight($sRet, 1)
    $sRet = StringTrimLeft(StringTrimRight($sRet, 1), 1)
    WEnd ; Nun nochmal, weil es so schön war, in 16Byte Schritten Hashen
    While $sRnd
    $sRet &= StringTrimLeft(_Crypt_HashData(BinaryToString('0x' & StringLeft($sRnd, 32)), $CALG_MD5), 2)
    $sRnd = StringTrimLeft($sRnd, 32)
    WEnd ; Fertig. Der entstandene String sollte relativ zufällig aussehen
    _Crypt_Shutdown()
    Return Binary('0x' & StringLeft($sRet, $iLen * 2))
    EndFunc

    [/autoit]

    Im Prinzip gaukelt man hier ein One Time Pad vor, indem man einen großen "zufälligen" String zum XORen benutzt. Von außen (nach der Verschlüsselung) sollte man das nicht mehr so leicht erkennen. Wenn man das Verfahren kennt kann man natürlich mittels BF ran. Und hier gilt die schon 1000x angesprochene Regel für die Laufzeit eines PW knackers.

  • Zitat

    Also die Abhandlung ist komplett als Binary Datentyp, damit es keine Probleme mit nicht anzeigbaren Zeichen, oder Chr(0) en gibt. (AutoIt spinnt da manchmal etwas, aber als Binarys kann man so ziemlich alles abhandeln).

    AutoIt "spinnt" nicht mit dem NUL-Zeichen, viele Anwender haben blos keinerlei Ahnung, was es damit auf sich hat, der Bot soll ja einfach nur laufen....
    Chr(0) wird bei der ANZEIGE von Strings, wie in C, als Stringende-Zeichen interpretiert. Genau lesen, bei der ANZEIGE! (Msgbox, Consolewrite usw.)
    AutoIt ist sehr wohl in der Lage, mit den Stringfunktionen auch das Chr(0) zu behandeln. Extrem schnell übrigens....wenn man in der Lage ist, auch die Parameter der Funktionen richtig zu setzen (Case-sensitiv ftw! )

    [autoit]

    $string="ABC"&chr(0)&"DEFGHIJKLMNOPQRSTUVWXYZ"
    msgbox(0,"Stringlänge "&stringlen($string),$string)

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

    $pos=stringinstr($string,chr(0),1)
    msgbox(0,"Position NUL-Zeichen",$pos)

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

    $String=stringreplace($string,chr(0),"")
    msgbox(0,"NUL-Zeichen ersetzt, Stringlänge "&stringlen($string),$string)

    [/autoit]
  • Mars
    Ist es nicht besser "echten Zufall" zu benutzen?

    Etwa so:

    Spoiler anzeigen
    [autoit]

    $sText = InputBox("Daten", "")
    $sKey = InputBox("Passwort", "")

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

    $sLang= StringLen ($sText)
    $Zahl = InputBox ("Zufallszahl angeben.", "Zufallszahl wird auch zum Entschlüsseln benötigt")
    $While = 0
    $newKey = ""
    $KeyBinUp = StringUpper ($sKey)
    MsgBox (0,"Upper",$KeyBinUp)
    $KeyBin = StringToBinary ($KeyBinUp)
    $TextBin = StringToBinary ($sText)
    $KeyBinUpLeftZu = "eins"
    While 1
    If StringLen ($KeyBin) > StringLen ($TextBin) Then
    ExitLoop
    EndIf
    MsgBox (0,"1",$KeyBin)
    If $KeyBinUpLeftZu <> "eins" Then
    $KeyBin = $Ende
    EndIf
    $KeyBinUpLeft = StringTrimLeft ($KeyBin, Round (StringLen ($KeyBin) / $Zahl))
    MsgBox (0,"TrimLeft",$KeyBinUpLeft)
    $KeyBinUpLeftZu = $KeyBinUpLeft & $KeyBinUpLeft
    MsgBox (0,"2-mal",$KeyBinUpLeftZu)
    $KeyBinUpLeftZuRight = StringTrimRight ($KeyBinUpLeftZu, StringLen ($KeyBinUpLeftZu) / 3)
    MsgBox (0,"Right", $KeyBinUpLeftZuRight)
    $KeyBinUpLeftZuRightZu = $KeyBinUpLeftZuRight & $KeyBinUpLeftZu
    MsgBox (0,"Right ZUsammen", $KeyBinUpLeftZuRightZu)
    $Ende = StringRegExpReplace ($KeyBinUpLeftZuRightZu, "5", "@+*#$%§&/=?\´`")
    MsgBox (0,"Ende",$Ende)

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

    WEnd
    $sResult = _XORCrypt($sText, $sKey)
    ConsoleWrite('verschlüsselt: ' & $sResult & @CR)
    $sResult = _XORCrypt($sResult, $sKey)
    MsgBox (1,"",$sResult)
    ConsoleWrite('entschlüsselt: ' & $sResult & @CR)

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

    Func _XORCrypt($sText, $sKey)
    Local $sResult = ''
    For $i = 1 To StringLen($sText)
    $sResult &= Chr(BitXOR(Asc(StringMid($sText, $i, 1)), Asc(StringMid($sKey, Mod($i - 1, StringLen($sKey)) + 1, 1))))
    Next
    Return $sResult
    EndFunc ;==>_XORCrypt

    [/autoit]

    Ist Wahrscheinlich suuuper unsicher oder? aber eigentlich sollte nur noch Bruteforce übrig bleiben zu entschlüsseln?!