Fehler beim Encrypten wegen fehlender Anführungszeichen am Ende des String

  • Sonstige

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    Fehler beim Encrypten wegen fehlender Anführungszeichen am Ende des String

    Ich Programiere zur zeit eine Appi zum beschreiben und auslesen von Chipkarten. Das Beschreiben der Karte mit verschlüsselten Daten funktioniert super. Nur wenn ich die Daten wieder in einen String auslese, bekommt er zwar die Daten aber im wert des String fehlen am Ende die abschließenden Gänsefüße.




    Dim tmp as String

    tmp = Space(200)

    'Die Schleife wiederholt den Verbindungsaufbau zur SmartCard falls dieser fehlgeschlagen ist / "Ret" enthält den Fehler Code, falls vorhanden

    Do
    Ret = SCardComand(0, "Card,MemRead,0,200", 0, CStr(0), 0, tmp, 200) 'In tmp wird der Wert geschrieben der in der Chipkarte von der Stelle "0" bis zur Stelle "200" steht
    i = i + 1
    Loop While Ret <> 0 And i <> 5


    Dim encdata() As Byte = System.Convert.FromBase64String(tmp) ' Hier kommt der Fehler "Ungültige Zeichen in einer Base-64-Zeichenfolge."





    Hab dann mal nachgeguckt ob in tmp nicht alle Zeichen des Verschlüsselten ausgelesenen String steht. Er enthielt alle Zeichen nur hat der Wert keine abschließendes Anführungszeichen.

    z.B. tmp = "/hf1ta369HxGPCVakQarevnFAxk4mlwGwxsNx/VILUIysF4GRvyvZevpL5eS19OHiHwZlQJ7A9G/nIxXtBTnZ3DMAav9A3IJVekZNSVr679sM55XWZRa9nBWrUIhqytg

    Wenn ich den Wert vor der Stelle, an der der Fehler auftritt, bearbeite indem ich die Anführungszeichen hinzufüge kommt es nicht zu diesem Fehler.
    Wenn ich tmp mit nur 128 Leerzeichen, also der Bitlänge des verschlüsselten String, auffülle Funktioniert alles wieder wunderbar.

    tmp = "/hf1ta369HxGPCVakQarevnFAxk4mlwGwxsNx/VILUIysF4GRvyvZevpL5eS19OHiHwZlQJ7A9G/nIxXtBTnZ3DMAav9A3IJVekZNSVr679sM55XWZRa9nBWrUIhqytg"

    der String wird mit " abgeschlossen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Schaffragger“ ()

    Schaffragger schrieb:

    Wenn ich den Wert vor der Stelle, an der der Fehler auftritt, bearbeite indem ich die Anführungszeichen hinzufüge kommt es nicht zu diesem Fehler.

    Das ist aber ungewöhnlich, denn das Anführungszeichen ist eigentlich KEIN gültiges Zeichen bei Base64!
    Gültige Zeichen sind lediglich A-Z, a-z, 0-9, +, / und das =. wobei das "=" nur als Füllzeichen verwendet wird am Ende des String (weil Base64 auf Blöcken von je 4 Zeichen arbeitet). So haben wir nämlich 26 + 26 + 10 + 1 + 1 also 64 Zeichen, was ja genau benötigt wird, um je 6 Bit zu kodieren.

    Schaffragger schrieb:

    Es soll ja angeben das der String zu Ende ist, so wie am Anfang die " bedeuten das er anfängt.

    Die Anzeige unter "Wert" im Überwachungsfenster fügt die "" hinzu um den String kenntlich zu machen. Sie sind NICHT Teil des Strings so wie er intern gespeichert ist. Kann man schon an der Länge des Strings sehen.
    einfach mal s="ABC" machen und im Überwachungsfenster anzeigen lassen. Dann mal s.length anschauen: 3 !

    Würdest du die " tatsächlich hinzufügen, DANN würde sich die FromBase64 Funktion beschweren, denn ein " darf NICHT Teil eines Base64 Strings sein!
    Mir ist klar das die nicht teil vom string sind. Wenn ich tmp = Space(200) angebe wird mir aber in der Anzeige Wert die " am Ende nicht Angezeigt. mach ich einen Rechtsklick->Wert bearbeiten und füge die " hinten an hat system.convert.FromBase64String() kein Problem mehr damit. Wenn ich das nicht mache wird mir die String.length als 200 angezeigt obwohl der string nur 128 zeichen hat.
    Ist ja auch klar. Du erstellst einen String aus 200 Leerzeichen. Davon werden durch deine Auslesefunktion die ersten 128 durch Base64 Chars überschrieben ... der String wird aber nicht terminiert, so dass am Ende dann entweder Leerzeichen oder Müll steht. Vermutlich Leerzeichen. Wenn ja, dann einfach im Code per Trim() abschneiden.

    Schaffragger schrieb:

    Mein Dozent meint das warscheinlich der Debugger spinnt

    humbug ...
    das Problem ist, das ich (wir) nicht weiß, wie deine komische auslesefunktion genau funktioniert, bzw warum du einen String mit bereits Zeichen darin übergeben musst. Im Zweifel musst du halt alles aus diesem String entfernen, was NICHT Base64 ist.
    Schau dir den String einfach mal Zeichen für Zeichen an (for each c as char in tmp) und schaue, was NACH den korrekten Zeichen kommt.