Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

SHA-256を学ぼうとする

690 views

Published on

SHA-256のアルゴリズムを読み解く上でのファーストステップ
SHAってなんやねん!って思ってる段階で見て貰うのがちょうど良いのかも。

5分間のLT資料

Published in: Technology
  • Be the first to comment

  • Be the first to like this

SHA-256を学ぼうとする

  1. 1. SHA-256 を学ぼうとする (Secure Hash Algorithm) uji52 2016/09/07
  2. 2. uji52 自己紹介 • uji52 • age: 27 • region: Hikone->Kyoto->Yokohama • My favorite • ハッシュ関数 • SHA-256 (他をほとんど知らない気がする) • 調味料 • わさび • 塩コショウ 2
  3. 3. SHA-256を紐解くぜ! 数学の勉強も好きやしおもろいかも 3
  4. 4. と思ったけど 思ったより難解やった… ので、概要のご説明的な内容です 4
  5. 5. SHAとは(1) • NIST(National Institute of Standard and Technology) • アメリカ国立標準技術研究所 • すっごいいろいろやってるところ • 物理学から化学から情報まで様々 • 暗号化技術等の選定、標準化等も • AES(Advanced Encryption Standard) • 暗号化方式 • SHA(Secure Hash Algorithm) • ハッシュアルゴリズム 5
  6. 6. SHAとは(2) 6 SHA登場(現在はSHA-0)とも呼ばれるFIPS 1801993年 SHA-1登場FIPS PUB 180-11995年 (案外昔からあるんやな〜) 2001年 変形verいくつか登場(SHA-224、SHA-256、SHA-384、SHA-512) 2012年 更にいくつかの変形ver登場SHA-512/224、SHA-512/256 合わせて SHA-2と 呼ばれるFIPS PUB 180-2 2012年 SHA-3のアルゴリズムが決定 2015年 SHA-3の正式版リリースFIPS PUB 202
  7. 7. 実際にハッシュ化しよう 7 $ irb irb(main):001:0> require 'digest/sha2' => true irb(main):002:0> Digest::SHA256.hexdigest "uji52" => “7730a0175eb494861993a5fdc899b393415f0def92ffd5130abee366dfa15348" irb(main):003:0> Digest::SHA256.hexdigest "uji53" => "0c47f8156e7b256efee86cc135451def80b4c544af16e24af81b2548009e37b8" irb(main):004:0> Digest::SHA256.hexdigest "" => "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ←Rubyをインタプリタで起動するで(するやで、は封印) ←SHA-2を使う宣言 ←”uji52”をSHA-256 ←”uji53”をSHA-256 ←空文字列をSHA-256 ほんの少しの変更でガラッと変わる 空文字でもしっかりハッシュ化してくれる
  8. 8. ハッシュしても危険やで 8 詳しい人なら 答えを知ってれば問題は分かる 0c47f8156e7b256e fee86cc135451def 80b4c544af16e24a f81b2548009e37b8 uji52を SHA-256した 値やな 問題 中央アメリカのパナマと 陸上で国境を接している 南アメリカの国はどこでしょう? 答え コロンビア ハッシュ化した値を 沢山知っていたら元の値も分かる ↑悪フザケ レインボーテーブルとか
  9. 9. ハッシュ化する上で大事なこと • ハッシュ化するときに工夫するで • salt (salt and pepper) • ハッシュ化する前に元の値に味付け(塩)して途中にも味付け(胡椒) • ストレッチング • 複数回ハッシュ化することで計算量を上げちゃおう • アルゴリズムは被らないことが大事 • 第一原像計算困難性 • 与えられるハッシュ値になる元値探し • 第一原像計算困難性 • 与えられる元値と同じハッシュ値になる元値探し • 衝突困難性 • ハッシュ値が同じになっちゃうペア探し 9 hが与えられて h=hash(m)になるm探し m1が与えられて hash(m1)=hash(m2)になるm2探し hash(m1)=hash(m2)になるペア探し
  10. 10. それでは SHA-256ハッシュ関数を 紐解いていきましょう 10
  11. 11. SHA-256の大まかな流れ 11 入力データ 分割入力データ[0] 分割入力データ[1] 分割入力データ[2] 64Byte毎に分割 64Byte ハッシュ値 分割入力データ[i]←計算 まだある? i == n ある ない 完成したハッシュ値 ←長さ足りひんかったら もちろんpadding 興味あったところ 256bit
  12. 12. SHA-256に使う値 12 分割入力データ[0]ハッシュ値 256bit 分割ハッシュ値[0] 分割ハッシュ値[1] 8分割 分割ハッシュ値[7] 32bit 分割入力データ[0][0] 分割入力データ[0][1] 分割入力データ[0][15] 4Byte 64Byte 16分割 4倍に増やす 分割入力データ[0][0] 分割入力データ[0][1] 分割入力データ[0][63]4倍に増やす部分 分割データ[0][n]をD(n)と呼ぶとすると D[16]〜D[63]を下記方法で作る D(n) = D(n - 2) + D(n - 7) + D(n - 15) + D(n - 16)
  13. 13. SHA-256でやってること 13 428a2f98 71374491 b5c0fbcf e9b5dba5 3956c25b 59f111f1 923f82a4 ab1c5ed5 d807aa98 12835b01 243185be 550c7dc3 72be5d74 80deb1fe 9bdc06a7 c19bf174 e49b69c1 efbe4786 0fc19dc6 240ca1cc 2de92c6f 4a7484aa 5cb0a9dc 76f988da 983e5152 a831c66d b00327c8 bf597fc7 c6e00bf3 d5a79147 06ca6351 14292967 27b70a85 2e1b2138 4d2c6dfc 53380d13 650a7354 766a0abb 81c2c92e 92722c85 a2bfe8a1 a81a664b c24b8b70 c76c51a3 d192e819 d6990624 f40e3585 106aa070 19a4c116 1e376c08 2748774c 34b0bcb5 391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3 748f82ee 78a5636f 84c87814 8cc70208 90befffa a4506ceb bef9a3f7 c67178f2 32bitのハッシュ値 x 8 入力値を元に生成された4Byteの値 x 64 定数k 8桁の16進数 x 64 これらの値をビットシフトとXORして ハッシュ値を作ってるみたいです。 時間の都合上この辺りで割愛 (諦め) ←これの4つめと8つめをハッシュしてローテーションしていく(それを64回) ↑←この2つがハッシュするためのXOR素材
  14. 14. まとめ • 思ったより奥が深い • 全体に何らかのビット演算って話かと… • パディング処理も凝ってる… • 分割処理も凝ってる… (ハッシュアルゴリズムを簡単に考えすぎてた) 14

×