Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Crypto超入門 / SECCON Beginners Live 2022
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
720
SECCON Beginners CTF2021のCryptoを解いてみよう
ushigai
0
1.1k
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
50
15k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
250
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
360
Fireside Chat
paigeccino
42
3.9k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
Mobile First: as difficult as doing things right
swwweet
225
10k
Typedesign – Prime Four
hannesfritz
42
3.1k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
270
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
It's Worth the Effort
3n
188
29k
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