Text Verschlüsselung

  • Ich habe mir aus lerngründen ein Script erstellt welches den _StringEncrypt Befehl nutzt um:
    1.Einen benutzerdefinierten Text zu verschlüsseln
    2.Ein vorher gewähltes Passwort mit hilfe eines in der data.ini definierten Benutzernamens zu verschlüsseln

    Das Script ist ziemlich dämlich aufgebaut :D. Ich wollte zuerst testen ob es funktioniert und dann Ordnung hineinnbringen.
    Leider bekomme ich immer wieder den Error das die $inputpw2 Variable bei Linie 40 nicht definiert ist, obwohl dies eigentlich der Fall sein sollte.
    Ich bin mittlerweile so durcheinander, dass ich diesen vermutlich banalen Fehler in meinem Script nicht zu finden vermag. ?(

    Wie gesagt das Script habe ich nur geschrieben um zu verstehen wie man den _StringEncrypt Befehl benutzt.

    Das Script:

    Spoiler anzeigen
    [autoit]

    #include <String.au3>

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

    $inicheck = IniRead ("data.ini","Check","Check","Error")

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

    If $inicheck = "False" Then
    $i_Encript = 1
    $i_EncriptPw = 1
    $inputtext = InputBox ("Text", "Zu verschlüsselnden Text bitte hier eingeben:")
    Passwort()
    Sleep (1000)
    VerschluesselungPw()
    Sleep (1000)
    IniWriteFunc()
    ElseIf $inicheck = "True" Then
    $i_Encript = 0
    $i_EncriptPw = 0
    IniReadFunc()
    Sleep (1000)
    Abfrage()
    Sleep (1000)
    Anzeige()
    Else
    MsgBox (0,"Error","Bitte nicht an der data.ini herumspielen. (Oder sie sogar löschen)")
    Exit
    EndIf

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

    Func IniWriteFunc()
    IniWrite ("data.ini","Check","Check","True")
    IniWrite ("data.ini","Input","Text",$inputtext)
    IniWrite ("data.ini","Input","Passwort",$inputpw2)
    EndFunc

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

    Func IniReadFunc()
    $inputtext = IniRead ("data.ini","Input","Text","Error")
    $inputpw2 = IniRead ("data.ini","Input","Passwort","Error")
    $username = IniRead ("data.ini","Input","Username","Error")
    EndFunc

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

    Func Verschluesselung()
    _StringEncrypt ($i_Encript,$inputtext,$inputpw)
    EndFunc

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

    Func VerschluesselungPw()
    _StringEncrypt ($i_EncriptPw,$inputpw2,$username)
    EndFunc

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

    Func Passwort()
    $inputpw1 = InputBox ("Passwort", "Gewünschtes Passwort bitte hier eingeben:")
    $inputpw2 = InputBox ("Passwort", "Gewünschtes Passwort bitte hier nochmal eingeben:")
    If $inputpw1 = $inputpw2 Then

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

    Else
    MsgBox (0,"Fehler", "Die beiden Passwörter stimmen nicht überein!")
    Passwort()
    EndIf
    EndFunc

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

    Func Abfrage()
    $inputusername = InputBox ("Abfrage", "Bitte ihren Benutzernamen eingeben:")
    If $username = $inputusername Then

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

    Else
    MsgBox (0,"Zugriff verweigert", "Ihr Benutzername stimmt nicht")
    Abfrage()
    VerschluesselungPw()
    EndIf
    $inputpwcheck = InputBox ("Abfrage", "Bitte das Passwort eingeben:")
    If $inputpwcheck = $inputpw2 Then
    Verschluesselung()
    Else
    MsgBox (0,"Zugriff verweigert", "Ihr Passwort stimmt nicht mit dem ursprünglich gesetzten überein"
    Abfrage()
    EndIf
    EndFunc

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

    Func Anzeige()
    MsgBox (0,"Erfolgreich entschlüsselt","Das ist ihr entschlüsselter Text:"&$inputtext)
    Exit
    EndFunc

    [/autoit]

    data.ini ist natürlich mit dem nötigen Inhalt vorhanden.

    • Offizieller Beitrag

    Das einfachste ist du definierst alle Variablen, dann wirst du dir viel Ärger ersparen. Wo in deinem Script wird eine Varable $inputpw erstellt? Es gibt nur $inputpw2.

  • Erst mal Danke für die schnelle Antwort!

    Mann bin ich blöd, ich hab einfach die "2" vergessen. Und die Variablen werd ich mal ein bisschen intelligenter benennen.

    Ich hab jetzt mal alles von grundauf neu geschrieben und die Variablen intelligenter benannt.
    Das ganze besteht jetzt fast nurnoch aus Functions, aber hauptsache es funktioniert. D.h. es ist ohne die vorher festgelegten Daten nichts sinnvolles aus der "data.ini" herauszuholen.
    Kommentare wurden auch eingefügt um mir selbst nochmal die ganzen Functions zu erklären :D .

    Hier die Version 2.0:

    Spoiler anzeigen
    [autoit]

    #include <String.au3>

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

    ;Hier werden alle Variablen Global deklariert.
    Global $Benutzername
    Global $Check
    Global $Pw1
    Global $Text
    Global $PwEnc
    Global $PwDec
    Global $TextEnc
    Global $TextDec
    Global $Shout1 = "."
    Global $Shout2 = "."

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

    ;Hier das Hauptscript, das die Functions verwaltet.
    Check()
    If $Check = 1 Then
    EingabeUser()
    EingabeText()
    EingabePw()
    EncryptText()
    EncryptPw()
    WriteToIni()
    MsgBox (0,"Info","Vorgang erfolgreich abgeschlossen, hier ihr verschlüsselter Text:"&$TextEnc)
    $Check = 2
    IniWrite ("data.ini","Check","Check",$Check)
    Exit
    ElseIf $Check = 2 Then
    ReadFromIni()
    DecryptPw()
    AbfrageUser()
    AbfragePw()
    DecryptText()
    InputBox ("Info","Vorgang erfolgreich abgeschlossen, hier ihr entschlüsselter Text: ",$TextDec)
    Exit
    Else
    MsgBox (0,"Fatal Error","Bitte nicht an der 'data.ini' herumspielen oder sie sogar löschen")
    Exit
    EndIf

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

    Func EingabeUser() ;Fordert den Nutzer auf seinen gewünschten Benutzernamen einzugeben.
    $Benutzername = InputBox ("Benutzername","Bitte geben sie ihren Benutzernamen ein"&$Shout1&" (Wird unverschlüsselt gespeichert)")
    If $Benutzername = "" Then
    $Shout1 = "!!!"
    EingabeUser()
    EndIf
    EndFunc

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

    Func EingabeText() ;Fordert den Nutzer auf seinen zu verschlüsselnden Text einzugeben.
    $Text = InputBox ("Text","Bitte zu verschlüsselnden Text eingeben"&$Shout2)
    If $Text = "" Then
    $Shout2 = "!!!"
    EingabeText()
    EndIf
    EndFunc

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

    Func EingabePw() ;Fordert den Nutzer zur 2maligen Eingabe des Passworts auf und überprüft ob sie überein stimmen.
    $Pw1 = InputBox ("Passwort","Bitte gewünschtes Passwort eingeben","","*")
    $Pw2 = InputBox ("Passwort","Bitte gewünschtes Passwort erneut eingeben","","*")
    If Not ($Pw1 = $Pw2) Then
    MsgBox (0,"Fehler","Die Passwörter stimmen nicht überein")
    EingabePw()
    EndIf
    EndFunc

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

    Func AbfrageUser() ;Fragt den Nutzer nach seinem vorher festgelegten Benutzernamen und überprüft auf dessen Richtigkeit.
    $Benutzername2 = InputBox ("Abfrage","Bitte Benutzername eingeben:")
    If Not ($Benutzername = $Benutzername2) Then
    MsgBox (0,"Fehler","Der eingegebene Benutzername stimmt nicht")
    AbfrageUser()
    EndIf
    EndFunc

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

    Func AbfragePw() ;Fragt den Nutzer nach seinem vorher festgelegten Passwort und überprüft auf dessen Richtigkeit.
    $PwInput = InputBox ("Abfrage","Bitte Passwort eingeben:","","*")
    If Not ($PwInput = $PwDec) Then
    MsgBox (0,"Fehler","Das eingegebene Passwort stimmt nicht")
    AbfragePw()
    EndIf
    EndFunc

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

    Func WriteToIni() ;Schreibt in die "data.ini" Datei.
    IniWrite ("data.ini","Eingaben","Benutzername",$Benutzername)
    IniWrite ("data.ini","Eingaben","Text",$TextEnc)
    IniWrite ("data.ini","Eingaben","Passwort",$PwEnc)
    EndFunc

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

    Func ReadFromIni() ;Liest die Daten aus der "data.ini" aus.
    $TextEnc = IniRead ("data.ini","Eingaben","Text","Error")
    $PwEnc = IniRead ("data.ini","Eingaben","Passwort","Error")
    EndFunc

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

    Func EncryptText() ;Verschlüsselt den eingegebenen Text mit dem gewählten Passwort.
    $TextEnc = _StringEncrypt (1,$Text,$Pw1)
    EndFunc

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

    Func EncryptPw() ;Verschlüsselt das gewählte Passwort mit dem Benutzernamen.
    $PwEnc = _StringEncrypt (1,$Pw1,$Benutzername)
    EndFunc

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

    Func DecryptText() ;Entschlüsselt den aus der "data.ini" verschlüsselt ausgelesenen Text mit dem Entschlüsselten Passwort.
    $TextDec = _StringEncrypt (0,$TextEnc,$PwDec)
    EndFunc

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

    Func DecryptPw() ;Entschlüsselt das aus der "data.ini" verschlüsselt ausgelesene Passwort mit dem Benutzernamen.
    $PwDec = _StringEncrypt (0,$PwEnc,$Benutzername)
    EndFunc

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

    Func Check()
    $Check = IniRead ("data.ini","Check","Check","Error")
    $Benutzername = IniRead ("data.ini","Eingaben","Benutzername","Error")
    EndFunc

    [/autoit]

    Und in der "data.ini" steht am Anfang nur folgendes:
    [Check]
    Check=1

    Den Befehl _StringEncrypt habe ich zwar schon verstanden als ich ihn in der Hilfe gelesen habe, aber ich wusste bis jetzt noch nicht wie ich ihn am besten in ein Script einbaue.
    Als nächstes schreibe ich noch ein kleines "DataClear" Script, damit man auch wirklich nicht in der "data.ini" herumpfuschen muss.

  • Versuch es mal so:

    Aufruf:

    Spoiler anzeigen
    [autoit]


    Dim $iEncript,$inputtext,$inputpw
    Verschluesselung( $iEncript,$inputtext,$inputpw)

    [/autoit]

    Funktion:

    Spoiler anzeigen
    [autoit]


    Func Verschluesselung( $fi_Encript,$f_inputtext,$f_inputpw)
    local = $f_encrypt
    $f_encrypt = _StringEncrypt ($i_Encript,$inputtext,$inputpw)
    return $f_encrypt
    EndFunc

    [/autoit]

    MfG
    Der_Doc

  • Wie genau das funktioniert kann ich dir auch nicht sagen. Ich denke aber, dass ein ganz anderer Algorithmus verwendet wird, wenn du einen höheren Level wählst. Sprich: Er verschlüsselt nicht öfter, sondern anders. Und für diesen anderen Algorithmus braucht er dann entsprechend mehr Zeit.

  • Hi,
    Das RC4-Verfahren ist relativ simpel, googeln hilft^^.

    Zitat

    Verschlüsselt er es sozusagen nach der Verschlüsselung nochmal, je nachdem wie hoch das Level ist oder wie habe ich das zu verstehen?

    So ähnlich funktioniert das. Im Prinzip gehts nur um vertauschen von Bytes und anschließendem XOR. Da ein zweimaliges XOR wieder zu den Ursprungsdaten führt, geht das sehr fix.

    Als sehr einfaches Verschlüsselungsverfahren könnte man einen Text mit einem genau so langen Schlüssel per Byteweise XOR verschlüsseln. Bei einem zufälligen Schlüssel ist der Text nicht mehr zu dechiffrieren. Allerdings braucht man zum Entschlüsseln auch wieder den Schlüssel, bei langen Dokumenten oder großen Bildern bedeutet das die doppelte Datenmenge. Heutzutage ist das eigentlich Schnurz, aber genau wegen der gigantischen Datenmengen (die damals nicht verarbeitet werden konnten) wurden diese komplizierten Verfahren entwickelt. Man sollte mit kleinen Schlüsseln große Mengen an Daten ver- und entschlüsseln können.
    Simples Beispiel:

    Spoiler anzeigen
    [autoit]

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

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

    $Form1 = GUICreate("Verschlüsseln / Entschlüsseln per XOR", 633, 453, 192, 114)
    $Button = GUICtrlCreateButton("Verschlüsseln / Entschlüsseln", 200, 184, 233, 57, $WS_GROUP)
    $Label1 = GUICtrlCreateLabel("Text eingeben, der Verschlüsselt oder entschlüsselt werden soll:", 16, 16, 305, 17)
    $Edit1 = GUICtrlCreateEdit("Das ist ein Geheimtext", 16, 40, 601, 129)

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

    $Edit2 = GUICtrlCreateEdit("", 16, 288, 601, 153)

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

    $Label2 = GUICtrlCreateLabel("Hier den Schlüssel zum Entschlüsseln eingeben oder den beim Verschlüsseln ermittelten zufälligen Schlüssel übernehmen!", 16, 256, 574, 17)
    GUISetState(@SW_SHOW)
    if guictrlread($edit1)<>"" Then GUICtrlSetData($edit2, _generatekey(guictrlread($edit1))) ;aus dem Edit1 einen Key generieren

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    case $Button
    $text=guictrlread($edit1) ;text auslesen
    $Key=guictrlread($edit2) ;schlüssel auslesen
    GUICtrlSetData($edit1, _encrypt_decrypt($text,$key)) ;verschlüsseln/entschlüsseln
    EndSwitch
    WEnd

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

    func _generatekey($text)
    $key=""
    for $i=1 to stringlen($text)
    do
    $zeichen=random(32,255,1) ;zufallszeichen
    until $zeichen<>stringmid($text,$i,1) ;falls beide zeichen gleich sind, wird das ergebnis des XOR =0 und ist nicht darstellbar
    $key &= chr($zeichen) ;Zeichen unterhalb 32 sind steuerzeichen und werden in EDIT/MSGBOX/CONSOLE nicht dargestellt
    Next
    return $key
    endfunc

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

    func _encrypt_decrypt($text,$key) ;text ver- bzw. entschlüsseln
    $encrypt_decrypt=""
    if guictrlread($edit2)="" Then ;falls edit2 leer, key generieren
    GUICtrlSetData($edit2, _generatekey(guictrlread($edit1))) ;aus dem Edit1 einen Key generieren
    endif

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

    for $i=1 to stringlen($text) ;alle zeichen durchgehen
    $encrypt_decrypt&=chr(BitXOR(asc(stringmid($text,$i,1)),asc(stringmid($key,$i,1))));XOR -Verknüpfung des textzeichens mit dem Keyzeichen
    Next
    return $encrypt_decrypt
    endfunc

    [/autoit]

    Man könnte den Schlüssel verkürzen, indem man ihn für die einzelnen Textabschnitte mehrfach benutzt. Das ist aber ein risiko, daher werden Verfahren zum Bit- oder Bytetauschen, Rotieren usw eingesetzt um die Schlüssellänge möglichst kurz zu halten.