なんとなくわかる「SHA-256」

スポンサーリンク

SHA-256(Secure Hash Algorithm 256-bit)とは

SHA-256(Secure Hash Algorithm 256-bit)とは、暗号化の際に行うハッシュ関数の生成方式であり、SHA2と呼ばれる堅牢なハッシュ値を作り出すアルゴリズムのうちの一つです。ハッシュ値の長さが256であることからSHA-256と名付けられています。

SHA-256はNIST(米国国立標準技術研究所)の「FIPS180-4」でほかのハッシュ関数とともに定義されています。

ハッシュ関数というのは相手にメッセージを送った時にそのメッセージが改ざんされていないことを確かめる場合などに使われます

あるメッセージが存在するときにハッシュ関数を用いてハッシュ値にしてメッセージとは別に送ることで相手がそのメッセージとハッシュ値を受け取ってメッセージに同じハッシュ関数を使うことで送られてきたハッシュ値と同じになれば改ざんされていないことが確認できます。

ほかにもチャレンジハンドシェイク認証、デジタル署名などにも利用されており、鍵交換方式のAESでの鍵の検証にも使われます。

SHA-256は暗号の安全性や可用性を評価するCRYPTRECでも電子政府推奨暗号リストに入っており、現時点で安全性が認められている。そのためブロックチェーン技術など様々な分野にSHA-256のハッシュ関数が使われています。

例としては、ビットコインで使われるハッシュ関数はSHA-256とRIPEMD-160の二つが利用されています

SHA-256 (Secure Hash Algorithm 256-bit) の特徴

ハッシュ長と速度

SHA-256は256とつけられている通り、256ビットの長さ固定のハッシュ値を出力します。ハッシュできる元の文章の長さは2の64乗-1ビットまでを処理することができます。

ハッシュ値を求めるまでの速度は、低から中程度のCorei5 PCでChromeを使用すると、タイミングテストで、 このスクリプトは約0.03〜0.06ミリ秒で短いメッセージをハッシュし、より長いメッセージは、約2〜3MB /秒の速度でハッシュされます。

ハッシュ値を出すまでの流れ

前処理(メッセージを整えて分割する)

ハッシュ化を行う前にメッセージを512ビットの倍数になるように整えます。整え方は

メッセージ(2進数)+1+任意の数の0+1 = 512ビットの倍数の長さ

のようにして 1+任意の数の0+1 (この部分をパディングとする)で調節をし、これで作られたものをMとする。

このMを512ビットずつで割り切ってできたブロックの数をNとすると

M = M1 + M2 + … +MN

という風にMを表すことができます。M1からMNのブロックはそれぞれ512ビットの長さであることから、1つのワードを32ビットとして1ブロック16ワードに分ける。

M1 = M1(1) + M1(2) + … + M1(16) MN = MN(1) + MN(2) + … + MN(16)

ハッシュの初期値として、H[0] = 6A09E667、H[1] = BB67AE85、H[2] = 3C6EF372、H[3] = A54FF53A、H[4] = 510E527F、H[5] = 9B05688C、H[6] = 1F83D9AB、H[7] = 5BE0CD19の配列を用意する。

メッセージ拡張

1つ1つのワードの長さを32ビットから64ビットに拡張します。拡張の仕方は16ビットまでは元のブロックのままでそれ以降は16ビットまでの数値から算出します。これにより、1つのブロックに含まれる16個のワードの長さがすべて64ビットに拡張されます。

圧縮

拡張したワードを使ってハッシュ値を算出する。まず、計算用の変数としてaからhの変数を用意して初期値として

a0 = H[0] b0 =H[1] c0 = H[1] d0 = H[2] e0 = H[3] f0 = H[4] g0 = H[5] h0 = H[6]

を代入する。

a0かh0の変数を用いて計算を行ってa1からh1を生成する。この計算をN回繰り返して生成したaNからhNを使って

H[0] = H[N-1]+aN H[1] = H[N-1]+bN … H[7] = H[N-1]+hN (H[0]~H[7]はそれぞれ32ビット)

でHの配列を求め、配列を連結することで256ビットのハッシュ値を求めることができる。

コメント

タイトルとURLをコピーしました