数週間前、私は興味深い問題に直面しました。AES 暗号化アルゴリズムを C# から Go に移行する必要がありました。 Go 実装にはすでに AES 暗号化アルゴリズムがありましたが、C# 実装と互換性がなく、主に最後の文字で結果が一致しなかったため、いくつかのテストが失敗しました。
問題は、C# 実装のソース コードがなく、.NET プロジェクトで使用されるバイナリ、DLL しか持っていなかったことです。
C# 実装のソース コードを取得しようとしましたが、失敗しました。古いプロジェクトであるため、利用可能なドキュメントがありませんでした。幸いなことに、この実装を開発したのは私の上司でしたが、正確な詳細は覚えていませんでした。ただし、AES 暗号化プロセスの最後に、base64 エンコード関数が使用されていることは知っていました。
この手がかりをもとに、.NET でプロジェクトを開き、JetBrains 拡張機能をインストールしてソース コードを逆コンパイルし、情報の暗号化に使用されたライブラリ コードを取得しました。
最終的に、問題は AES 暗号化アルゴリズムではなく、base64 エンコーディングにあることがわかりました。
C# コードでは、AES 暗号化プロセスの最後に、base64 エンコードに次の関数が使用されました: HttpServerUtility.UrlTokenEncode.
UrlTokenEncode 関数は、URL で送信するためにバイト配列を Base64 テキスト文字列にエンコードする .NET 関数です。この関数は、結果の違いを説明する 3 つの主要なアクションを実行します。
URL セーフな Base64 エンコード: URL に適した Base64 のバリアントを使用し、文字を - と / を _ に置き換えます。
パディング文字の削除: この関数は、標準の Base64 エンコーディングで通常使用されるパディング = 文字を削除します。
末尾に数値を追加する: この関数は、削除されたパディング文字の数を示すために、文字列の末尾に数値を追加します。
私がこれらすべてを発見したのは、私が Base64 の専門家だからではなく、ChatGPT のおかげです。この情報を使用して、Go の実装を C# の実装と互換性があるように変更することができました。
Go では、AES で情報を暗号化した後、次のように Base64 エンコードが行われます。
encode := base64.RawURLEncoding.EncodeToString(paddedBytes)
そして最後に、削除されたパディング文字の数が文字列の末尾に追加されます。
// 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) }
paddingCount := (4 - len(paddedBytes)%3) % 4 の行では、パディング文字 (=) の数が計算され、base64 でエンコードされた文字列の末尾に追加されます。
要するに、問題は AES 暗号化アルゴリズムではなく、base64 エンコーディングにありました。 ChatGPT から得た情報のおかげで、Go の実装を C# の実装と互換性があるように変更することができました。この場合、ChatGPT を使用すると、多くの時間と頭痛の種を節約でき、非常に役立ちました。もちろん、両方の実装の結果が等しくなるまで、それぞれの答えを調整する必要がありました。
以上がC# から Go へ: AES と Base64 エンコーディングの互換性の実現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。