暗号学的ハッシュ関数 < SHA-2, SHA3 >
暗号学的ハッシュ関数は、任意のメッセージ(入力値)に対して、固定長の数値を生成します.
メッセージに識別子を付与することで、メッセージの認証等に利用されます.
入力値が
abc
=>a9993e364706816aba3e25717850c26c9cd0d89d
入力値が
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 が使用されています.