wiz.code

SHA-256のアルゴリズム

メッセージブロック

前ページでは「入力データから一定のハッシュ値を生成する」という書き方をしました。 厳密に言うとこの表現は正しくありません。 SHAのアルゴリズムでは、初期のハッシュ値が決まっており、この初期ハッシュを変化させるために使われる情報が入力データです。 SHA-256の場合、入力データは64Byteごとに分割されます。 分割されたデータは「メッセージブロック」と名づけられています。 入力データの量が64Byteを超える場合は、複数のメッセージブロックが形成されることになります。

メッセージブロック

次に、初期ハッシュを最初のメッセージブロックを使って変化させ、新しいハッシュ値を算出します。 さらに、そのハッシュ値を次のメッセージブロックで変化させて新しいハッシュ値を得、さらに次のメッセージブロックで…という具合に処理されていきます。 そして、最後のメッセージブロックで算出されたハッシュ値が最終結果になります。

ハッシュ値とメッセージブロック

このように64Byteに分割した入力データを使ってハッシュ値を変化させていくことで、入力データ量に関係なく同じビット長の値が得られるようになっているのです。 このメッセージブロックを使った処理を「ハッシュ計算処理」と呼称することにします。 (「圧縮関数」と呼んでいる文書もありますが、FIPSの表題には「Hash Computation」と書かれているので…)

ハッシュ計算処理が具体的にどのようなことをしているのかは後ほど解説します。

さて、入力データがきれいに64Byteで切り分けられれば良いですが、おそらくそうでない場合がほとんどでしょう。 そこで、64Byteで割り切れない場合に帳尻を合わせるのが「パディング処理」です。