ホームページ  >  記事  >  バックエンド開発  >  C# から Go へ: AES と Base64 エンコーディングの互換性の実現

C# から Go へ: AES と Base64 エンコーディングの互換性の実現

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-06 15:17:02777ブラウズ

De C# a Go: Logrando Compatibilidad en Codificación AES y Base64

数週間前、私は興味深い問題に直面しました。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 つの主要なアクションを実行します。

  1. URL セーフな Base64 エンコード: URL に適した Base64 のバリアントを使用し、文字を - と / を _ に置き換えます。

  2. パディング文字の削除: この関数は、標準の Base64 エンコーディングで通常使用されるパディング = 文字を削除します。

  3. 末尾に数値を追加する: この関数は、削除されたパディング文字の数を示すために、文字列の末尾に数値を追加します。

私がこれらすべてを発見したのは、私が 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 でエンコードされた文字列の末尾に追加されます。

  • len(paddedBytes)%3 は、base64 でエンコードされていないバイト数を計算します。
  • (4 - len(paddedBytes)%3) % 4 は、長さが 4 で割り切れるように不足しているパディング文字の数を計算します。パディングが必要ない場合、結果は 0 になります。

要するに、問題は AES 暗号化アルゴリズムではなく、base64 エンコーディングにありました。 ChatGPT から得た情報のおかげで、Go の実装を C# の実装と互換性があるように変更することができました。この場合、ChatGPT を使用すると、多くの時間と頭痛の種を節約でき、非常に役立ちました。もちろん、両方の実装の結果が等しくなるまで、それぞれの答えを調整する必要がありました。

以上がC# から Go へ: AES と Base64 エンコーディングの互換性の実現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。