Heim > Artikel > Backend-Entwicklung > Von C# bis Go: AES- und Base64-Kodierungskompatibilität erreichen
Vor ein paar Wochen stand ich vor einem interessanten Problem: Ich musste einen AES-Verschlüsselungsalgorithmus von C# nach Go migrieren. In der Go-Implementierung hatten wir bereits einen AES-Verschlüsselungsalgorithmus, der jedoch nicht mit der C#-Implementierung kompatibel war, und mehrere Tests schlugen fehl, weil die Ergebnisse nicht übereinstimmten, hauptsächlich im letzten Zeichen.
Das Problem war, dass ich nicht den Quellcode der C#-Implementierung hatte, sondern nur die Binärdatei, eine DLL, die im .NET-Projekt verwendet wurde.
Ich habe versucht, den Quellcode der C#-Implementierung abzurufen, war aber erfolglos. Da es sich um ein altes Projekt handelte, war keine Dokumentation verfügbar. Glücklicherweise war mein Chef derjenige, der diese Implementierung entwickelt hat, aber ich konnte mich nicht an die genauen Details erinnern. Allerdings wusste ich, dass am Ende des AES-Verschlüsselungsprozesses eine Base64-Verschlüsselungsfunktion verwendet wurde.
Mit diesem Hinweis öffnete ich das Projekt in .NET und installierte die JetBrains-Erweiterung, um den Quellcode zu dekompilieren, und erhielt den Bibliothekscode, der zum Verschlüsseln der Informationen verwendet wurde.
Schließlich stellte ich fest, dass das Problem nicht beim AES-Verschlüsselungsalgorithmus lag, sondern bei der Base64-Kodierung.
Im C#-Code wurde am Ende des AES-Verschlüsselungsprozesses die folgende Funktion für die Base64-Codierung verwendet: HttpServerUtility.UrlTokenEncode.
Die UrlTokenEncode-Funktion ist eine .NET-Funktion, die ein Byte-Array in eine Base64-Textzeichenfolge zur Übertragung in einer URL codiert. Diese Funktion führt drei Schlüsselaktionen aus, die den Unterschied in den Ergebnissen erklären:
URL-sichere Base64-Kodierung: verwendet eine für URLs geeignete Variante von Base64 und ersetzt die Zeichen durch - und / durch _.
Padding Character Removal: Die Funktion entfernt Padding = Zeichen, die normalerweise in der Standard-Base64-Codierung verwendet werden.
Hinzufügen einer Zahl am Ende: Die Funktion fügt eine Zahl am Ende der Zeichenfolge hinzu, um anzugeben, wie viele Füllzeichen entfernt wurden.
Ich habe das alles dank ChatGPT entdeckt, nicht weil ich ein Base64-Experte bin. Mit diesen Informationen konnte ich die Implementierung in Go so ändern, dass sie mit der von C# kompatibel ist.
In Go erfolgt die Base64-Kodierung nach der Verschlüsselung der Informationen mit AES wie folgt:
encode := base64.RawURLEncoding.EncodeToString(paddedBytes)
Und schließlich wird die Anzahl der entfernten Füllzeichen am Ende der Zeichenfolge hinzugefügt:
// Calcular el número de caracteres de relleno (`=`) que se habrían añadido paddingCount := (4 - len(paddedBytes)%3) % 4 // Añadir el conteo de relleno al final de la cadena codificada (como hace UrlTokenEncode de C#) if paddingCount > 0 { encoded += strconv.Itoa(paddingCount) }
In der Zeile paddingCount := (4 - len(paddedBytes)%3) % 4 wird die Anzahl der Füllzeichen (=) berechnet und dann am Ende der Base64-codierten Zeichenfolge hinzugefügt:
Kurz gesagt, das Problem war nicht der AES-Verschlüsselungsalgorithmus, sondern die Base64-Kodierung. Dank der von ChatGPT erhaltenen Informationen konnte ich die Implementierung in Go so ändern, dass sie mit der von C# kompatibel ist. In diesem Fall war die Verwendung von ChatGPT sehr hilfreich, da es mir viel Zeit und Kopfschmerzen erspart hat; Natürlich musste ich jede Antwort anpassen, bis die Ergebnisse beider Implementierungen gleich waren.
Das obige ist der detaillierte Inhalt vonVon C# bis Go: AES- und Base64-Kodierungskompatibilität erreichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!