Text in Zahlensysteme Umwandler/Verschlüsseler

  • Hi,
    bei diesem Programm kann man einen Text eingeben, welcher dann in ein beliebiges Zahlensystem umgewandelt wird. Der Witz ist, das man festlegt, welche Zeichen für die Zahlensysteme verwendet werden sollen (z.B. normalerweise: "0" und "1"; selber festgelegt: "x" und "y").
    Dadurch wird aus dem Satz "Hallo Autoit.de!" mit dem Zeichensatz "oO0": "oo00oooOoO0OoOOooooOOooooOOoOoooOoO0oo0Oo0oOOOoooOOo00oOOoOooOo00ooOOo00ooO0oOoOo0oOoOo0o0ooOo0o"
    autoit.de/wcf/attachment/23741/
    Das ganze geht auch rückgängig, dafür braucht der andere aber logischerweise den gleichen Zeichensatz. Dadurch kann man auch Texte verschlüsseln, da man ohne den Zeichensatz die Reihenfolge ausprobieren muss, was bei längeren Zeichensätzen schwer wird. Wenn man a-z verwendet muss man auch erstmal darauf kommen, dass diese Verschlüsselungsmethode gewählt wurde.

    Die Funktion um zwischen den Zahlensystemen zu wechseln ist von eukalyptus.

    Code
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>

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

    $HighestASCII = 255

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

    $Form1 = GUICreate("Text-Umwandler", 615, 238)
    $Label1 = GUICtrlCreateLabel("Mit diesem Programm lassen sich Texte in diverse Zahlensysteme (z.B. Binär) umwandeln. Anstelle der üblichen Zeichen (z.B. 0, 1) legt man aber unten eigene Zeichen fest. Dadurch lassen sich auch Texte verschlüsseln.", 8, 8, 597, 33)
    $Label2 = GUICtrlCreateLabel("Normaler Text:", 8, 40)
    $Edit1 = GUICtrlCreateEdit("Beispiel", 8, 64, 297, 89, BitOR($ES_AUTOVSCROLL,$ES_WANTRETURN,$WS_VSCROLL,$ES_MULTILINE))
    $Edit2 = GUICtrlCreateEdit("", 312, 64, 297, 89, BitOR($ES_AUTOVSCROLL,$ES_WANTRETURN,$WS_VSCROLL,$ES_MULTILINE))
    $Label3 = GUICtrlCreateLabel("Umgewandelter Text:", 312, 40)
    $Button1 = GUICtrlCreateButton("Umwandeln >", 224, 160, 75, 25, $BS_DEFPUSHBUTTON)
    $Button2 = GUICtrlCreateButton("< Umwandeln", 320, 160, 75, 25)
    $Label4 = GUICtrlCreateLabel("Zu verwendene Zeichen:", 8, 194)
    $Input1 = GUICtrlCreateCombo("lo", 136, 192, 129, 21)
    GUICtrlSetData(-1, "oO0|"&'"'&"'|´`'"&'"'&"^°|"&ChrW(9612)&ChrW(9608)&"|"&ChrW(9472)&ChrW(9474)&ChrW(9484)&ChrW(9488)&ChrW(9492)&ChrW(9496)&ChrW(9500)&ChrW(9508)&ChrW(9516)&ChrW(9524)&ChrW(9532)&"|"&ChrW(9834)&ChrW(9835)&"|,;.:|01|0123456789abcdef")
    $Button3 = GUICtrlCreateButton("Beenden", 528, 208, 83, 25)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $Button3
    Exit
    Case $Button1
    $Input = GUICtrlRead($Edit1)
    $Letters = GUICtrlRead($Input1)
    If Not _CheckKey($Letters) Then
    ContinueLoop
    EndIf

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

    GUICtrlSetData($Edit2, _BaseEncrypt($Input, $Letters))
    Case $Button2
    $Input = GUICtrlRead($Edit2)
    $Letters = GUICtrlRead($Input1)
    If Not _CheckKey($Letters, True) Then
    ContinueLoop
    EndIf

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

    If StringLen($Letters) = 0 Then
    If 7 = MsgBox(52,"Kein Schlüssel angegeben","Du hast zum entschlüsseln keine Zeichen angegeben. Es können automatisch alle möglichen Kombinationen ermittelt werden, das dauert aber je nach Text eine Weile." & @CRLF & @CRLF & "Fortfahren?") Then
    ContinueLoop
    EndIf
    ToolTip("Mögliche Schlüssel durchprobieren...", @DesktopWidth / 2, @DesktopHeight / 2, "Bitte warten...", 1, 6)
    GUICtrlSetData($Edit1, _GetKey($Input, $Letters))
    ToolTip("")
    Else
    GUICtrlSetData($Edit1, _BaseDecrypt($Input, $Letters))
    EndIf
    EndSwitch
    WEnd

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

    Func _GetKey($Input, $Letters)
    ;Unterschiedliche Buchstaben finden
    Local $LettersSplitted[1] = [""]
    For $i = 1 To StringLen($Input)
    $Current = StringMid($Input, $i, 1)
    For $j = 1 To UBound($LettersSplitted) - 1
    If $LettersSplitted[$j] == $Current Then
    ContinueLoop 2
    EndIf
    Next
    _ArrayAdd($LettersSplitted, $Current)
    Next

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

    ;Kombinationsmöglichkeiten
    _ArrayDelete($LettersSplitted, 0)
    $Combinations = _ArrayPermute($LettersSplitted)

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

    ;Ausprobieren
    Local $Result[1], $DecryptedAll[1]
    For $i = 1 To $Combinations[0]
    $Decrypted = _BaseDecrypt($Input, $Combinations[$i])
    $Match = StringInStr($Decrypted, Chr(0), Default, Default, Default, StringLen($Decrypted))
    If Not $Match Then _ArrayAdd($Result, $Decrypted)
    Next

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

    If UBound($Result) > 1 Then
    $Output = "Das sind die möglichen Ergebnisse (" & UBound($Result) - 1 & "):" & @CRLF
    For $i = 1 To UBound($Result) - 1
    $Output &= @CRLF & "_____________" & @CRLF & StringReplace($Result[$i], Chr(0), "")
    Next
    Else
    Return "Keine möglichen Ergebnisse gefunden. Wahrscheinlich wurde der Text mit einem anderen Verfahren verschlüsselt."
    EndIf
    Return $Output
    EndFunc

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

    Func _BaseDecrypt($Input, $Letters)
    $LettersSplitted = StringSplit($Letters, "")
    $Base = StringLen($Letters)

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

    $CharLen = StringLen(_TranslateBase($HighestASCII, 10, $Base))

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

    $Normal = ""
    For $i = 1 To StringLen($Input)
    $Current = StringMid($Input, $i, 1)
    For $u = 1 To $Base
    If $Current == $LettersSplitted[$u] Then
    $BaseChar = _TranslateBase($u - 1, 10, $Base)
    $Normal &= $BaseChar
    ContinueLoop 2
    EndIf
    Next
    Next

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

    $Output = ""
    For $i = 0 To StringLen($Normal) / $CharLen
    $CurrentBlock = StringMid($Normal, 1 + $i * $CharLen, $CharLen)
    $CurrentBlockCode = _TranslateBase($CurrentBlock, $Base, 10)
    $Output &= Chr($CurrentBlockCode)
    Next

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

    Return $Output
    EndFunc

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

    Func _BaseEncrypt($Input, $Letters)
    Global $HighestASCII
    $LettersSplitted = StringSplit($Letters, "")
    $Base = StringLen($Letters)

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

    $CharLen = StringLen(_TranslateBase($HighestASCII, 10, $Base))

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

    $Output = ""
    For $i = 1 To StringLen($Input)
    $Current = StringMid($Input, $i, 1)
    $CurrentNew = _TranslateBase(Asc($Current), 10, $Base)
    While StringLen($CurrentNew) < $CharLen
    $CurrentNew = "0" & $CurrentNew
    WEnd

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

    For $u = 1 To StringLen($CurrentNew)
    $CurrentNum = StringMid($CurrentNew, $u, 1)
    For $x = 0 To $Base-1
    $BaseChar = _TranslateBase($x, 10, $Base)
    If $CurrentNum == $BaseChar Then
    $Output &= $LettersSplitted[$x + 1]
    ContinueLoop 2
    EndIf
    Next
    Next
    Next
    Return $Output
    EndFunc

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

    Func _CheckKey($Input, $Decrypt = False)
    If $Decrypt And StringLen($Input) = 0 Then Return True
    If StringLen($Input) > 36 Or StringLen($Input) < 2 Then
    MsgBox(16, "Fehler", "Du musst zwischen 2 und 36 Zeichen als Schlüssel verwenden.")
    Return False
    EndIf
    For $i = 1 To StringLen($Input)-1
    For $u = $i+1 To StringLen($Input)
    If StringMid($Input, $i, 1) == StringMid($Input, $u, 1) Then
    MsgBox(16, "Fehler", "Du darfst im Schlüssel keine Zeichen doppelt verwenden!")
    Return False
    EndIf
    Next
    Next
    Return True
    EndFunc

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

    Func _TranslateBase($sNumber, $iOldBase = 10, $iNewBase = 2)
    ;by eukalyptus
    If $iOldBase < 2 Or $iOldBase > 128 Or $iNewBase < 2 Or $iNewBase > 128 Then Return SetError(1, 1, False)
    Local $iNum, $aRes, $tChr = DllStructCreate("char[64];")
    If $iOldBase <> 10 Then
    $aRes = DllCall("msvcrt.dll", "uint64:cdecl", "_strtoui64", "str", $sNumber, "ptr", 0, "int", $iOldBase)
    If @error Then Return SetError(1, 2, False)
    $iNum = $aRes[0]
    Else
    $iNum = Int($sNumber)
    EndIf
    $aRes = DllCall("msvcrt.dll", "ptr:cdecl", "_i64toa", "int64", $iNum, "ptr", DllStructGetPtr($tChr), "int", $iNewBase)
    If @error Then Return SetError(1, 3, False)
    Return DllStructGetData($tChr, 1)
    EndFunc ;==>_TranslateBase

    [/autoit]
  • Code
    oo00oooOo0o0oOOo0ooOOOO0oOOooooOo00ooOo0oooOo0O0oOo0o0oOOoo0ooOoO0oo0O00oOOoooOooOoooOo0oooOo000oOOOo0oOOOoooOOoo0oOOo0OoOo0oooOo0O0ooOoO0oOOOO0oOOOoooOOooOooOoO0ooO0OOooO0OOooO0OOooOoO0oo0OOooOo0o0oOo00ooOOo00oOOo0ooOoO0OoOo0OOooOoO0oOo00ooOOoo0ooOoO0oOo0oOoOo00ooOo0o0oOOo0OoOo0o0oOOooOooOoO0oo0O0OoOOoOooOOo0ooOOOoooOOooOooOo0oooOoO0oo0oOOooOOO0oooOOOoooOoOoooOOOoooOoOoo000ooOo0o0oOOo00oOOo00oOo0o0ooOoO0oo00oOoOo0oOoOo0o0oOo0o0ooOo0oooOoO0oo0Oo0oOOooooOOooooOo0o0oOOo0ooOo0oOoOo00ooOOoo0oOo0OOoOOo0OooOoO0oOOo0OoOOoOooOOooooOOooooOOo00oOo0o0oOOo0OoOOo00ooOoO0oOo0oOoOOOooooOoO0oOo0oOoOoO0OooOoO0oOOoo0oOOoOooOo0oooOo0O0ooOoO0oOo0o0oOo00ooOOoo0ooOoO0oOOOO0oOOOo0oOo0o0oOo00oooOoO0oOooo0oOo00ooOo0oooOo0O0oOo0o0oOOo0ooOo0O0oOo0o0oOo00ooOOo00oOOo0OooO0oooo0Oo0oOoO00oOo0OooOOo0ooOoO0OoOo0OOoOo0o0oOOoo0ooOoO0oOo0o0oOo00ooOOoo0oOoO00oOoO0OoOOOoooOo0o0oOOoo0ooOoO0oOo0oOoOo00ooOo0o0ooOoO0oOOOoOoOo0o0oOOo0ooOo0O0oOo00ooOOoo0oOo0oOoOo0o0oOOo0ooOOoo0ooOoO0oOo0oOoOoO0OoOOo0OoOOo0OooOoO0oOo00ooOOooOooOoO0oOoOoooOo0o0oOo00ooOo0oooOo0O0oOo0o0oOOoo0oOOo0OoOoO0OoOOo00oOOOO0ooOoO0ooO0O0ooO0oooOOooOoOoO0OoOOoooooOoO0oOo0oOoOoO0OoOOo0OooOoO0oOo0OOoOOooooOo0o0oOo00ooOo0oooOo0O0oOo0o0ooOoO0oOoOoooOo0o0oOo00ooOo0oooOo0O0oOo0o0oOOoo0ooOoO0oOOOoOoOOoOooOOo0ooOo000oOOoOooOOooOoOOooOoOOo00ooO0oOooOoO0oo00oOoOOo0OoOOo00ooOoO0oOOooOoOo00ooOOo0oooOoO0oOoO00oOo0o0oOo00oooOoO0oOO00ooo0Oo0oOOOoooOOo00oOOoOooo00oOoOOo00oO0OOoooOoO0ooOOOOoOOo0OoOo00ooOo0o0oOo0O0oOo0o0ooOoO0ooO0O0oOOOOoooOoO0oOOo00ooOOO0ooOoO0oOOoOOoOoO0OoOOo0OoOOo0OoOo00ooOo0o0oOOo0ooOOo00ooOoO0oOOOoooOOoo0oOo0oOooOoO0oOo0O0oOoO0OoOoO00oOo0o0ooOoO0oOOooOoOo00ooOo0oooOo0O0ooOoO0oOOOoOoOOoOooOOo0ooOo0o0oOOo0ooOOo0OoOOo00ooOoO0oOo0OOoOo0o0oOOOo0oOOOoooOOoo0oOo0oOoOo0o0oOOo0ooOOo00ooOoO0oOOOo0oOoO0OoOOo0ooOOOoooOOooOooOoO0oOo0oOoOoO0OoOOo0OooOoO0oOOoo0oOo00ooOo0oooOo0O0oOOo00ooOoO0oOOo0ooOo00ooOo0oooOo0O0oOOo00oOo00ooOo0OOooOoO0oOOOO0oOOOoooOOo0oOooOoooOo0oooOo000ooOoO0OooOoooOoO00oOo0o0oOOo0ooOOo0OoOo0o0oOOo00oOOOO0oOOo00ooOoO0oOo0O0oOoO0OoOOo00oOOo00oOo0o0ooO0oO
    Spoiler anzeigen

    Herzlichen Glückwunsch zum 111 Beitrag in diesem Forum! :)

    Nette Idee! Allerdings solltest du da noch ein zwei Sicherheits-Abfragen einbauen die verhindern dass im Zeichensatz 2-mal das gleiche Zeichen vorkommt. Ist mir bei „AutoIt“ (siehe 2x t) passiert und habe mich vorerst gewundert warum das nicht richtig zurück übersetzt hatte.