RSA 攻撃
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
迅速なトリアージ
収集するもの:
n,e,c(および追加の暗号文)- メッセージ間の関係(同一の平文か? モジュラスを共有しているか? 構造化された平文か?)
- 任意の leaks(部分的な
p/q、dのビット、dp/dq、既知のパディング)
次に試すこと:
- 因数分解の確認 (Factordb /
sage: factor(n)— 小規模向け) - 低指数パターン(
e=3、broadcast) - 共通モジュラス / 繰り返しの素因数
- 何かがほぼ既知の場合は Lattice methods (Coppersmith/LLL)
一般的な RSA 攻撃
Common modulus
もし2つの暗号文 c1, c2 が同じモジュラス n の下で(異なる指数 e1, e2 を使って)同じメッセージを暗号化しており(かつ gcd(e1,e2)=1)、拡張ユークリッド算法で m を復元できます:
m = c1^a * c2^b mod n ただし a*e1 + b*e2 = 1。
例(概要):
(a, b) = xgcd(e1, e2)を計算してa*e1 + b*e2 = 1を得るa < 0の場合、c1^aはinv(c1)^{-a} mod nと解釈する(bも同様)- 掛け合わせて
nで剰余を取る
Shared primes across moduli
同一のチャレンジから得た複数の RSA モジュラスがあるなら、素因数を共有していないかチェックする:
gcd(n1, n2) != 1は致命的な鍵生成の失敗を意味する。
CTFs では「多数の鍵を素早く生成した」や「ランダム性が弱い」といったケースでよく見られる。
Håstad broadcast / low exponent
同一の平文が複数受信者に対して小さい e(しばしば e=3)で、適切なパディングなしに送られている場合、CRT と integer_root を使って m を復元できます。
技術的条件:
互いに素なモジュラス n_i 下で同一メッセージの暗号文が e 個ある場合:
- CRT を使って積
N = Π n_i上でM = m^eを復元する - もし
m^e < Nなら、Mは真の整数冪なのでm = integer_root(M, e)
Wiener attack: small private exponent
もし d が小さすぎると、連分数を用いて e/n から d を復元できる。
Textbook RSA pitfalls
もし次のような状態が見られるなら:
- OAEP/PSS がなく、生のモジュラ冪乗を使っている
- 決定論的な暗号化
代数的攻撃やオラクルの悪用がずっと現実的になる。
Tools
- RsaCtfTool: https://github.com/Ganapati/RsaCtfTool
- SageMath (CRT, roots, CF): https://www.sagemath.org/
関連メッセージのパターン
もし同じモジュラス下で、メッセージが代数的に関連している(例: m2 = a*m1 + b)2つの暗号文を見たら、Franklin–Reiter のような related-message 攻撃を疑ってください。通常必要なのは:
- 同じモジュラス
n - 同じ指数
e - 平文間の既知の関係
実務では、Sage で n を法とする多項式を立てて GCD を計算することで解くことが多いです。
Lattices / Coppersmith
部分的なビット、構造化された平文、あるいは未知量が小さくなる近似関係がある場合に使います。
Lattice methods (LLL/Coppersmith) は部分情報があるときに出てきます:
- 部分的に既知の平文(未知の末尾がある構造化メッセージ)
- 部分的に既知の
p/q(上位ビットが leak しているなど) - 関連値間の小さな未知差
見分けるべき点
チャレンジでよくあるヒント:
- 「p の上位/下位ビットを leak した」
- 「The flag is embedded like:
m = bytes_to_long(b\"HTB{\" + unknown + b\"}\")」 - 「RSA を使っているが小さなランダム padding を入れている」
ツール類
実際には LLL 用に Sage を使い、特定のインスタンス向けの既知テンプレートを適用します。
出発点として有用なもの:
- Sage CTF crypto templates: https://github.com/defund/coppersmith
- A survey-style reference: https://martinralbrecht.wordpress.com/2013/05/06/coppersmiths-method/
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。


