| 

.NET C# Java Javascript Exception

3
Hallo

Ich bekomme einen Base64 codierten String den ich decodieren will. Generiert von einer PHP anwendung.

Convert.FromBase64String(basestring)

Allerding wird reklamiert das basestring kein Base64 string ist. Ich bekomme den String in form eines URL Parameters.

Wie kriege ich den string decodiert?

QCg_PCFbQS1aYS16MC05Xy1dKSh6dXNhbW1lbmFyYmVpdCg_OsKgfCZuYnNwO3xbXHMsJ10pK21pdCg_OsKgfCZuYnNwO3xbXHMsJ10pK2xpbmtsaWZ0KSg_IVtBLVphLXowLTlfLV0pQGk

PS: Ich vermute mal das es an den _ liegt.
News:
09.11.2009
GENiALi 2,5k 1 2 8
GENiALi 2,5k 1 2 8
Danke an alle. Werde es heute Abend testen.
GENiALi 10.11.2009
3 Antworten
4
Also mit PHP selbst kann ich deinen Base64-String einwandfrei dekodieren. Ok es kommen ein paar nicht darstellbare Zeichen raus, aber das ist durchaus üblich.

@(VÐKV˜K^ŒNWËWJJ\Ø[[Y[˜\˜™Z]
¬*Âfæ'7·ÅµÇ2ÂuÒ’¶Ö—B€ë
ð™¹‰ÍÀíñmqÌ°t¤­±¥¹­±¥™Ð¤ ![A-Za-z0-9_-])@i


Wenn ich mit PHP den String dekodiere und wieder encodiere bekomme ich folgenden String:
QCgPCFbQS1aYS16MC05Xy1dKSh6dXNhbW1lbmFyYmVpdCgOsKgfCZuYnNwO3xbXHMsJ
10pK21pdCgOsKgfCZuYnNwO3xbXHMsJ10pK2xpbmtsaWZ0KSgIVtBLVphLXowLTlfLV0pQGk=

Es ist ein ähnlicher String, da die Unterstriche entfernt sind und ein = am Ende hinzugekommen ist. Evtl. hat die Anzahl der Unterstriche entwas mit der Anzahl der = am Ende zu tun?

Ahh ich habs:
RFC 3548 beschreibt ebenfalls diese Kodierung, schlägt allerdings eine leicht modifizierte Variante vor, welche benutzt werden soll, falls die Zeichen + und / nicht angewendet werden können. (Zum Beispiel bei Dateinamen oder anderen Umgebungen, wo diese Zeichen eine Sonderbedeutung haben.) Diese Zeichen werden durch - (Minus, ASCII 2Dhex) und _ (Unterstrich, ASCII 5Fhex) ersetzt

Der Ursprungswert war also:
QCg/PCFbQS1aYS16MC05Xy1dKSh6dXNhbW1lbmFyYmVpdCg/OsKgfCZuYnNwO3xbXHMsJ10pK21pdCg/OsKgfCZuYnNwO3xbXHMsJ10pK2xpbmtsaWZ0KSg/IVtBLVphLXowLTlfLV0pQGk

und decodiert dann:
@(?<![A-Za-z0-9_-])(zusammenarbeit(?:Â | |[\s,'])+mit(?:Â | |[\s,'])+linklift)(?![A-Za-z0-9_-])@i

Der Base64 String stimmt nun allerdings nicht in der Länge, da laut RFC das "=" am Ende entfernt werden darf. Doch woher wissen wir, ob eins hin muß oder nicht? Nunja die Länge eines Base64 Strings muß immer durch 4 teilbar sein.

Womit wir dann zu folgendem Quellcode kommen in C#:
// Url String
string base64UrlEncodedText = "QCg_PCFbQS1aYS16MC05Xy1dKSh6dXNhbW1lbmFyYmVpdCg_OsKgfCZuYnNwO3xbXHMsJ10pK21pdCg_OsKgfCZuYnNwO3xbXHMsJ10pK2xpbmtsaWZ0KSg_IVtBLVphLXowLTlfLV0pQGk";
// ersetze Minus und Unterstrich
string base64EncodedText = base64UrlEncodedText.Replace('-', '+').Replace('_', '/');
// hänge evtl. ein Istgleich an, wenn kein volles Quartett
base64EncodedText = base64EncodedText.PadRight(base64EncodedText.Length + (4 - base64EncodedText.Length % 4) % 4, '=');

Console.WriteLine(base64EncodedText);

// Entschlüsselung
byte[] text = Convert.FromBase64String(base64EncodedText);
// byte[] to String
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
Console.WriteLine(enc.GetString(text));


Grüßle
10.11.2009
Blue 321 1 5
Blue 321 1 5
PHP wird die nicht erlaubten Zeichen wohl einfach ignorieren
DaSpors 10.11.2009
Funktioniert super. Mensch, dass das nicht einfacher sein kann....
GENiALi 10.11.2009
2
Hi,

habe mal ein wenig gesucht und in der MSDN was gefunden, was deinen Verdacht bestätigt:

(string) besteht aus Base-64-Ziffern, Leerraumzeichen und nachfolgenden Füllzeichen. Die Base-64-Ziffern sind in von 0 (null) aufsteigender Reihenfolge die Großbuchstaben 'A' bis 'Z', die Kleinbuchstaben 'a' bis 'z', die Ziffern '0' bis '9' und die Zeichen '+' und '/'.

Zu den Leerraumzeichen (mit Unicode-Namen und hexadezimalem Codepunkt) zählen die folgenden: Tabstoppzeichen (CHARACTER TABULATION, U+0009), Zeilenumbruch (LINE FEED, U+000A), Wagenrücklauf (CARRIAGE RETURN, U+000D) und Leerzeichen (SPACE, U+0020). In s kann eine beliebige Anzahl von Leerraumzeichen enthalten sein, da diese ignoriert werden.

Das wertfreie Zeichen '=' wird für nachfolgende Füllzeichen verwendet. Das Ende von s kann aus keinem, einem oder zwei Füllzeichen bestehen.


Sprich, um genau zu sein, hast du nur die folgenden Zeichen zur Verfügung:

char[64]
{ 'A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z',
'0','1','2','3','4','5','6','7','8','9','+','/'};


Ich denke mal, du kommst nicht drum rum, die Unterstriche zu ersetzen. Dafür kannst du ja Leerraumzeichen oder Füllzeichen benutzen. Hier noch der Link zur MSDN-Hilfe:

Convert.FromBase64String-Methode (System)
10.11.2009
Dustin Klein 2,9k 2 9
2
Du kannst solche Sachen prima online verifizieren, z.B. hier.
Teste ich dort mit 'hallo' -> 'aGFsbG8=' -> ändern in 'aGF_sbG8=' -> 'hallo' so sagt mir das, dass die '_' in Deinen Eingangsdaten falsch sind, aber einfach rausgestrichen werden können.
Also:
string encoded = "aGF_sbG8=";
encoded = encoded.Replace("_",""); // besser: mit regex alle nicht erlaubten zeichen entfernen
string decoded = Convert.FromBase64String(encoded);
10.11.2009
DaSpors 4,2k 2 8

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH