florengray
Goto Top

VB Express String in Datei schreiben unterschiedl Zeichenanzahl

Hallo,
Suche hat leider nix gebracht.

Also ich schreibe ein Programm, in dem ich so erstmal zwei Var habe.

tmp_1 As String tmp_2 As String
tmp_1 enthält Daten, die ich verschlüsseln will.
tmp_2 enthält zufällige Zeichen 224 * Rnd() + 31 (Damit will ich keine Steuerzeichen drin haben)
Dann verschlüssele ich einfach, indem ich die Zeichenwerte addiere und das entstandene Zeichen in eine andere Variable schreibe.
Das geht auch.
Im Programm sind beide "noch" 32 Zeichen lang. (Per Length ermittelt)
Wenn ich diese dann per fso in eine Datei schreibe, dann passt das aber nicht mehr.
Dann ist der eine 46 der andere 58 Zeichen lang?????????????
Oder auch andere Werte.
Kann mir einer sagen was da nicht passt.
Ich krieg das dann nämlich nicht mehr entschlüsselt!

Ach ja, ich benutze ChrW() um das entstandene Zeichen zu ermitteln.

Freue mich auf Antworten!!!

florengray

Content-Key: 92415

Url: https://administrator.de/contentid/92415

Ausgedruckt am: 28.03.2024 um 09:03 Uhr

Mitglied: bastla
bastla 19.07.2008 um 20:20:56 Uhr
Goto Top
Hallo florengray!

Wozu ChrW()? Es sollte doch Chr() genügen.
Und noch ganz nebenbei:
224 * Rnd() + 31
kann auch 31 ergeben, also besser
Int(224 * Rnd()) + 32
Grüße
bastla
Mitglied: florengray
florengray 19.07.2008 um 20:40:21 Uhr
Goto Top
Hallo bastla!
Ja, aber wenn in tmp_1 ein Zeichen mit 124 vorkommt und mein tmp_2 an der Stelle ein Zeichencode mit 132 hat dann komme ich ja über 255.
Und das kann Chr() nicht.
Was sagst du denn zu dem "Problem"?
Ich versteh es nicht. Wieso habe ich im Programm beide mit 32 Stellen und dann in der Datei was anderes? Ich hab die Datei mal mit Notepadd ++ geöffnet und versch. Formate ausgewählt. Egal.
Einer ist z.B. 46 und der andere 52 Stellen lang.
Ich hab mich nämlich gewundert warum ich permanent die Fehlermeldung bekomme:
"... Der String darf nicht 0 (Null) sein..."
Daraufhin habe ich mühsam gesucht und gefunden, dass beim Entschlüsseln die beiden eingelesenen Zeilen versch. lang sind. Und damit kann ich keine Entschlüsselung machen.
Komischerweise geht es, wenn ich statt der Randomanweisung einfach dem tmp_2 mit den Chr(0) oder Chr(1) fülle. Dann geht es?????
Aber es geht nicht mehr, wenn ich z.B. tmp_2 durchgehend mit Chr(98) oder so belege.
Ich kann es nicht nachvollziehen.
Zuerst hatte ich gedacht, dass bestimmte Steuerzeichen daran schuld wären, aber die habe ich ja mit +32 dann ausgeklammert. Der Fehler ist aber trotzdem noch da!???
Ziel sollte es sein, eine One-Time-Pad Verschlüsselung zu demonstrieren.
Das Vorgehen: Für jede Zeile wird immer ein neuer Schlüssel generiert. (tmp_2)
Genau so lang, wie die Zeile, die verschl. werden soll.
Dann wird die Zeile verschlüsselt. (Zeichenwerte addieren)
Dann wird der generierte Schlüssel mit dem Benutzerpasswort verschlüsselt.
In der Datei steht dann eine Zeile verschlüsselte Daten und daneben der verschlüsselte generierte Schlüssel, der nur mit dem Benutzerpasswort entschlüsselt werden kann um dann an die Daten zu kommen.
Der Sinn: Man erfährt nicht wirklich, welcher Schlüssel schon verwendet wurde. (Wird ja intern alles geregelt)
Ändert trotzdem nichts an dem Problem.
Aber trotzdem Danke.

florengray
Mitglied: bastla
bastla 19.07.2008 um 21:02:49 Uhr
Goto Top
Hallo florengray!

Leichter nachvollziehbar wird's grundsätzlich, wenn Code nicht nur beschrieben, sondern auch gepostet wird ...

Versuch es einmal mit
Int(256 * Rnd()) + 256
Damit entstehen dann auf jeden Fall Zeichen mit einem Code >= 256, welche dann jeweils 2 Byte für die Speicherung benötigen.

Grüße
bastla
Mitglied: florengray
florengray 19.07.2008 um 21:48:00 Uhr
Goto Top
       
        Randomize()

        'Aus Array eine Zeile machen  
        Dim tmp_1 As String 'Zeile -> String  
        Dim tmp_2 As Integer 'Länge von Zeile  
        Dim tmp_3 As String 'Neue Länge vom UserPW  
        Dim tmp_4 As String 'RndPW  
        Dim tmp_5 As String 'Verschlüsselte Zeile  
        Dim tmp_6 As String 'Verschlüsseltes RndPW  

        For a = 0 To Aktualisierungsrate - 1 'Array jede Zeile berücksichtigen  

            For b = 0 To 4 'Jede Spalte auslesen  

                tmp_1 += Log_Table(a, b) & " # " 'Zusammensetzen der Daten zu einer Zeile  
                Log_Table(a, b) = Nothing
                tmp_2 = tmp_1.Length()

            Next b

            If User_PW.Length() > tmp_2 Then 'UserPW auf neue Länge zurechtschneiden  
                tmp_3 = Mid(User_PW, 1, tmp_2)
            ElseIf User_PW.Length() = tmp_2 Then
                tmp_3 = User_PW
            ElseIf User_PW.Length() < tmp_2 Then
                tmp_3 = User_PW & Mid(User_PW, 1, tmp_2 - User_PW.Length())
            End If

            For c = 1 To tmp_2 'Jedes Zeichen auslesen  

                tmp_4 += Chr(Int(223 * Rnd() + 32)) 'Zufallspasswort generieren ohne Steuerzeichen  
                
            Next c

            For d = 1 To tmp_2

                'Zeile verschlüsseln  
                tmp_5 += ChrW(Asc(Mid(tmp_1, d, 1)) + Asc(Mid(tmp_4, d, 1)))

                'RndPW verschlüsseln  
                tmp_6 += ChrW(Asc(Mid(tmp_4, d, 1)) + Asc(Mid(tmp_3, d, 1)))

            Next d

Das ist mein Modul, wo die Daten verschlüsselt werden. Ich hoffe man kann es lesen.
In was für einem Format werden Dateien denn gelesen, wenn man ein fso benutzt?
ASCII nehme ich an.
Könnten da evt. leseschwierigkeiten auftreten? Eigentlich ja nicht, denn ich schreibe auch mit nem fso.
Mitglied: bastla
bastla 19.07.2008 um 22:03:43 Uhr
Goto Top
Hallo florengray!

In was für einem Format werden Dateien denn gelesen, wenn man ein fso benutzt? ASCII nehme ich an.
Das kannst Du als 4. Parameter (nach Dateiname, E/A-Modus und Erstellen) beim Öffnen angeben (True = Unicode, False bzw keine Angabe = ASCII).
Ziel sollte es sein, einheitlich Zeichen mit einem Code >= 256 zu erzeugen. Dies kannst Du erreichen, indem Du entweder, wie oben vorgeschlagen, das ZufallsPW in einen entsprechenden Bereich bringst, oder jeweils beim Verschlüsseln in den Zeilen 39 und 42 zB zusätzlich 256 addierst (und beim Entschlüsseln natürlich wieder subtrahierst).

Grüße
bastla
Mitglied: florengray
florengray 19.07.2008 um 22:10:30 Uhr
Goto Top
Hört sich gut an.
Werd ich mal ausprobieren.
ChrW() geht ja von -32768 bis 65535. Was sind denn das noch für Zeichen? Keine oder? EInfach nur ein Wert.
Aber vielen Dank für den Tipp!!

florengray
Mitglied: florengray
florengray 20.07.2008 um 00:25:08 Uhr
Goto Top
Hallo nochmal.
Ich glaube den Fehler gefunden zu haben.
Wenn mein Programm zum Beispiel einfach nur "Testnachricht" in die Datei schreibt, so liest mein anderes Programm dieses als xxxTestnachricht aus. xxx sind hier Unicode Zeichen. Wo die herkommen ist mir schleierhaft.
Wenn dann noch "Testschlüssel" geschrieben wird und dann wieder ausgelesen wird, so steht da nicht Testschlüssel sondern Testschlüssel. Darum entstehen die Diskrepanzen zwischen den Zeilenlängen.

Ich öffne meine Datei so:

        Dim fso ' FileSystemObject  
        Dim textfile ' Dateiobjekt  

        fso = CreateObject("Scripting.FileSystemObject")  
       textfile = fso.OpenTextFile(Filename)

       Do While textfile.AtEndOfStream <> True

            ReDim Preserve Read_Line(Counter_Array_File_Read)

            Read_Line(Counter_Array_File_Read) = textfile.ReadLine 
            Counter_Array_File_Read += 1

        Loop

        textfile.Close()

Ich hab da nicht gefunden, wo ich die per Unicode öffnen kann.
Kann man mir noch sagen, ob es eine Methode gibt, die gleich Dateien im Unicode Format schreibt?

Ich hab noch sowas ausprobiert:

        Dim inhalt = ""  
        FileSystem.FileOpen(1, Filename, OpenMode.Input, OpenAccess.Read)
        Input(1, inhalt)

Aber da wird nur eine Zeile ausgelesen und anscheinend auch nur im ASCII Format.

florengray
Mitglied: bastla
bastla 20.07.2008 um 00:34:03 Uhr
Goto Top
Hallo Florengray!

Grundsätzlich sollte (allerdings ungetestet) mit den folgenden Codezeilen das Schreiben bzw Einlesen eines Textes über ein Array im Unicode-Format zu bewerkstelligen sein:
Dim fso ' FileSystemObject  
fso = CreateObject("Scripting.FileSystemObject")  

'Schreiben des Arrays Read_Line  
fso.OpenTextFile(Filename, 2, True, True).Write Join(Read_Line, vbCrLF)

'Einlesen in das Array Read_Line  
Read_Line = Split(fso.OpenTextFile(Filename, 1, True, True).ReadAll, vbCrLF)
Grüße
bastla
Mitglied: florengray
florengray 20.07.2008 um 14:39:33 Uhr
Goto Top
Hallo,
Sieht gut aus, aber ich muss kein Array schreiben, sondern einfach nur einen String.
War vorher vielleicht verwirrend geschildert.
Ich habe ein Array. Daten(10, 4) Aber das wird dann mit einer For in 10 einzelen Strings umgewandelt und die werden dann Zeilenweise geschrieben.
Wenn ich das dann lesen muss, so bracuh ich nur die Zeilen aus der Datei auslesen. Den Rest hab ich schon. Ich muss jetzt nur ne Möglichkeit finden, wie ich alles im Unicode Format schreiben und lesen kann.

florengray
Mitglied: bastla
bastla 20.07.2008 um 14:44:22 Uhr
Goto Top
Hallo florengray!

Das Array in meinem Beispiel besteht aus den einzelnen Zeilen der Textdatei - durch die Trennung am Zeilenende (vbCrLf) wird der gesamte Text nach dem Lesen in ein String-Array aufgesplittet bzw beim Schreiben das Array mit Join() wieder zum Gesamttext zusammengefügt.

Grüße
bastla
Mitglied: florengray
florengray 20.07.2008 um 14:55:52 Uhr
Goto Top
Versteh ich nicht wirklich.
Ich weiss was Split macht. Aber ich hab kein Array was ich Join() geben könnte.
Wenn ich jetzt meine Daten schreiben will, dann hab ich das hier:
Output_Log_String. Das ist nur eine var. als String deklariert. Die muss nun in ne Datei geschrieben werden im Unicode Format.
Wenn ich jetzt in deinem Beispiel beim schreiben die Read_Line bei Join() durch mein Output_Log_String ersetze dann kommt ein Überladungsfehler. Und ein Konvertierungsfehler von String und 1-Dimensionales Array.
Is ja logisch, denn Join() braucht ein 1-Dimensionales Array und mein Output_Log-String ist keines.

Grüße florengray

edit:
Ich habst jetzt so geamcht:
<code
'Schreiben des Arrays Read_Line
fso.OpenTextFile(File_Name, 2, True, True).WriteLine(Output_Log_String)
Output_Log_String = Nothing


Um zu testen, ob Unicode geschrieben wird, habe ich einfach von Word her Φ eingefügt. Mit False wird ein F mit True ein Φ geschrieben.
Das scheint nu zu gehen.

Mal sehen, wie es jetzt beim lesen aussieht.

florengray
Mitglied: bastla
bastla 20.07.2008 um 15:15:56 Uhr
Goto Top
Hallo florengray!

Die Verwendung des Arrays in meinem Beispiel ergab sich aus Deinem geposteten Einlesealgorithmus, in welchem Du ja ebenfalls ein (dynamisches) Array einsetzt - meine Zeile 8 ersetzt nur Deine Zeilen 5 bis 16 ...

... aber wenn es tatsächlich nur eine Zeile sein soll, ist natürlich "ReadLine/WriteLine" ausreichend.

Grüße
bastla
Mitglied: florengray
florengray 20.07.2008 um 15:25:22 Uhr
Goto Top
Hallo,
habs jetzt auch gerafft. Soweit scheint das zu funktionieren. Es treten keine Differenzen zwischen den Zeilenlängen auf. *freu*
Aber kannst du mir noch verraten, wo du die Parameter für dein
fso.OpenTextFile(Filename, 2, True, True)

herbekommen hast? Ich find da nix.
Vielleicht suche ich aber auch falsch.

Ansonsten scheint bis jetzt erstmal alles zu funktionieren.


Besten Dank!!!!

florengray

:edit
Nee so ganz gehts noch nett.
Das mit den Längen geht jetzt. Aber beim entschlüsseln, werden die Zeichen nicht mehr richtig dargestellt.
?5:01 12 # # 562$413 ? 7
    1. ??
    sowas kommt daraus, aber es müssten erstmal 4 Zeilen sein und die sind auch viel, viel länger.

    Weisst du warum das nicht geht?

    Ich hab von dem Zeichen, wa sich verschl will, den Zeichencode abgefragt mit Asc().
    Dann habe ich den Zeichencode von Schlüssel mit Asc() abgefragt.
    Dann hab ich die beiden addiert.
    Nach dem gleichen Verfahren hab ich auch dann den Schlüssel mit dem BenutzerPW verschl.

    Der Weg müsste jetzt eigentlich nur Rückwärts sein.
    Aber das scheint nicht richtig zu gehen.

    Ahhhh!!!
    Ich rufe ja beim entschl mit Asc() ab. Und habe aber Werte über 255!!!!
    das geht ja auch nicht. *Mensch*

    Aber jetzt Stellt sich die Frage, wie kann ich die Werte auch über 255 abrufen???

    Weisst du da was?

    florengray

    :edit

    Joo,
    mit AscW() gehts.

    florengray
Mitglied: bastla
bastla 20.07.2008 um 16:37:31 Uhr
Goto Top
Hallo florengray!

Die gesuchten Parameter findest Du hier: OpenTextFile Method (bzw ausgehend von der FSO-Doku).


Grüße
bastla
Mitglied: florengray
florengray 20.07.2008 um 16:45:00 Uhr
Goto Top
Super! So was habe ich schon lange gesucht!

Vielen Dank für alles!

florengray
Mitglied: bastla
bastla 20.07.2008 um 16:52:14 Uhr
Goto Top
Hallo florengray!

Vielen Dank für alles!
Wofür denn - hast ja ohnehin fast alles selbst gelöst ... face-wink

Grüße
bastla