Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Crypto超入門 / SECCON Beginners Live 2022
Search
ushigai
September 11, 2022
1.9k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Crypto超入門 / SECCON Beginners Live 2022
ushigai
September 11, 2022
More Decks by ushigai
See All by ushigai
暗号目線で俯瞰するSSL/TLS / security minicamp in Tokyo 2022 TLS
ushigai
0
740
SECCON Beginners CTF2021のCryptoを解いてみよう
ushigai
0
1.1k
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Navigating Weather and Climate Data
rabernat
0
510
Marketing to machines
jonoalderson
1
5.8k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
490
It's Worth the Effort
3n
188
29k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
660
WCS-LA-2024
lcolladotor
0
820
GraphQLとの向き合い方2022年版
quramy
50
15k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
520
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
290
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Transcript
Crypto超入門 SECCON Beginners Live 2022 2022/09/11 うしがぃ
うしがぃ@ushigai_sub 所属 都立産業技術高等専門学校(5年) SECCON Beginners 運営チーム 趣味 ピアノ:小6から8年間 ルービックキューブ3×3:1/5/12/100=12.32/15.42/17.18/18.70 将棋:アマ二段
自己紹介 Crypto超入門 2
Cryptoとは CTFにおける出題傾向 RSA暗号の基本 暗号化と復号の定義 pythonでの実装 攻撃手法の紹介 復号するために必要な情報 典型的な攻撃手法の紹介 内容 Crypto超入門
3
CTF初心者のかた RSA暗号について... 暗号化と復号の計算方法と実装を学びたいかた 簡単な攻撃について理解したいかた お話の対象層 Crypto超入門 4
cryptographyの略で暗号に関する問題 暗号化されたメッセージの解読 認証情報のハック 配布ファイル 暗号化スクリプト&暗号文 サーバのスクリプトファイル スクリプトは主にpython CTFにおけるCryptoとは Crypto超入門 5
どのような問題が出るのか 文字コード変換 2018: Veni, vidi, vici 2020: R&B AES 2020:
Encrypter 2021: Imaginary 2022: command ElGamal 2018: Well Known 乱数 2022: unpredictable_pad 格子 2021: Field_trip そのた 2019: Party 2020: Noisy equations 2021: Logical_SEESAW 2021: GFM 2022: CoughingFox Crypto超入門 6
RSA 2018: RSA is Power 2019: Go RSA 2020: RSA
Calc 2021: simple_RSA 2021: p-8RSA 2022: PrimeParty 2022: omni-RSA どのような問題が出るのか Crypto超入門 7
Rivest,Shamir,Adlemanによって発明された 古参の公開鍵暗号 1977年に発明 公開鍵暗号を具体化した初の暗号化アルゴリズム 現代でもデジタル署名などで使用されている^1 素因数分解が困難であることを安全性の根拠としている RSA暗号とは Crypto超入門 8
知名度が高い 数式が美しく奥が深い 暗号化: 復号: 数式をいじって脆弱にしやすい RSA暗号がなぜ多いのか c = me mod
n m = cd mod n Crypto超入門 9
前提知識 RSA暗号の基礎 暗号化と復号の定義 pythonでの実装 攻撃手法の紹介 どのような情報を得られれば復号できるのか 具体例の紹介 RSA暗号 Crypto超入門 10
前提知識 (1/4) モジュロ演算 整数 について を で割り余りを取得する演算をモジュロ演算という ほとんどの公開鍵暗号ではモジュロ演算を使用 を で割った余りは
と表記 計算例 a, n a n a n a mod n 12 mod 4 = 0 50 mod 11 = 6 Crypto超入門 11
前提知識 (2/4) 最大公約数について ある2つの整数について、それぞれを割り切る最も大きな整数のことを 最大公約数(GCD: Greatest Common Divisor)という 計算例 ユークリッドの互除法を使用すれば高速に計算することができる
のとき、 と を「互いに素」と呼ぶ GCD(14, 21) = 7 GCD(12, 48) = 12 GCD(101, 128) = 1 gcd(m, n) = 1 m n Crypto超入門 12
前提知識 (3/4) オイラーのトーシェント関数 任意の自然数 について と互いに素な 以下の自然数の個数を とおく。 が素数の場合 e.g.
が異なる素数 からなる合成数の場合 e.g. n n n φ(n) n φ(n) = n − 1 n = 7 ⇒ φ(n) = 6 n p, q φ(n) = (p − 1)(q − 1) n = 15 ⇒ φ(n) = 8 Crypto超入門 13
前提知識 (4/4) 良く出てくる用語 平文/暗号文 暗号化されていなく、そのまま読めるデータ 秘密鍵をもつ人しか読めないデータ 公開鍵暗号 暗号化と復号で別の鍵を使い、暗号化で使用する鍵を公開する方式 公開鍵/秘密鍵 暗号化のみで使用し公開する鍵
復号のみで使用し秘密にする鍵 Crypto超入門 14
RSA暗号の暗号化と復号の定義 鍵生成: 素数 と (一般に )を決定し とおき、 とおく。(ただし とする) このとき公開鍵の組を
,秘密鍵を とする。 p, q e e = 65537 n = pq d = e−1 mod φ(n) gcd(φ(n), e) = 1 (e, n) d 暗号化: 任意の平文 について暗号文 は となる。 m c c = me mod n 復号: 平文 は と復号できる。 m m = cd mod n Crypto超入門 15
公開鍵/秘密鍵 平文 RSA暗号の具体的な計算例 p = 5, q = 11 n
= 55 e = 3, d = 27 m = 32 Crypto超入門 16
RSA暗号の具体的な計算例 暗号化 pow(32, 3, 55) -> 43 復号 pow(43, 27,
55) -> 32 m = 32 c = me mod n c = 323 mod 55 m = cd mod n m = 4327 mod 55 Crypto超入門 17
pycryptoとは pythonの暗号処理モジュール pycryptoは2013年10月18日を最後に更新されていないのでfork開発さ れているpycryptodomeを使用すべき 特に Crypto.Util.number にCTFで最低限戦える関数がたくさんある 文字列⇔数値の変換: long_to_bytes(6382179) ,
bytes_to_long(b"abc") Nbitの素数生成: getPrime(N) の計算: inverse(u, v) Cryptoモジュールについて u−1 mod v Crypto超入門 18
from Crypto.Util.number import * p, q = getPrime(512), getPrime(512) #
素数生成 n = p * q # 公開鍵生成 e = 65537 message = bytes_to_long(b"Hello world!!!") cipher = pow(message, e, n) # 暗号化 c=m^e mod n phi = (p - 1)*(q - 1) d = inverse(e, phi) # 秘密鍵生成 d=e^-1 mod φ(n) message = pow(cipher, d, n) # 復号 m=c^d mod n RSAの実装 Crypto超入門 19
前提として… 1024bit以上のPlainRSAは現実的な時間で解くことが不可能 脆弱にしてあげる必要がある 紹介する攻撃手法 素因数分解できる場合 素数を使いまわしている場合 方程式を解くことで素因数分解できる場合 CTFにおけるRSA暗号 Crypto超入門 20
復号の条件 どのような情報を得られれば復号できるのか 前提条件 は公開鍵で既知 また も暗号文で既知 : 秘密鍵なので復号できる : 素因数分解でき復号できる
: 素因数分解でき復号できる n, e c d p q Crypto超入門 21
計算量とは 入力値に対する実行ステップ数の増加量の指標 Cryptoの問題を解く上でエクスプロイトコードの計算量は非常に重要 CTFはだいたい24時間開催なので…… 32bitの鍵を総当たりするのが限界 で , で 復号の条件 計算量について
N = 32 O(2 ) N N = 1010 O(N) Crypto超入門 22
RSA暗号は素因数分解すると復号できる を素朴に全探索 計算量が であまり良くない ツールの使用がおすすめ yafu, sagemath, msieve http://factordb.com/index.php https://www.alpertron.com.ar/ECM.HTM
素因数分解 n(= pq) 2, 3, 5, 7, ... O( ) N Crypto超入門 23
from Crypto.Util.number import * p, q = getPrime(64), getPrime(64) #
64bitの素数を生成 n = p*q e = 65537 message = bytes_to_long(b"Hello world!!!") cipher = pow(message, e, n) print("n =", n) print("e =", e) print("cipher =", cipher) # n = 176758646138734597782135865714590884773 # e = 65537 # cipher = 84184983095913927892595433377236235254 実際にやってみる Crypto超入門 24
from Crypto.Util.number import * n = 176758646138734597782135865714590884773 e = 65537
cipher = 84184983095913927892595433377236235254 p = 11654023597864701997 q = 15167177640786744409 phi = (p - 1)*(q - 1) d = inverse(e, phi) message = pow(cipher, d, n) message = long_to_bytes(message) print(message) 実際にやってみる Crypto超入門 25
素数を使いまわしている場合 from Crypto.Util.number import * p1, q1 = getPrime(512), getPrime(512)
p2, q2 = getPrime(512), q1 n1 = p1*q1 n2 = p2*q2 e = 65537 dummy_message = bytes_to_long(b"dumdumdummy!!!") dummy_cipher = pow(dummy_message, e, n2) message = bytes_to_long(b"FLAG{****}") cipher = pow(message, e, n1) print("n1 =", n1) print("n2 =", n2) print("e =", e) print("cipher =", cipher) { n = p q 1 1 1 n = p q 2 2 2 ここで とすると、 { n = p Q 1 1 n = p Q 2 2 ⇒ Q = GCD(n , n ) 1 2 Q = q = 1 q 2 Crypto超入門 26
from Crypto.Util.number import * n1 = <<snip>> n2 = <<snip>>
e = 65537 cipher = <<snip>> Q = q1 = GCD(n1, n2) p1 = n1 // q1 phi = (p1 - 1)*(q1 - 1) d = inverse(e, phi) message = pow(cipher, d, n1) message = long_to_bytes(message) print(message) 素数を使いまわしている場合 Crypto超入門 27
方程式を解き素因数分解できる場合 from Crypto.Util.number import * p, q = getPrime(512), getPrime(512)
n = p*q r = p + q e = 65537 message = bytes_to_long(b"FLAG{****}") cipher = pow(message, e, n) print("n =", n) print("e =", e) print("cipher =", cipher) print("r =", r) { n = p ∗ q r = p + q ⇔ { n = p ∗ q p = r − q ⇒ n = −q + 2 rq ⇔ q − 2 rq + n = 0 の二次方程式なので が計算 できる q q Crypto超入門 28
方程式を解き素因数分解できる場合 from Crypto.Util.number import * from gmpy2 import iroot n
= <<snip>> e = 65537 cipher = <<snip>> r = <<snip>> a, b, c = 1, -r, n X = iroot(b*b - 4*a*c, 2)[0] q = (-b + X) // 2*a p = n // q d = inverse(e, (p - 1)*(q - 1)) message = pow(cipher, d, n) message = long_to_bytes(message) print(message) q − 2 rq + n = 0 q = 2 r + r − 4n 2 Crypto超入門 29
RSA暗号はCTFで頻出な公開鍵暗号 RSA暗号は を素因数分解することで復号できる 攻撃 素数 が小さい場合ツールによる素因数分解が有効 公開鍵 が複数得られ素数が使いまわされている場合、GCDをとることで 素因数分解できる の式が複数得られている場合、それらの式を解くことで素因数分解で
きる まとめ n p, q n p, q Crypto超入門 30
おすすめ本 詳解セキュリティコンテスト 暗号と認証のしくみと理論がこれ1冊でしっかりわかる教科書 暗号技術入門 クラウドを支えるこれからの暗号技術 おすすめ常設CTF picoCTF CRYPTOHACK おすすめ紹介 Crypto超入門
31
おすすめ記事 RSA暗号運用でやってはいけないnのこと #ssmjp Twenty Years of Attaks on the RSA
Cryptosystem おすすめVTuber kurenaif 【RSA入門】【初心者と一緒に学ぶ】CTFのCrypto超入門【kurenaif】 おすすめ紹介 Crypto超入門 32
Wikipedia RSA暗号 https://ja.wikipedia.org/wiki/RSA%E6%9A%97%E5%8F%B7 Wikipedia オイラーのφ関数 https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%A4%E3%83% A9%E3%83%BC%E3%81%AE%CF%86%E9%96%A2%E6%95%B0 AtCoder W -
2.06.計算量 https://atcoder.jp/contests/apg4b/tasks/APG4b_w 参考 Crypto超入門 33
None