ハッシュ関数 SHA-256 のGoによる実装

Go

ビットコインのしくみにも利用されていて,このところ話題になることの多いハッシュ関数SHA-256を、Goで実装してみました。

実行効率は考えずに、NISTの Secure Hash Standard のページ にある FIPS PUB 180-4 のファイル の記述に従って、わかりやすさを重視して作成しました。SHA-256のアルゴリズムを理解するのに役に立つと思います。

SHA-256のアルゴリズムは大きく分けて、以下の3つの段階に分かれます。

  1. 処理するメッセージ M の後ろに「1」のビットを1つ足して、その後ろに、メッセージの長さが (512の倍数 – 64) ビットになるまで「0」のビットを足す。
  2. その後ろに、元のメッセージ M の長さ(ビット数)の2進数表現を 64ビット足す。(このため、SHA-256で処理するメッセージの長さは 2の64乗未満でなければならない。)
  3. ハッシュ値を計算する。

実際のコードは以下の通りです。

この作成したパッケージの名前を「mysha256」とすると、以下のように使うことができます。

標準ライブラリに含まれるSHA-256の実装である「crypto/sha256」も、比較のために入れてあります。

実行効率を考えたSHA-256の実装については、Goに含まれる「crypto/sha256」のコードを参照してください。(Goの配置されたディレクトリ以下の「src/crypto/sha256」にある「sha256.go」と「sha256block.go」のファイルに含まれています。)

参考文献

  • 「プログラミング言語Go」 Alan A.A. Donovan (著),‎ Brian W. Kernighan (著),‎ 柴田 芳樹 (翻訳)