ブロックチェーン技術ブログ

ブロックチェーンと英語、数学に関するブログ

暗号学的ハッシュ関数 < SHA-2, SHA3 >

暗号学的ハッシュ関数は、任意のメッセージ(入力値)に対して、固定長の数値を生成します.
メッセージに識別子を付与することで、メッセージの認証等に利用されます.

例) SHA-1 を使用したハッシュ値

  1. 入力値が abc
    => a9993e364706816aba3e25717850c26c9cd0d89d

  2. 入力値が 01234567890123456789012345678901234567890123456789
    => 9578f951955d37f20b601c26591e260c1e5389bf

SHA1は、20バイト(数値40桁)のハッシュ値を生成します.
メッセージが3文字の場合と40文字の場合で、ハッシュ値の長さが同じになっていることがわかります.

暗号学的ハッシュ関数には、以下の性質が求められます.

  • 現像困難性
    ハッシュ値から現像(入力値のメッセージ)を求めることが困難である性質.

  • 第二現像困難性
    あるメッセージに対して、ハッシュ値が一致するメッセージを見つけることが困難である性質.

  • 衝突困難性
    ハッシュ値が一致するメッセージの組を見つけることが困難である性質.
    第二現像困難性との違いは、特定のメッセージに対してだけでなく、任意のメッセージに対して、ハッシュ値の一致が困難である必要があります.

SHA-2

SHA-2は、ハッシュ値の長さを224、256、384、512から選ぶことができます.

SHA256では、入力データを512ビットごとのブロックに分割して、全体が512ビットの倍数になるようにパディングします.
8個の32ビットの整数からなる内部状態を準備しておきます.

圧縮関数を利用して、先頭のブロックと内部状態を混ぜ合わせて、内部状態を更新します.
2番目以降のブロックに対して、更新された内部状態と混ぜ合わせる処理を順番に繰り返します.
最終的な内部状態をハッシュ値として出力します.

このハッシュの構成を MD(マークル・ダンガード)構造といいます.

SHA-3

SHA-2と同様、ハッシュ値の長さを224、256、384、512から選ぶことができます.

SHA-3-256では、入力データを1088ビットのブロックに分割します.
全体が1088の倍数になるように、余りのブロックにパディングします.
先頭のブロックから内部状態を生成し、その値に対して置換関数を適用し、内部状態を更新します.
2番目以降のブロックに対して、置換関数を適用し、内部状態を順に更新します.
最終的な内部状態の先頭256ビットを適用したものがハッシュ値となります.

大きな内部状態にブロックを取り込むことから、このハッシュの構成法はスポンジ構造といいます.

また、EthereumではSHA-3のオリジナルである Keccak が使用されています.