Más contenido relacionado Similar a CRYPT+YOU, UNDERSTAND TODAY! (20) CRYPT+YOU, UNDERSTAND TODAY!2. ABOUT ME
• @inaz2
• Security Engineer & Python Programmer
• Girls Idol Freak
• ブログ「ももいろテクノロジー」
• http://inaz2.hatenablog.com/
2
5. SOMETIMES CRYPT LOOKS LIKE
A BLACKBOX
• 数学むずかしい
• ガロア体、オイラーのφ関数、中国の剰余定理、楕円曲線
• 略語が多すぎてどれが何だかわからない
• TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA???
• なんか危ないらしい
• BEAST、CRIME/BLEACH、WEP crack、MS-CHAPv2 crack
• 使いにくいコマンド
• gpg -c --cipher-algo AES256 -o output input
• openssl aes-256-cbc -e -salt -in input -out output
• X.509とか802.11Xとかのキーワードが混ざる
• ASN.1、PEM、DER、CSR、CRL、PEAP、EAP-TLS、RADIUS
5
6. IS IT REALLY DIFFICULT?
• 暗号という概念に限っていえば、それほど難しくない
• 全部忘れよう
• 数学的厳密性
• X.509とか802.11Xとか
• OpenSSL
• 暗号にまつわる雑多な話をします
6
14. RC4 (RIVEST CIPHER 4)
• 共通鍵暗号方式のうち、ストリーム暗号と呼ばれるもののひとつ
• ざっくり言うと
• 鍵から特定のアルゴリズムに従って疑似乱数列(キーストリーム)を作る
• 鍵の長さは40~2048 bits、128 bitsであることが多い
• 暗号化: 1バイトずつXORする
• 復号: 1バイトずつXORする
• 高速で計算が楽。パディング詰めて長さを調節する必要もない
14
16. AES (ADVANCED ENCRYPTION STANDARD)
• 共通鍵暗号方式のうち、ブロック暗号と呼ばれるもののひとつ
• 入力は 128 bit 固定
• 鍵の長さは128, 192, 256 bitのうちどれか
• ざっくり言うと(鍵長が128 bitの場合)
• 鍵から乱数ブロックを10個作る
• 平文を乱数ブロックも使いつつ10回かきまぜる
• いい感じにぐちゃぐちゃになる
16
17. 暗号利用モード
• 128 bitsじゃない平文のときはどうするか?
• 128 bitsのブロックをたくさん作る。足りない部分はパディングで埋める
• これらのブロックをどうするかの方法を暗号利用モードという
• ECB mode (Electronic Codebook)
• 各ブロック個別にAESをかける
• 同じ内容のブロックが同じ暗号文に変換されてしまうため、使うべきでは
ない
17
20. CBC MODE (CIPHER-BLOCK CHAINING)
• 一つ前の暗号文を事前にXORで混ぜる
• 最初のブロックについてはランダムな初期化ベクトル (IV) を混ぜる
20
http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation
21. RSA (RIVEST, SHAMIR, ADLEMAN)
• 公開鍵暗号方式のひとつ
• 知られてもよい鍵(公開鍵)とダメな鍵(秘密鍵)のペアを使う
• ざっくり言うと
• 公開鍵と秘密鍵のペアを作る、鍵は実際にはただの大きな整数
• 暗号化: 公開鍵で平文を累乗する
• 復号: 秘密鍵で暗号文を累乗する
• 暗号化は誰でもできるが、復号できるのは秘密鍵を持つ人だけ
21
22. もう少し詳しく
• 素数 p, q を作る
• n = p*q, e = 0x10001 として、p, q, e から d を計算する
• nのbit数がRSAの鍵長として扱われる
• 公開鍵 = (n, e)、秘密鍵 = d
• 暗号化: ciphertext = message ^ e (mod n)
• 復号: message = ciphertext ^ d (mod n)
22
23. 素因数分解
• n を p, q に素因数分解できれば、秘密鍵 d が作れる
• しかし素因数分解を多項式時間で行うアルゴリズムは知られていない
• 高速素因数分解プログラム Msieve で実際にやってみる
• 256 bits なら 198 sec だった
• 1 bit 増えるごとに2倍かかると仮定したとき、768 bits では…
23
$ openssl genrsa 256 | openssl rsa -modulus
Modulus=B199E7214196FDD9104B35361221402F8B53EEB53D0846C3B9839B0180DAC90D
$ ./msieve -e -v 0xB199E7214196FDD9104B35361221402F8B53EEB53D0846C3B9839B0180DAC90D
factoring 80331297000141005477922190329275678672338023057316268735808908674607892580621
(77 digits)
prp39 factor: 258928947932279960107043988464217168239
prp39 factor: 310244557982565855560785171400435068739
elapsed time 00:03:18
24. • n を p, q に素因数分解できれば、秘密鍵 d が作れる
• しかし素因数分解を多項式時間で行うアルゴリズムは知られていない
• 高速素因数分解プログラム Msieve で実際にやってみる
• 256 bits なら 198 sec だった
• 1 bit 増えるごとに2倍かかると仮定したとき、768 bits では…
素因数分解
24
$ openssl genrsa 256 | openssl rsa -modulus
Modulus=B199E7214196FDD9104B35361221402F8B53EEB53D0846C3B9839B0180DAC90D
$ ./msieve -e -v 0xB199E7214196FDD9104B35361221402F8B53EEB53D0846C3B9839B0180DAC90D
factoring 80331297000141005477922190329275678672338023057316268735808908674607892580621
(77 digits)
prp39 factor: 258928947932279960107043988464217168239
prp39 factor: 310244557982565855560785171400435068739
elapsed time 00:03:18
25. • n を p, q に素因数分解できれば、秘密鍵 d が作れる
• しかし素因数分解を多項式時間で行うアルゴリズムは知られていない
• 高速素因数分解プログラム Msieve で実際にやってみる
• 256 bits なら 198 sec だった
• 1 bit 増えるごとに2倍かかると仮定したとき、768 bits では…
素因数分解
25
$ openssl genrsa 256 | openssl rsa -modulus
Modulus=B199E7214196FDD9104B35361221402F8B53EEB53D0846C3B9839B0180DAC90D
$ ./msieve -e -v 0xB199E7214196FDD9104B35361221402F8B53EEB53D0846C3B9839B0180DAC90D
factoring 80331297000141005477922190329275678672338023057316268735808908674607892580621
(77 digits)
prp39 factor: 258928947932279960107043988464217168239
prp39 factor: 310244557982565855560785171400435068739
elapsed time 00:03:18
スパコンを使って本気を出した結果、
半年で解けたと発表(2010年)
27. BIG BROTHER MIGHT BE
WATCHING YOU?
• RSAで鍵共有を行い、AESでデータを暗号化して送っていたとする
• もし誰かが過去の通信データを全部保存していたら?
• そのままでは暗号化されているので、当然読めない
• もしその誰かにRSA秘密鍵を盗まれたら?
• 鍵共有で交換していた共通鍵が全部ばれる
• 過去の通信データが全部復号される
27
28. DH (DIFFEE-HELLMAN KEY EXCHANGE)
• 正確には暗号ではなく、鍵共有プロトコルと呼ばれるもののひとつ
• ざっくりいうと
• 素数 p とちょうどいい整数 g を互いに交換する
• 適当な数 a を作って、A = g^a mod p を相手に送る
• 同様に、B = g^b mod p を相手からもらう(b 自体はもらわない)
• B^a mod p = g^(a*b) mod p を計算する
• 相手が計算した A^b mod p も同じ値になる ⇒ 共通鍵として使える
• p, g, A, B しか第三者からは見えない
• A = g^a mod p から a が逆算されない限り、共通鍵 B^a mod p はわからない
28
29. PERFECT FORWARD SECRECY
• A = g^a mod p から a を逆算することは、離散対数問題と呼ばれる
• 多項式時間で解けるアルゴリズムが見つかっていない
• 通信のセッションごとに違う共通鍵を作って暗号化
• ある時点での a が盗まれたとしても過去の共通鍵はわからない
• 誰かが過去の通信を全部保存してても安心
• セッションごとに鍵を変える場合をとくに DHE (Ephemeral) と呼ぶ
29
32. REFERENCES (1/2)
• 本の虫: GNU/Linuxでお手軽に使えるCLIのファイル暗号化ツール
• http://cpplover.blogspot.jp/2013/07/gnulinuxcli.html
• On the Security of RC4 in TLS
• http://www.isg.rhul.ac.uk/tls/
• Anatomy of a password disaster – Adobe’s giant-sized cryptographic blunder
• http://nakedsecurity.sophos.com/2013/11/04/anatomy-of-a-password-disaster-adobes-
giant-sized-cryptographic-blunder/
• Msieve
• http://www.boo.net/~jasonp/qs.html
• Factorization of a 768-bit RSA modulus [Kleinjung et. al., 2010]
• http://eprint.iacr.org/2010/006
32
33. REFERENCES (2/2)
• 自堕落な技術者の日記 : TwitterのPerfect Forward Secrecy(PFS)対応
• http://blog.livedoor.jp/k_urushima/archives/1728348.html
• OpenSSLとPythonでRSA暗号の原理を知る - ももいろテクノロジー
• http://inaz2.hatenablog.com/entry/2013/11/27/225953
• Pythonでストリーム暗号RC4を実装し、脆弱性の一端を垣間見る - ももいろテクノロ
ジー
• http://inaz2.hatenablog.com/entry/2013/11/30/233649
33