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
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
$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)
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
GUICtrlSetData($Edit2, _BaseEncrypt($Input, $Letters))
Case $Button2
$Input = GUICtrlRead($Edit2)
$Letters = GUICtrlRead($Input1)
If Not _CheckKey($Letters, True) Then
ContinueLoop
EndIf
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
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
;Kombinationsmöglichkeiten
_ArrayDelete($LettersSplitted, 0)
$Combinations = _ArrayPermute($LettersSplitted)
;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
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
Func _BaseDecrypt($Input, $Letters)
$LettersSplitted = StringSplit($Letters, "")
$Base = StringLen($Letters)
$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
$Output = ""
For $i = 0 To StringLen($Normal) / $CharLen
$CurrentBlock = StringMid($Normal, 1 + $i * $CharLen, $CharLen)
$CurrentBlockCode = _TranslateBase($CurrentBlock, $Base, 10)
$Output &= Chr($CurrentBlockCode)
Next
Return $Output
EndFunc
Func _BaseEncrypt($Input, $Letters)
Global $HighestASCII
$LettersSplitted = StringSplit($Letters, "")
$Base = StringLen($Letters)
$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
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
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
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