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
SECCON Beginners Live 2023-Crypto
Search
motimotipurinn
September 03, 2023
Programming
1
1.4k
SECCON Beginners Live 2023-Crypto
SECCON Beginners Live 2023-Cryptoで使用したスライドです
motimotipurinn
September 03, 2023
Tweet
Share
Other Decks in Programming
See All in Programming
RWC 2024 DICOM & ISO/IEC 2022
m_seki
0
210
生成AIでGitHubソースコード取得して仕様書を作成
shukob
0
470
Zoneless Testing
rainerhahnekamp
0
120
Keeping it Ruby: Why Your Product Needs a Ruby SDK - RubyWorld 2024
envek
0
190
数十万行のプロジェクトを Scala 2から3に完全移行した
xuwei_k
0
280
命名をリントする
chiroruxx
1
410
各クラウドサービスにおける.NETの対応と見解
ymd65536
0
110
アクターシステムに頼らずEvent Sourcingする方法について
j5ik2o
4
290
Spatial Rendering for Apple Vision Pro
warrenm
0
110
今年一番支援させていただいたのは認証系サービスでした
satoshi256kbyte
1
260
103 Early Hints
sugi_0000
1
230
創造的活動から切り拓く新たなキャリア 好きから始めてみる夜勤オペレーターからSREへの転身
yjszk
1
130
Featured
See All Featured
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
2
170
Practical Orchestrator
shlominoach
186
10k
Become a Pro
speakerdeck
PRO
26
5k
Documentation Writing (for coders)
carmenintech
66
4.5k
Code Review Best Practice
trishagee
65
17k
The Cost Of JavaScript in 2023
addyosmani
45
7k
Typedesign – Prime Four
hannesfritz
40
2.4k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
111
49k
Building Your Own Lightsaber
phodgson
103
6.1k
We Have a Design System, Now What?
morganepeng
51
7.3k
Transcript
SECCON BEGINNERS LIVE 2023-Crypto入門 2023/9/3 SECCON BEGINNERS LIVE 2023 竹内悠人(灘高校2年)
2 ⚫ 竹内悠人-もちもち Twitter:@motimoti_purinn ⚫ 所属 ◼ SECCON BIGINNERS運営 ◼
灘高校二年 ⚫ 部活: ◼ 水泳部、生物研究部、アマチュア無線研究部 ⚫ 趣味: ◼ 将棋:アマ1級 ◼ APEX:S17初マスター ⚫ その他: ◼ LAC すごうで2023採択 NLPを使った開発 ◼ SecHack365’23 トレーニー OS,コンパイラ自作 ◼ セキュリティキャンプ全国大会’21 修了生 0.自己紹介
3 ⚫ 本日話す内容: ◼ Cryptoとは何か? ◼ CTFでの出題傾向 ◼ 事前知識 ◼
用語や数学の話 ◼ RSA暗号について ◼ 暗号化、復号の話 ◼ 実装 ◼ 攻撃の紹介 ◼ 本日のコード git clone https://github.com/SECCON/2 023_beginnerslive 6.Crypto
4 ⚫CTFでの出題傾向: ◼CryptoはCryptographyの略で、暗号のことです ◼ 暗号化されたメッセージの解読を主に行います ◼配布ファイル ◼暗号化スクリプト、暗号文 ◼サーバーのスクリプト ◼ほぼpython ◼
多倍長整数をサポートしていてライブラリも充実 6.Crypto
5 ⚫CTFでの出題傾 向: ◼文字コード変換 ◼ 2018: Veni, vidi, vici ◼
2020: R&B ◼AES ◼ 2020: Encrypter ◼ 2021: Imaginary ◼ 2022: command ◼ElGamal ◼ 2018: Well Known 6.Crypto ◼ 乱数 ◼ 2022: unpredictable_pad ◼ 2023: switchable_cat ◼ 格子 ◼ 2021: Field_trip ◼ その他 ◼ 2019: Party ◼ 2020: Noisy equations ◼ 2021: Logical_SEESAW,GFM ◼ 2022: CoughingFox ◼ 2023: CoughingFox2 ◼ 2023:cooking ◼ 2023:Conquer
6 ⚫CTFでの出題傾向: ◼RSA ◼ 2018: 2018: RSA is Power ◼
2019: Go RSA ◼ 2020: RSA Calc ◼ 2021: simple_RSA ◼ 2021: p-8RSA ◼ 2022: PrimeParty ◼ 2022: omni-RSA ◼ 2023: Choice 6.Crypto
7 ⚫RSA暗号: ◼ Rivest, Shamir, Adlemanによって作られた公開鍵暗号 ◼ 現代でもデジタル署名で使用されている ◼ 素因数分解の困難性を安全性の根拠にしている
◼ 一番有名な暗号。サマーウォーズのあれ! ◼ 数式が美しい ◼ 数式を弄ると脆弱にしやすい 6.Crypto
8 ⚫RSA暗号の暗号化と復号: ◼ 鍵の生成 ◼ 素数p,qを生成し、n=pqとする ◼ nと互いに素である数eを用意し(n,e)を公開鍵とする ◼ 𝒅
= 𝒆−𝟏 𝒎𝒐𝒅 φ(𝒏) とおき、これを秘密鍵とする ◼ 暗号化 ◼ 平文mに対し、暗号文cを𝒄 = 𝒎𝒆 𝒎𝒐𝒅 𝒏とする ◼ 復号 ◼ 平文mは𝒎 = 𝒄𝒅 𝒎𝒐𝒅 𝒏とする 6.Crypto
9 ⚫よくわからん 6.Crypto
10 ⚫事前知識: ◼ 用語 ◼ 平文、暗号文 ◼ 公開鍵と秘密鍵 ◼ 数学
◼ 最大公約数 ◼ モジュロ演算 ◼ 逆元 ◼ 拡張ユークリッドの互除法 ◼ オイラーのトーシェント(φ)関数 ◼ オイラーの定理 6.Crypto
11 ⚫用語 ◼ 平文 ◼ 暗号化する前のデータ のこと ◼ 人間が簡単によめる ◼
暗号文 ◼ 鍵を持った人しか読め ないデータのこと 6.Crypto 暗号化 復号
12 ⚫公開鍵と秘密鍵 ◼ 公開鍵 ◼ 全世界に公開する ◼ 公開鍵暗号方式で暗号 化に使用 ◼
秘密鍵 ◼ 自分以外には絶対に渡 してはいけない ◼ 公開鍵暗号方式にて復 号に使用 6.Crypto 暗号化 復号
13 ⚫おまけ: 秘密鍵暗号方式 ◼ 暗号化も復号も両方秘密 鍵でやる ◼ 今日やっていくRSA暗 号は公開鍵暗号方式 6.Crypto
暗号化 復号
14 ⚫数学:最大公約数 ◼ ある整数の組a,bに対してそれぞれを割り切る最も大きい整数 を最大公約数と呼びGCD(a,b)と表記する GCD:Greatest Common Divisor ◼ 例
◼ 𝑮𝑪𝑫 𝟏𝟒, 𝟐𝟏 = 𝟕 ◼ 𝑮𝑪𝑫 𝟑, 𝟏𝟏 = 𝟏 ◼ ユークリッドの互除法によって簡単に計算できる ◼ GCDが1であることを互いに素と呼ぶ 6.Crypto
15 ⚫モジュロ演算 ◼ 整数a,nに対して aをnで余りをとる演算をモジュロ演算と呼ぶ ◼ aをnで割った余りは𝒂 𝒎𝒐𝒅 𝒏と表記する ◼
例 ◼ 𝟏𝟐 𝒎𝒐𝒅 𝟒 = 𝟎 ◼ 𝟓𝟎 𝒎𝒐𝒅 𝟏𝟏 = 𝟔 ◼ Pythonだと𝒂%𝒏 6.Crypto
16 ⚫合同式 ◼ 整数a,bと正整数nに対しaとbがnで割った余りが等しい場合 aとbはnを法として合同といい、𝒂 ≡ 𝒃 𝒎𝒐𝒅 𝒏と表記する ◼
ほとんどの公開鍵暗号では合同式を使用 ◼ 例 ◼ 𝟏𝟐 ≡ 𝟎 𝒎𝒐𝒅 𝟒 ◼ 𝟓𝟎 ≡ 𝟔 𝒎𝒐𝒅 𝟏𝟏 6.Crypto
17 ⚫逆元 ◼ 整数aと法nに対し𝒂・𝒂−𝟏 ≡ 𝟏 𝒎𝒐𝒅 𝒏を満たす𝒂−𝟏をaの逆元と 呼ぶ ◼
例 ◼ 𝟓・𝐚−𝟏 ≡ 𝟏 𝒎𝒐𝒅 𝟕 の時𝒂−𝟏 = 𝟑 なぜなら𝟓・𝟑 = 𝟏𝟓 = 𝟕・𝟐 + 𝟏 ◼ 逆元の計算方法 ◼ 拡張ユークリッドの互除法 ◼ オイラーの定理 6.Crypto
18 ⚫拡張ユークリッドの互除法 ◼ 1次不定方程式𝒂𝒙 + 𝒃𝒚 = 𝒄を求めるアルゴリズム ◼ 例
◼ 𝟑𝟕𝒙 + 𝟏𝟎𝒚 = 𝟏となるx,yを求めたい 𝟑𝟕 = 𝟏𝟎・𝟑 + 𝟕 𝟏𝟎 = 𝟕・𝟏 + 𝟑 𝟕 = 𝟑・𝟐 + 𝟏 𝟑 = 𝟏・𝟑 6.Crypto
19 ⚫拡張ユークリッドの互除法 ◼ 1次不定方程式𝒂𝒙 + 𝒃𝒚 = 𝒄を求めるアルゴリズム ◼ さっきの互除法を再構築していく
◼ 𝟑𝟕𝒙 + 𝟏𝟎𝒚 = 𝟏となるx,yを求めたい 1=7−3×2 =7−(10−7)×2 =3×7−2×10 =3×(37−10×3)−2×10 =3×37−9×10 よってx=37,y=-10 𝒄 = 𝑪𝑮𝑫(𝒂, 𝒃)・𝐝である時、𝒂𝒙 + 𝒃𝒚 = 𝑮𝑪𝑫(𝒂, 𝒃)を求めた後x,yを それぞれd倍してあげればよい 6.Crypto
20 ⚫オイラーのトーシェント(φ)関数 ◼ 正整数nに対しn以下の正整数のうち、nと互いに素である個 数をφ(n)とおく ◼ 例 ◼ p,qを異なる素数とし、𝒏 =
𝒑𝒒である時 φ 𝒏 = 𝐩 − 𝟏 𝐪 − 𝟏 ◼ n=15の時 φ 𝒏 = 𝟑 − 𝟏 𝟓 − 𝟏 = 𝟖 実際に1,2,4,7,8,11,13,14の8個ある 6.Crypto
21 ⚫オイラーの定理 nが正整数で𝑮𝑪𝑫 𝒂, 𝒏 = 𝟏 の時、𝒂φ(𝐧) ≡ 𝟏
𝒎𝒐𝒅 𝒏 が成り立ち、これをオイラーの定理という ◼ 例 ◼a=7、𝒏 = 𝟏𝟓である時 𝟕φ(𝟏𝟓) ≡ 𝟕𝟖 ≡ 𝟏 𝒎𝒐𝒅 𝟏𝟓 ◼pythonだとpow(7,8,15)で計算できる ◼有名なフェルマーの小定理を 一般化したのがオイラーの定理 𝒂𝒑−𝟏 ≡ 𝟏 𝒎𝒐𝒅 𝒑 6.Crypto
22 ⚫RSA暗号の暗号化と復号(再) ◼ 鍵の生成 ◼ 素数p,qを生成し、n=pqとする ◼ Nと互いに素である数eを用意し(n,e)を公開鍵とする ◼ 𝒅
= 𝒆−𝟏 𝒎𝒐𝒅 φ(𝒏) とおき、これを秘密鍵とする ◼ 暗号化 ◼ 平文mに対し、暗号文cを𝒄 = 𝒎𝒆 𝒎𝒐𝒅 𝒏とする ◼ 復号 ◼ 平文mは𝒎 = 𝒄𝒅 𝒎𝒐𝒅 𝒏とする 6.Crypto
23 ⚫RSA暗号(演習) ◼ 鍵の生成 ◼ p=5,q=11,e=3としてみてください ◼ 平文mを32としてみましょう ◼ 暗号化
◼ 𝒄 = 𝒑𝒐𝒘(𝒎, 𝒆, 𝒑 ∗ 𝒒) ◼ 復号 ◼ 𝒆𝒅 = 𝟏 𝒎𝒐𝒅 (𝒑 − 𝟏)(𝒒 − 𝟏)よりd=27 ◼ 𝒎′ = 𝒑𝒐𝒘(𝒄, 𝒅, 𝒑 ∗ 𝒒) 6.Crypto
24 ⚫RSA暗号(演習) 6.Crypto
25 ⚫RSA暗号の完全性の証明 ◼ 仮定より𝒎’ = 𝒄𝒅 = 𝒎𝒆𝒅 𝒎𝒐𝒅 𝒏
◼ 𝒆𝒅 = 𝟏 𝒎𝒐𝒅 φ(𝒏)より𝒆𝒅 = 𝟏 + 𝒌φ(n) ◼先ほどの式に代入して 𝒎’ = 𝒎𝒌φ(𝒏)+𝟏 = 𝒎𝟏・(𝒎𝝋 𝒏 )𝒌 ◼ ここでオイラーの定理より 𝒎φ 𝒏 = 𝟏 𝒎𝒐𝒅 𝒏であることを思い出すと 𝒎’ ≡ 𝒎𝟏・ 𝟏 𝒌 = 𝒎 となり元の平文mに戻ってくることがわかる 6.Crypto
26 ⚫RSA暗号の安全性の根拠 ◼ 公開鍵nの素因数分解の困難性を安全性の根拠としている ◼ これが素因数分解できると何がまずいのか? ◼ 𝒏 = 𝒑𝒒であることを思い出すとこれが素因数分解できた時
p,qの値が取得できる。eは公開鍵なので (𝒆, −𝟏, (𝒑 − 𝟏)(𝒒 − 𝟏))をすることで秘密鍵dが取得できてしま う ◼ 秘密鍵が入手されると𝒑𝒐𝒘(𝒄, 𝒅, 𝒏)で暗号文を復号できる 6.Crypto
27 ⚫ RSAの攻撃その1: Low Public-Exponent Attack ◼ 公開鍵eが十分に小さいときに秘密鍵dを取得することなく暗 号文が取得できてしまう ◼
RSA暗号の定義より𝐜 = 𝒎𝒆 𝒎𝒐𝒅 𝒏より𝒎𝒆 < 𝒏であるとき、 暗号文はnの影響を受けることなく𝒎 = 𝒆 𝒄とすることで平文 mを復元できる 6.Crypto
28 ⚫ RSAの攻撃その1: Low Public-Exponent Attack ◼ cのe乗根を取得する際にgmpy2というツールを使用する 6.Crypto
29 ⚫ RSAの攻撃その1: Low Public-Exponent Attack ◼ gmpy2.irootを使用します この関数はaにはcのe乗根が整数で返されて、bにはcのe乗根 が整数であったかがbool型で返されます
6.Crypto
30 ⚫ RSAの攻撃その1: Low Public-Exponent Attack ◼ 実装 6.Crypto
31 ⚫ RSAの攻撃その2: Common Modulus Attack ◼ RSA公開鍵 𝒏, 𝒆𝟏
, {𝒏, 𝒆𝟐 }と暗号文{𝒄𝟏 , 𝒄𝟐 }が与えられ、 𝑮𝑪𝑫 𝒆𝟏 , 𝒆𝟐 = 𝟏である時平文mが復元できる ◼ 𝑮𝑪𝑫 𝒆𝟏 , 𝒆𝟐 = 𝟏であることより、𝒆𝟏 𝒔𝟏 + 𝒆𝟐 𝒔𝟐 = 𝟏を満たす整 数𝒔𝟏 , 𝒔𝟐 が存在する。ここで拡張ユークリッドの互除法で 𝒔𝟏 , 𝒔𝟐 が入手できれば 𝒄𝟏 𝒔𝟏𝒄 𝟐 𝒔𝟐 = 𝒎𝒆𝟏𝒔𝟏𝒎𝒆𝟐𝒔𝟐 = 𝒎𝒆𝟏𝒔𝟏+𝒆𝟐𝒔𝟐 = 𝒎𝟏 となる 6.Crypto
32 ⚫ RSAの攻撃その2: Common Modulus Attack ◼ 実装 6.Crypto
33 ⚫ RSAの攻撃その2: Common Modulus Attack ◼ 実装 6.Crypto
34 ⚫ RSAの攻撃その3: Håstad's broadcast attack ◼ 同じ平文m,e、異なるnによって作られた暗号文cがe個あると きmを復元することができる。 ◼
中国剰余定理を用います 6.Crypto
35 ⚫ RSAの攻撃その3: Håstad's broadcast attack ◼ 同じ平文m,e、異なるnによって作られた暗号文cがe個あると きmを復元することができる。 ◼
中国剰余定理を用います 6.Crypto
36 ⚫ RSAの攻撃その3: Håstad's broadcast attack 6.Crypto
37 ⚫ RSAのctf4b過去問その1: [Beginner] simple_RSA ( 289solves ) ◼ 𝒑,
𝒒 ∈ 𝒈𝒆𝒕𝑷𝒓𝒊𝒎𝒆 𝟏𝟎𝟐𝟒 , 𝒆 = 𝟑, 𝒏 = 𝒑𝒒 で定義されるn,e,cが与えられる。平文mを求めよ ◼ 1分ほど時間をとります。方針を考えてみてください 6.Crypto
38 ⚫ RSAのctf4b過去問その1: [Beginner] simple_RSA ( 289solves ) ◼ 答え
eが3でとても小さいため Low Public-Exponent Attackが適応出来る 実装はさっきの通り 6.Crypto
39 ⚫ RSAのctf4b過去問その2: [Easy] PrimeParty (58solves ) ◼ 自分で最大3つまで素数を選び、ランダムな4つの256bit 素数との積をとってnが作られる
flag(m)は455bit 問題サーバーに素数を送信すると、こうして作られnを用 いてn,e=65537,cを返す。平文mを求めよ ◼1分ほど時間をとります。方針を考えてみてください 6.Crypto
40 ⚫ RSAのctf4b過去問その2: [Easy] PrimeParty (58solves ) ◼ 答え 平文mよりも十分大きな素数pを入力してあげることで
𝒄 = 𝒎𝒆 𝒎𝒐𝒅 𝒏を解く問題から𝒄 = 𝒎𝒆 𝒎𝒐𝒅 𝒑を考える問 題に書き換えれる。 すると𝒆𝒅 = 𝟏 𝒎𝒐𝒅 φ(𝒑)、つまり𝒆𝒅 = 𝟏 𝒎𝒐𝒅 𝒑 − 𝟏とな り、秘密鍵dを取得できる。あとは復号してやればいい 6.Crypto
41 ⚫ RSAのctf4b過去問その3: [midium] Choice(31solves) ◼ n(=pqr),e,c,pq+qr+rpが与えられる。 またn<kを満たす好きなkに対して𝒑𝒌 + 𝒒𝒌
+ 𝒓𝒌を何度で も問題サーバーから取得できる。平文mを求めよ ◼ 数分時間をとります。方針を考えてみてください ネタバレ要素が強いので、ネタバレが嫌な人は休憩して いてください 6.Crypto
42 ⚫ RSAのctf4b過去問その3: [midium] Choice(31solves) ◼ 答え RSA問題の一つのゴールはφ(n)を求めることである。 φ 𝒏
= 𝒑 − 𝟏 𝒒 − 𝟏 𝒓 − 𝟏 = 𝒑𝒒𝒓 − 𝒑𝒒 + 𝒒𝒓 + 𝒓𝒑 + 𝒑 + 𝒒 + 𝒓 − 𝟏 = 𝐧 − 𝒑𝒒 + 𝒒𝒓 + 𝒓𝒑 + 𝒑 + 𝒒 + 𝒓 − 𝟏 よってp+q+rを求めてあげたい 6.Crypto
43 ⚫ RSAのctf4b過去問その3: [midium] Choice(31solves) ◼ 答え 何度でも𝒑𝒌 + 𝒒𝒌
+ 𝒓𝒌が入手できることと、先ほどの式を 合わせると、対象式が思い浮かんでくる人もいると思い ます。次数をうまく合わせてやると、、 6.Crypto
44 ⚫ RSAのctf4b過去問その3: [midium] Choice(31solves) ◼ 答え 連続する4整数でこの値をとってあげ、 これらを𝑨𝟏 ,
𝑨𝟐 , 𝑨𝟑 , 𝑨𝟒 とすると以下の式が成立します 𝑨𝟏 = 𝒑 + 𝒒 + 𝒓 𝑨𝟐 − 𝒑𝒒 + 𝒒𝒓 + 𝒓𝒑 𝑨𝟑 + 𝒑𝒒𝒓𝑨𝟒 つまり 𝒑 + 𝒒 + 𝒓 = 𝑨𝟏 𝒑𝒒 + 𝒒𝒓 + 𝒓𝒑 𝑨𝟑 − 𝒑𝒒𝒓𝑨𝟒 𝑨𝟐 となる。よってφ(n)が出たのでdが求められ復号できた 6.Crypto