ハッシュ関数 SHA-2とSHA-3

ハッシュはあらゆるデータに対して、相違なる識別子を割り振る仕組み
認証や署名などに必須の要素技術

指紋認証などは、その特徴量は容易に複製されないことを前提としている

ハッシュ関数とは、任意のデータから、予め決められた範囲内の値を計算する関数
同じデータを入力すると常に同じ値が得られる
L 出力サイズが一定: SHA256は出力ハッシュ値はいつも256ビット。サイズの大きなデータはデータが欠損している
L 一方向性、衝突困難性: データが一致しているかを調べるにはハッシュ値の値が同一かを確認すれば良い

MD5, SHA-1は衝突する。SHA256, SHA3は今の所安全とされている
予めよく使われる単語を用意したり、パスワードとしてよく使われるパスワードはすぐにバレてしまう。携帯電話も同様。文字数が長くなると計算時間がかかる 8文字の場合は高性能GPUだと8時間で解明されてしまう

### SHA-2(256)とSHA-3
SHA-256が広く使われている
入力データを512ビットごとのブロックに分割する
あまりにデータの収量を示す1ビットの1を追加
0をあまりのサイズが448ビットになるように追加する
最後に64ビット整数の形式で追加して全体が512ビットの倍数になるように調整

paddingと書く

8個の32ビット整数からなる256ビットの内部状態Sを準備する
内部状態SとブロックBを入力して新しい内部状態Sを出力する圧縮関数fを準備する
内部状態Sを初期化IVで初期化し、各ブロックを入力して順次内部状態を更新する
SHA-256の方が高速に処理される

### SHA-3
マークルダンガード構造ではなくスポンジ構造を採用している。吸収フェーズと搾取フェーズがある