Gedankenfehler?!?

  • Irgendwie habe ich doch da einen Gedankenfehler bei dem Testscript.
    Er speicher nicht das in die Textdatei, was er bei der ersten MsgBox anzeigt
    Zeilen: 13-16 scheinen fehlerhaft zu sein. :(

    Spoiler anzeigen
    [autoit]


    #include <Crypt.au3>

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

    ; Passwort & zu codierender Text
    Local Const $sUserKey = "CryptPassword" ; Deklariert eine Passwort-Zeichenfolge um die Daten zu ver- und entschlüsseln.
    Local $sData = "0123456789" ; Dieser Text wird verschlüsselt werden.

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

    ; codieren
    Local $bEncrypted = _Crypt_EncryptData($sData, $sUserKey, $CALG_RC4) ; Verschlüsselt den Text mit Hilfe der generischen Passwort-Zeichenfolge.
    MsgBox(0,"Verschlüsselter Text", $bEncrypted)

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

    ; hier macht er was falsch !!! Oder?
    ; Daten in Textdatei schreiben und in MsgBox ausgeben
    Local $file = FileOpen("binaere.txt",1)
    FileWrite($file,$bEncrypted)
    FileClose($file)
    MsgBox(0,"Verschlüsselter Text aus Textdatei.",FileRead("binaere.txt"))

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

    ; decodieren
    $bEncrypted = _Crypt_DecryptData($bEncrypted, $sUserKey, $CALG_RC4) ; Entschlüsselt den Text mit Hilfe der generischen Passwort-Zeichenfolge. Der Rückgabewert ist ein Binärstring.
    ;MsgBox(0, "Entschlüsselter Text", BinaryToString($bEncrypted)) ; Konvertiert den Binärstring mit Hilfe BinaryToString um den Ausgangstext anzuzeigen, den wir verschlüsselten.

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

    Local $file = FileRead("binaerer.txt")
    MsgBox(0,"decodieren", BinaryToString($bEncrypted))

    [/autoit]

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    Einmal editiert, zuletzt von Alina (29. November 2014 um 14:18)

  • Hi,
    Es wurde schon alles richtig in die Datei geschrieben, nur falsch gelesen.
    Das liegt wohl daran, dass FileRead die Daten als String ausliest.
    Da du aber ein Binary reinschreibst, wird dieser folglich als String gelesen.
    Das kann man so probieren:

    [autoit]

    #include <Crypt.au3>
    ; Passwort & zu codierender Text
    Local Const $sUserKey = "CryptPassword" ; Deklariert eine Passwort-Zeichenfolge um die Daten zu ver- und entschlüsseln.
    Local $sData = "0123456789" ; Dieser Text wird verschlüsselt werden.
    ; codieren
    Local $bEncrypted = _Crypt_EncryptData($sData, $sUserKey, $CALG_RC4) ; Verschlüsselt den Text mit Hilfe der generischen Passwort-Zeichenfolge.
    Local $bEncryptedString = BinaryToString($bEncrypted)
    ;als String sollte das genauso aussehen wie es aus der datei gelesen wurde
    MsgBox(0,"Verschlüsselter Text", $bEncrypted)
    MsgBox(0,"Verschlüsselter Text als String", $bEncryptedString)
    ; hier macht er was falsch !!! Oder?
    ; Daten in Textdatei schreiben und in MsgBox ausgeben
    Local $file = FileOpen("binaere.txt",1)
    FileWrite($file,$bEncryptedString)
    FileClose($file)
    MsgBox(0,"Verschlüsselter Text aus Textdatei.",FileRead("binaere.txt"))
    ; decodieren
    $bEncrypted = _Crypt_DecryptData($bEncrypted, $sUserKey, $CALG_RC4) ; Entschlüsselt den Text mit Hilfe der generischen Passwort-Zeichenfolge. Der Rückgabewert ist ein Binärstring.
    ;MsgBox(0, "Entschlüsselter Text", BinaryToString($bEncrypted)) ; Konvertiert den Binärstring mit Hilfe BinaryToString um den Ausgangstext anzuzeigen, den wir verschlüsselten.
    Local $file = FileRead("binaerer.txt")
    MsgBox(0,"decodieren", BinaryToString($bEncrypted))

    [/autoit]

    Man könnte die Datei zum Beispiel so auslesen:

    [autoit]

    MsgBox(0,"Verschlüsselter Text aus Textdatei.",StringToBinary(FileRead("binaere.txt")))

    [/autoit]

    edit: moment, irgentwas stimmt noch nicht... ?(

    Einmal editiert, zuletzt von elektronenpeter (28. November 2014 um 15:41)

    • Offizieller Beitrag

    Welche AutoIt Version benutzt du? Bei mir funktioniert das Tadellos. Die zweite MsgBox zeigt halt Wirrwarr an. Aber in der dritten MsgBox wird wieder richtig dekodiert.

    Die Crypt Funktionen geben ein Binären Wert aus, die 0x1234ABCD Daten können aber auch als String verwechselt werden (Hier sieht man übrigends den Nachteil, dass AutoIt auf Namenskonvention kein Wert liegt) sind aber wie gesagt Binär. D.h. 0x414243 wird nicht als "0x414243" in die Textdatei geschrieben sondern als "ABC" (ASCII). _Crypt_DecryptData formatiert aber Strings wieder ganz normal in Binärdaten um, das heißt ABC wird wieder zu 0x414243. Deswegen funktioniert die letzte Funktion (bei mir mit AutoIt 3.3.12.0)

    Alternativ

    [autoit]

    FileWrite($file,String($bEncrypted));Zeile 14

    [/autoit]

    Gruß,
    Spider

  • Was spricht gegen diese Lösung?
    Die Zeile FileWrite($file,''&$bEncrypted&'') ist doch okay als Lösung, oder?

    Spoiler anzeigen
    [autoit]


    #include <Crypt.au3>

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

    ; Passwort & zu codierender Text
    Local Const $sUserKey = "CryptPassword" ; Deklariert eine Passwort-Zeichenfolge um die Daten zu ver- und entschlüsseln.
    Local $sData = "0123456789" ; Dieser Text wird verschlüsselt werden.

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

    ; codieren
    Global $bEncrypted = _Crypt_EncryptData($sData, $sUserKey, $CALG_RC4) ; Verschlüsselt den Text mit Hilfe der generischen Passwort-Zeichenfolge.

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

    MsgBox(0,"Verschlüsselter Text", $bEncrypted)

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

    ; Daten in Textdatei schreiben und in MsgBox ausgeben
    Local $file = FileOpen("binaere.txt",1)

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

    FileWrite($file,''&$bEncrypted&'')
    FileClose($file)
    FileClose($file)
    Local $file = FileRead("binaere.txt")
    MsgBox(0,"Verschlüsselter Text aus Textdatei.",$file)

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

    ; decodieren
    $file = _Crypt_DecryptData($file, $sUserKey, $CALG_RC4) ; Entschlüsselt den Text mit Hilfe der generischen Passwort-Zeichenfolge. Der Rückgabewert ist ein Binärstring.
    ;MsgBox(0, "Entschlüsselter Text", BinaryToString($bEncrypted)) ; Konvertiert den Binärstring mit Hilfe BinaryToString um den Ausgangstext anzuzeigen, den wir verschlüsselten.

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

    ;Local $file = FileRead("binaere.txt")
    MsgBox(0,"decodieren", BinaryToString($file))

    [/autoit]

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Ich vermute, grundlegendes Problem ist wieder mal der Datentyp, der von Funktionen verwendet beziehungsweise zurückgegeben wird.

    Wie schon von GTA-Spider angesprochen, ist es völlig unerheblich, in welchem Format Funktionen ihre Parameter zurückgeben, so lange der Programmierer WEISS, welches Datenformat verwendet wird!

    In einer reinen (jaja ANSI) *.txt-Datei stehen per se erstmal nur BYTES.
    Wie diese Bytes beim Auslesen interpretiert werden, ist Sache des Anwenders!
    Somit ist es auch völlig egal, in welchem Format in die Datei geschrieben wird, solange klar ist, wie mit den auszulesenden Daten umzugehen ist.
    Ob der Dateiinhalt eine der folgenden Zeilen
    ABC
    0x414243
    414243
    ist, macht doch nur beim Auslesen einen Unterschied bzw. bei der Interpretation des Inhaltes! Für das Schreiben ist das völlig unerheblich!
    Die Flags beim Fileopen() für den Schreibmodus wandeln doch nur in ein bestimmtes "Anzeigeformat" um.

    Ein einfaches Filewrite("test.txt",$irgendwelche_Daten) funktioniert grundsätzlich mit ALLEN Daten! Natürlich auch "binären"...(omfg, jetzt werde ich gleich gekreuzigt, natürlich sind alle Daten "binär" :P )
    Und auch ein $irgendwelche_Daten=Fileread("test.txt") funktioniert immer.

    Wenn man natürlich als Programmierer nicht weiss, welchen Datentyp man in die Datei geschrieben hat, und wie dieser Datentyp nach dem Auslesen weiterzuverarbeiten ist, dann hat man natürlich schlechte Karten...
    Gleiches gilt für die "Programmierer", welche sich über "komische Zeichen" in Msgboxen bzw.bei der Anzeige von Dateiinhalten beschweren.
    Das liegt einfach daran, dass diese Leute die falschen Anzeigeprogramme benutzen. Hexeditor FTW! :thumbup:

    [autoit]

    #include <Crypt.au3>

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

    ; Passwort & zu codierender Text
    Local Const $sUserKey = "CryptPassword" ; Deklariert eine Passwort-Zeichenfolge um die Daten zu ver- und entschlüsseln.
    Local $sData = "0123456789" ; Dieser Text wird verschlüsselt werden.

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

    ; codieren
    Local $bEncrypted = _Crypt_EncryptData($sData, $sUserKey, $CALG_RC4) ; Verschlüsselt den Text mit Hilfe der generischen Passwort-Zeichenfolge.

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

    FileDelete("binaere.txt") ;textdatei löschen, da filewrite daten anhängt (append)
    FileWrite("binaere.txt", $bEncrypted) ;schreiben

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

    ; decodieren
    Local $file = FileRead("binaere.txt") ;hier kommt das heraus, was _Crypt_EncryptData() zurückgegeben hat!
    $bEncrypted = _Crypt_DecryptData($file, $sUserKey, $CALG_RC4) ; Entschlüsselt den Text mit Hilfe der generischen Passwort-Zeichenfolge. Der Rückgabewert ist ein Binärstring.

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

    MsgBox(0, "decodieren", BinaryToString($bEncrypted)) ;HIER liegt der Hase im Pfeffer^^

    [/autoit]
  • Danke allen für die Hilfe / Erklärung !!!

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl