crypt+you, understand today!
DESCRIPTION
2014/06/07 Security Casual Talks 2014#2TRANSCRIPT
CRYPT+YOU, UNDERSTAND
TODAY!@inaz2
Security Casual Talks 2014#2
2014/06/07
ABOUT ME
• @inaz2
• Security Engineer & Python Programmer
• Girls Idol Freak
• ブログ「ももいろテクノロジー」
• http://inaz2.hatenablog.com/
2
導入
3
COMPUTER SECURITY AND CRYPTOGRAPHY
• 暗号大事
• 理論いろいろ
• 共通鍵暗号、公開鍵暗号、暗号学的ハッシュ関数、メッセージ認証コード
• 応用いろいろ
• 通信の暗号化、通信相手の認証、改ざん検知、鍵共有
4
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
IS IT REALLY DIFFICULT?
• 暗号という概念に限っていえば、それほど難しくない
• 全部忘れよう
• 数学的厳密性
• X.509とか802.11Xとか
• OpenSSL
• 暗号にまつわる雑多な話をします
6
本題
7
換字式暗号
• 古典暗号と呼ばれるもののひとつ
• 文字単位、あるいはブロック単位で置き換える
• 2014/05/05: NSA採用担当 (@NSACareers) さんが何か言った
• https://twitter.com/NSACareers/statuses/463321993878994945
8
XORスクランブルの復元
• 某PCゲームのスクリプトデータと思われるファイル
• f2 f5がやたらと多い、しかもちょうどいい間隔で出てくる
10
XORスクランブルの復元
• 某PCゲームのスクリプトデータと思われるファイル
• f2 f5がやたらと多い、しかもちょうどいい間隔で出てくる
11
0d 0a (CR LF) で当たりをつけてみると、0xff でXORされているような気がする
XORスクランブルの復元
• 某PCゲームのスクリプトデータと思われるファイル
• f2 f5がやたらと多い、しかもちょうどいい間隔で出てくる
12
0d 0a (CR LF) で当たりをつけてみると、0xff でXORされているような気がする
XORスクランブルの復元
• 某PCゲームのスクリプトデータと思われるファイル
• f2 f5がやたらと多い、しかもちょうどいい間隔で出てくる
13
0d 0a (CR LF) で当たりをつけてみると、0xff でXORされているような気がする
RC4 (RIVEST CIPHER 4)
• 共通鍵暗号方式のうち、ストリーム暗号と呼ばれるもののひとつ
• ざっくり言うと
• 鍵から特定のアルゴリズムに従って疑似乱数列(キーストリーム)を作る
• 鍵の長さは40~2048 bits、128 bitsであることが多い
• 暗号化: 1バイトずつXORする
• 復号: 1バイトずつXORする
• 高速で計算が楽。パディング詰めて長さを調節する必要もない
14
RC4のバイアス問題
• 出てくる疑似乱数列があまりよろしくない
• 2バイト目が0になる確率は他の値の2倍 [Mantin and Shamir 2001]
• 100回同じ平文を暗号化して、2バイト目について出現頻度が最も高い文
字を選ぶとそれが当たりだったりする
• 2バイト目以降にも偏りがある、ただし後ろにいけばいくほど減る
• 2013年に研究者が危険性を指摘する発表を行ったり、Microsoftが
使うなって言ったり、CRYPTRECが128-bit RC4を推奨暗号リストか
ら外したりしている
15
AES (ADVANCED ENCRYPTION STANDARD)
• 共通鍵暗号方式のうち、ブロック暗号と呼ばれるもののひとつ
• 入力は 128 bit固定
• 鍵の長さは128, 192, 256 bitのうちどれか
• ざっくり言うと(鍵長が128 bitの場合)
• 鍵から乱数ブロックを10個作る
• 平文を乱数ブロックも使いつつ10回かきまぜる
• いい感じにぐちゃぐちゃになる
16
暗号利用モード
• 128 bitsじゃない平文のときはどうするか?
• 128 bitsのブロックをたくさん作る。足りない部分はパディングで埋める
• これらのブロックをどうするかの方法を暗号利用モードという
• ECB mode (Electronic Codebook)
• 各ブロック個別にAESをかける
• 同じ内容のブロックが同じ暗号文に変換されてしまうため、使うべきでは
ない
17
• 2013/10/03: Adobeが不正アクセスにより290万人分の顧客情報が
流出したことを公表
• パスワードは暗号化して保存されていたが、ECB mode だった
• パスワードヒントを集めることで、平文が推測できてしまった
ADOBE PASSWORD BREACH
18
• 2013/10/03、Adobeが不正アクセスにより290万人分の顧客情報が
流出したことを公表
• パスワードは暗号化して保存されていたが、ECB mode だった
• パスワードヒントを集めることで、平文が推測できてしまった
ADOBE PASSWORD BREACH
19
CBC MODE (CIPHER-BLOCK CHAINING)
• 一つ前の暗号文を事前にXORで混ぜる
• 最初のブロックについてはランダムな初期化ベクトル (IV) を混ぜる
20http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation
RSA (RIVEST, SHAMIR, ADLEMAN)
• 公開鍵暗号方式のひとつ
• 知られてもよい鍵(公開鍵)とダメな鍵(秘密鍵)のペアを使う
• ざっくり言うと
• 公開鍵と秘密鍵のペアを作る、鍵は実際にはただの大きな整数
• 暗号化: 公開鍵で平文を累乗する
• 復号: 秘密鍵で暗号文を累乗する
• 暗号化は誰でもできるが、復号できるのは秘密鍵を持つ人だけ
21
もう少し詳しく
• 素数 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
素因数分解
• n を p, q に素因数分解できれば、秘密鍵 d が作れる
• しかし素因数分解を多項式時間で行うアルゴリズムは知られていない
• 高速素因数分解プログラムMsieveで実際にやってみる
• 256 bits なら 198 sec だった
• 1 bit増えるごとに2倍かかると仮定したとき、768 bits では…
23
$ openssl genrsa 256 | openssl rsa -modulusModulus=B199E7214196FDD9104B35361221402F8B53EEB53D0846C3B9839B0180DAC90D
$ ./msieve -e -v 0xB199E7214196FDD9104B35361221402F8B53EEB53D0846C3B9839B0180DAC90Dfactoring 80331297000141005477922190329275678672338023057316268735808908674607892580621 (77 digits)prp39 factor: 258928947932279960107043988464217168239prp39 factor: 310244557982565855560785171400435068739elapsed time 00:03:18
• n を p, q に素因数分解できれば、秘密鍵 d が作れる
• しかし素因数分解を多項式時間で行うアルゴリズムは知られていない
• 高速素因数分解プログラムMsieveで実際にやってみる
• 256 bits なら 198 sec だった
• 1 bit増えるごとに2倍かかると仮定したとき、768 bits では…
素因数分解
24
$ openssl genrsa 256 | openssl rsa -modulusModulus=B199E7214196FDD9104B35361221402F8B53EEB53D0846C3B9839B0180DAC90D
$ ./msieve -e -v 0xB199E7214196FDD9104B35361221402F8B53EEB53D0846C3B9839B0180DAC90Dfactoring 80331297000141005477922190329275678672338023057316268735808908674607892580621 (77 digits)prp39 factor: 258928947932279960107043988464217168239prp39 factor: 310244557982565855560785171400435068739elapsed time 00:03:18
• n を p, q に素因数分解できれば、秘密鍵 d が作れる
• しかし素因数分解を多項式時間で行うアルゴリズムは知られていない
• 高速素因数分解プログラムMsieveで実際にやってみる
• 256 bits なら 198 sec だった
• 1 bit増えるごとに2倍かかると仮定したとき、768 bits では…
素因数分解
25
$ openssl genrsa 256 | openssl rsa -modulusModulus=B199E7214196FDD9104B35361221402F8B53EEB53D0846C3B9839B0180DAC90D
$ ./msieve -e -v 0xB199E7214196FDD9104B35361221402F8B53EEB53D0846C3B9839B0180DAC90Dfactoring 80331297000141005477922190329275678672338023057316268735808908674607892580621 (77 digits)prp39 factor: 258928947932279960107043988464217168239prp39 factor: 310244557982565855560785171400435068739elapsed time 00:03:18
スパコンを使って本気を出した結果、半年で解けたと発表(2010年)
RSAの使われ方
• データそのものの暗号化にはほとんど用いられない
• 累乗処理は重い。何度も繰り返し行うのには適さない
• 鍵共有
• AESなどで使う共通鍵を送るために使う
• データそのものの暗号化はAESなどで行う(ハイブリッド暗号方式)
• デジタル署名
• データのハッシュ値を秘密鍵で暗号化し、これを「署名」としてくっつける
• 公開鍵を使い、署名が本人によるものか検証する
26
BIG BROTHER MIGHT BE WATCHING YOU?
• RSAで鍵共有を行い、AESでデータを暗号化して送っていたとする
• もし誰かが過去の通信データを全部保存していたら?
• そのままでは暗号化されているので、当然読めない
• もしその誰かにRSA秘密鍵を盗まれたら?
• 鍵共有で交換していた共通鍵が全部ばれる
• 過去の通信データが全部復号される
27
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
PERFECT FORWARD SECRECY
• A = g^a mod p から a を逆算することは、離散対数問題と呼ばれる
• 多項式時間で解けるアルゴリズムが見つかっていない
• 通信のセッションごとに違う共通鍵を作って暗号化
• ある時点での a が盗まれたとしても過去の共通鍵はわからない
• 誰かが過去の通信を全部保存してても安心
• セッションごとに鍵を変える場合をとくに DHE (Ephemeral) と呼ぶ
29
SSL/TLS’S CIPHERSUITE
• SSL/TLSにて、使用する暗号の組み合わせを表したもの
• TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
• 鍵共有にはECDHE(DHの楕円曲線版で鍵をセッションごとに変える)
• 通信相手の認証にはRSA
• データそのものの暗号化にはAES 128bitをCBC modeで使う
• メッセージの改ざん検知にはSHA-1
30
RECAP
• いろいろ紹介しました
• 換字式暗号、XOR cipher
• RC4
• AES、暗号利用モード
• RSA
• DH
• 基礎は大事
31
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
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
THANK YOU!
@inaz2
34