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.

“Sliding right into disaster”の紹介

1,248 views

Published on

ラボ勉強会資料

Published in: Technology
  • Be the first to comment

“Sliding right into disaster”の紹介

  1. 1. “Sliding right into disaster”の紹介 2017/7/28 光成滋生
  2. 2. • Sliding right into disaster: Left-to-right sliding windows leak(DJB, etc.)をざっくりと読む • https://eprint.iacr.org/2017/627 • 概要 • 巾剰余(𝑥 𝑦 mod 𝑛)のスライドウィンドウ法(SW)による実 装は定数時間でない(ものが多い) • GnuPGで使われるLibgcryptはLtoR SWを利用 • サイドチャネル攻撃で平方・乗算のパターンが完全に分かっ てもRSA暗号を解読するには不十分と信じられてきた • この論文はLibgcryptの1024ビットRSA暗号をサイドチャネル 攻撃を用いて破った(RSA暗号自体を破ったのではない) • Right-to-Left SWはLeft-to-Right SWよりも多くのビット情報 を漏洩することを示した 内容 2 / 15
  3. 3. • Daniel J. Bernstein • 数学者 • 暗号学者 • ソフトウェア開発者 • qmail • djbdns • ChaCha20 + Poly1305 • Ed25519 djb 3 / 15
  4. 4. RSA暗号 • 公開鍵暗号 • 異なる二つの素数𝑝, 𝑞を用意して𝑛 = 𝑝𝑞とする • 𝑒𝑑 ≡ 1 mod (𝑝 − 1)(𝑞 − 1)となる整数𝑒, 𝑑を選ぶ • つまりある整数𝑏があって𝑒𝑑 = 𝑏 𝑝 − 1 𝑞 − 1 + 1 • 公開鍵 : 𝑃 𝐾= (𝑛, 𝑒) • 秘密鍵 : 𝑆 𝐾 = 𝑑 • 暗号化 : 平文𝑚に対して𝐸𝑛𝑐 𝑚 = 𝑚 𝑒 mod 𝑛 • 復号 : 暗号文𝑐に対して𝐷𝑒𝑐 𝑐 = 𝑐 𝑑 mod 𝑛 • 暗号化も復号もpow 𝑥, 𝑦, 𝑛 ≔ 𝑥 𝑦 mod 𝑛の計算 • 巾剰余(modular exponentiation)という 4 / 15
  5. 5. • 1回ずつ掛けていたら日が暮れる(宇宙が終わる) • バイナリ法 • 𝑦を2進数展開してビットが立っているところだけ掛ける • 例 : 𝑦 = 57 = 0𝑏111001=1+8+16+32 • 𝑥57 = 𝑥 ⋅ 𝑥8 ⋅ 𝑥16 ⋅ 𝑥32 mod(𝑥, 𝑦, 𝑛)の計算方法 z = 1; for i in range(y): z = (z * x) % n z = 1 for i in reversed(bin(y)[2:]): // [100111] if y = 57 if i == '1': z = (z * x) % n # これはビットが立っているときだけ実行する x = (x * x) % n # これは常に実行する 5 / 15
  6. 6. • ビットを一定幅𝑤ビットで区切ってそこの値をあらか じめ計算しておく • 例:𝑤 = 3のときまず𝑥, 𝑥2, … , 𝑥2 𝑤−1のテーブルを作る • 𝑦 = 235 = 0𝑏11101011 = 11 101|011|と𝑤桁ずつ区切り • テーブル引きしながら掛ける • 平方算の回数は変わらないが乗算回数は1/wになる ウィンドウ法 6 / 15
  7. 7. • ビットを分割するときに • 上位ビットから計算するのをR-to-L • 下位ビットから計算するのをL-to-Rという • L-to-Rは計算バッファが必要 • R-to-Lは作りながら(on-the-fly)できる • 𝑦 = 235 = 0𝑏11101011 = 111 010 11 , 𝑤 = 3, tbl[i] = x^i R-to-LとL-to-R z = z * tbl[7] z = (z * z) % n z = (z * z) % n z = (z * z) % n z = z * tbl[2] z = (z * z) % n z = (z * z) % n z = z * tbl[3] 7 / 15
  8. 8. • R-to-Lの計算を見直す • 𝑧2 𝑧2𝑏 = 𝑧1+𝑏 2 だから = • 𝑏が奇数になるまで順序を入れ換えると テーブルは奇数だけでよい • テーブルサイズが半分になる • 今回はこの情報を攻撃に使った テーブルは奇数のところだけ作ればよい z = z * tbl[7] z = (z * z) % n z = (z * z) % n z = (z * z) % n # z^2 z = z * tbl[2] # z^(2b) ; 偶数を2bで表す z = (z * z) % n z = (z * z) % n z = z * tbl[3] z = (z * z) % n z = z * tbl[2b] z = z * tbl[b] z = (z * z) % n 8 / 15
  9. 9. • 対象計算機を外側から観察することで 計算機内部の情報を取得する攻撃 • ICカードには秘密鍵が入ってる • 電力、電磁波、ノイズなどを計測して推測 • メモリを瞬間冷凍して残存するビットパターンを推測 • VM上の別の環境を覗こうとする サイドチャネル攻撃 9 / 15
  10. 10. • http://cs.adelaide.edu.au/~yval/Mastik/Mastik.pdf • clflush • 指定したメモリのキャッシュラインを破棄する • ターゲットと別のプロセスが共有メモリを攻撃 • そこまでできるならなんでもありではという気もしなく(略 • 攻撃者がclflushして少し待ってメモリをload • すぐ読めればターゲットがそのメモリにアクセスしたと判明 • 実際には処理がすぐ終わってしまうので amplification attackを併用 • https://eprint.iacr.org/2015/1141 • メモリ負荷をかけてターゲットを100倍ぐらい遅くする? • 細かいノウハウが他にもいろいろ Flush + Reload(FR)攻撃 10 / 15
  11. 11. • ループの中では • (m)データがあるときだけz = (z * x) % n • (s)いつもz = (z * z) % n • サイドチャネル攻撃によりこのビットパターンを検出 • S=smsssssssmsmsssssm • →𝐷1 = 𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥 • 𝑥はビット不明, アンダーバーはそこに乗算がある • これからRSA暗号の鍵𝑑を復元する • 今までは無理だろうと思われていたが • 今回ビットパターンの調べるべき数を減らして 実際に攻撃できることを示した 巾剰余算に戻る 11 / 15
  12. 12. • R0: 𝑥 → 1 ; 乗算したときは必ず奇数 • R1: 1𝑥 𝑖1𝑥 𝑤−𝑖−1 → 1𝑥 𝑖10 𝑤−𝑖−1 for 𝑖 = 0, … , 𝑤 − 2 • R2: 𝑥𝑥𝑥11 → 1𝑥𝑥11 ; 1が連続すれば左のw番目は1 • R3: 1𝑥 𝑖 𝑥 𝑤−11 → 10𝑖 𝑥 𝑤−11 for 𝑖 > 0 • 𝐷1 = 𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥 • 𝐷2 = 1𝑥𝑥𝑥𝑥𝑥𝑥11𝑥𝑥𝑥𝑥1 • 𝐷3 = 1𝑥𝑥𝑥𝑥𝑥𝑥11000𝑥1 ; mの位置の差< 𝑤ならその隙間は0 • 𝐷4 = 1𝑥𝑥𝑥1𝑥𝑥11000𝑥1 • 𝐷5 = 10001𝑥𝑥11000𝑥1 ; w以上離れていたら0 • このあとルールによる復元可能な候補の解析 • 肝心なところだが略 ビットパターンの決定ルール 12 / 15
  13. 13. • 異なる素数𝑝, 𝑞に対して𝑥 ≡ 𝑎 mod 𝑝, 𝑥 ≡ 𝑏 mod 𝑞を満 たす0 ≤ 𝑥 < 𝑝𝑞となる𝑥がただ一つ存在する • 求め方)𝑝, 𝑞が異なるので1 = 𝑠𝑝 + 𝑡𝑞となる𝑠, 𝑡が存在する • 𝑎 − 𝑏倍すると𝑎 − 𝑏 = 𝑎 − 𝑏 𝑠𝑝 + 𝑎 − 𝑏 𝑡𝑞より 𝑥 ≔ 𝑎 − 𝑎 − 𝑏 𝑠𝑝 = 𝑏 + 𝑎 − 𝑏 𝑡𝑞は条件を満たす CRT(Chinese Remainder Theorem) 13 / 15
  14. 14. • 巾剰余に使う • 𝑥 𝑦 mod 𝑝𝑞は𝑎 = 𝑥 𝑦 mod 𝑝, 𝑏 = 𝑥 𝑦 mod 𝑞から復元できる • 𝑛ビットの巾乗算1回より𝑛/2ビットの巾乗算2回の方が速い • Libgcryptはこれを使っている • いくつかの数値の関係式 • 𝑛 = 𝑝𝑞, 𝑒𝑑 ≡ 1 mod 𝑝𝑞, 𝑒が公開鍵で𝑑が秘密鍵 • 秘密鍵𝑑に対して𝑑 𝑝 ≔ 𝑑 mod 𝑝 − 1, 𝑑 𝑞 ≔ 𝑑 mod 𝑞 − 1 • 𝑒𝑑 𝑝 = 1 + 𝑘 𝑝 𝑝 − 1 , 𝑒𝑑 𝑞 = 1 + 𝑘 𝑞 𝑞 − 1 となる 𝑘 𝑝, 𝑘 𝑞 < 𝑒がある • 𝑘 𝑝 − 1 𝑘 𝑞 − 1 ≡ 𝑘 𝑝 𝑘 𝑞 𝑛 mod 𝑒 • 𝑒は通常65537が使われる • 𝑘 𝑝, 𝑘 𝑞は高々𝑒通り(これにより探索候補を少なくできる) CRTによる剰余算の高速化 14 / 15
  15. 15. • 𝑛 = 512, 𝑤 = 4のとき • 100万個の実験で251ビット(49%)が判明した • 𝑛 = 1024, 𝑤 = 5のときは41% 復号できるビット 15 / 15

×