# 方法1: 使用启动脚本 (推荐)
python run_gui.py
# 方法2: 直接运行
python src/gui/rsa_gui.py
# 方法3: 使用Mac应用程序
open "dist/RSA CTF Tools.app"-
选择攻击方法
- 在下拉框中选择要使用的攻击方法
- 每种方法都有详细的说明和适用条件
-
输入参数
- 模数n: RSA公钥中的模数
- 公钥指数e: 通常是65537或3
- 密文c: 要破解的密文
- 其他参数: 根据攻击方法的需要
-
执行攻击
- 点击"执行攻击"按钮开始
- 或点击"运行演示"查看示例
-
查看结果
- 攻击成功会显示解密的明文
- 失败会显示错误信息和建议
# 查看所有可用的攻击方法
python src/core/rsa_attacks.py help
# 运行攻击演示
python src/core/rsa_attacks.py demo# 进入项目目录
cd /Users/wooluo/DEV/RSA
# 激活虚拟环境
source venv/bin/activate
# 运行Python交互模式
python3# 导入攻击模块
from src.core.rsa_attacks import RSAAttacks
from Crypto.Util.number import bytes_to_long, long_to_bytes
# 或在项目根目录下直接导入
from rsa_attacks import RSAAttacks# 示例RSA参数
n = 3233 # 小的测试用模数 (61 * 53)
e = 17 # 公钥指数
p, q = 61, 53 # 质因数 (仅用于测试验证)
# 示例消息和密文
message = b"Hello"
m = bytes_to_long(message)
c = pow(m, e, n) # 加密得到密文
print(f"原始消息: {message}")
print(f"模数n: {n}")
print(f"公钥e: {e}")
print(f"密文c: {c}")适用场景: 当e=3且消息很小时
# 小指数攻击
def small_e_attack_example():
# 使用小的e值
n = 1234567890123456789
e = 3
# 创建一个足够小的消息
message = b"Hi"
m = bytes_to_long(message)
c = pow(m, e, n)
print(f"原始消息: {message}")
print(f"密文: {c}")
# 执行攻击
result = RSAAttacks.small_e_attack(c, n, e)
if result:
print(f"✅ 攻击成功: {result}")
else:
print("❌ 攻击失败")
# 运行示例
small_e_attack_example()适用场景: 当私钥d相对较小时
# Wiener攻击示例
def wiener_attack_example():
# 使用已知的脆弱参数
n = 8927392739273927392739273927392739273927392739273927
e = 17993
print(f"模数n: {n}")
print(f"公钥e: {e}")
# 执行Wiener攻击
d, p, q = RSAAttacks.wiener_attack(n, e)
if d:
print(f"✅ Wiener攻击成功!")
print(f"私钥d: {d}")
print(f"质因数p: {p}")
print(f"质因数q: {q}")
else:
print("❌ Wiener攻击失败")
# 运行示例
wiener_attack_example()适用场景: 相同模数n,不同公钥e加密相同消息
# 共模攻击示例
def common_modulus_attack_example():
# 相同的模数和消息
n = 3233
message = b"flag"
m = bytes_to_long(message)
# 不同的公钥指数
e1, e2 = 3, 7
# 用不同公钥加密相同消息
c1 = pow(m, e1, n)
c2 = pow(m, e2, n)
print(f"原始消息: {message}")
print(f"模数n: {n}")
print(f"公钥e1: {e1}, 密文c1: {c1}")
print(f"公钥e2: {e2}, 密文c2: {c2}")
# 执行共模攻击
result = RSAAttacks.common_modulus_attack(c1, c2, e1, e2, n)
if result:
print(f"✅ 共模攻击成功: {result}")
else:
print("❌ 共模攻击失败")
# 运行示例
common_modulus_attack_example()适用场景: 相同消息用相同e但不同n加密多次
# 广播攻击示例
def broadcast_attack_example():
# 准备多个模数 (实际应该是大质数的乘积)
n_list = [3233, 5183, 8633] # 示例用小数
e = 3 # 相同的公钥指数
message = b"secret"
m = bytes_to_long(message)
# 用不同模数加密相同消息
c_list = []
for n in n_list:
c = pow(m, e, n)
c_list.append(c)
print(f"原始消息: {message}")
print(f"公钥指数e: {e}")
print(f"模数列表: {n_list}")
print(f"密文列表: {c_list}")
# 执行广播攻击
result = RSAAttacks.broadcast_attack(c_list, n_list, e)
if result:
print(f"✅ 广播攻击成功: {result}")
else:
print("❌ 广播攻击失败")
# 运行示例
broadcast_attack_example()适用场景: 两个质因数p和q比较接近
# 费马分解攻击示例
def fermat_attack_example():
# 创建两个接近的质数
p = 1009
q = 1013 # 与p很接近
n = p * q
print(f"模数n: {n}")
print(f"真实质因数: p={p}, q={q}")
print(f"质因数差值: {abs(p-q)}")
# 执行费马分解攻击
result_p, result_q = RSAAttacks.fermat_attack(n)
if result_p and result_q:
print(f"✅ 费马分解成功!")
print(f"找到质因数: p={result_p}, q={result_q}")
else:
print("❌ 费马分解失败")
# 运行示例
fermat_attack_example()def solve_ctf_rsa(n, e, c):
"""
CTF RSA题目通用解题流程
"""
print("🎯 开始分析RSA题目")
print(f"n = {n}")
print(f"e = {e}")
print(f"c = {c}")
attacks = RSAAttacks()
# 1. 尝试小指数攻击
if e <= 3:
print("\n🔍 尝试小指数攻击...")
result = attacks.small_e_attack(c, n, e)
if result:
print(f"🚩 找到flag: {result}")
return result
# 2. 尝试Wiener攻击
print("\n🔍 尝试Wiener攻击...")
d, p, q = attacks.wiener_attack(n, e)
if d:
print(f"✅ Wiener攻击成功,d = {d}")
m = pow(c, d, n)
try:
flag = long_to_bytes(m)
print(f"🚩 找到flag: {flag}")
return flag
except:
print("解密结果无法转换为文本")
# 3. 尝试费马分解
print("\n🔍 尝试费马分解...")
p, q = attacks.fermat_attack(n)
if p and q:
print(f"✅ 费马分解成功: p={p}, q={q}")
phi = (p - 1) * (q - 1)
d = pow(e, -1, phi)
m = pow(c, d, n)
try:
flag = long_to_bytes(m)
print(f"🚩 找到flag: {flag}")
return flag
except:
print("解密结果无法转换为文本")
# 4. 尝试在线分解
print("\n🔍 尝试在线分解...")
from src.core.factor_tool import FactorTool
factors = FactorTool.factor_n(n)
if len(factors) == 2:
p, q = factors
print(f"✅ 在线分解成功: p={p}, q={q}")
phi = (p - 1) * (q - 1)
d = pow(e, -1, phi)
m = pow(c, d, n)
try:
flag = long_to_bytes(m)
print(f"🚩 找到flag: {flag}")
return flag
except:
print("解密结果无法转换为文本")
print("❌ 所有攻击方法都失败了")
return None
# 使用示例
n_example = 3233
e_example = 17
c_example = 2201
solve_ctf_rsa(n_example, e_example, c_example)-
启动应用程序
python run_gui.py
-
选择"RSA攻击"标签页
-
输入参数:
- 在"模数 n"框中输入:
3233 - 在"公钥指数 e"框中输入:
17 - 在"密文 c"框中输入:
2201
- 在"模数 n"框中输入:
-
选择攻击方法:
- 从下拉菜单选择适合的攻击方法
- 建议先尝试"自动选择攻击方法"
-
执行攻击:
- 点击"执行攻击"按钮
- 等待结果显示
| 条件 | 推荐攻击方法 | 成功率 |
|---|---|---|
| e = 3, 消息很小 | 小指数攻击 | 高 |
| e 很大, n 较小 | Wiener攻击 | 中 |
| 相同n, 不同e | 共模攻击 | 高 |
| 相同e, 不同n | 广播攻击 | 中 |
| p和q接近 | 费马分解 | 高 |
# 启用详细输出
import logging
logging.basicConfig(level=logging.DEBUG)
# 验证参数
def verify_rsa_params(n, e, d=None, p=None, q=None):
"""验证RSA参数的正确性"""
if p and q:
assert n == p * q, "n 应该等于 p * q"
if d:
phi = (p - 1) * (q - 1) if p and q else None
if phi:
assert (e * d) % phi == 1, "e * d 应该与 phi 互质"
print("✅ RSA参数验证通过")def safe_attack(attack_func, *args, **kwargs):
"""安全的攻击函数包装器"""
try:
result = attack_func(*args, **kwargs)
return result
except Exception as e:
print(f"攻击过程中出错: {e}")
return None
# 使用示例
result = safe_attack(RSAAttacks.small_e_attack, c, n, e)- 合法使用: 仅用于学习和合法的CTF比赛
- 参数验证: 确保输入的参数格式正确
- 网络需求: 某些攻击需要网络连接(如在线分解)
- 计算时间: 某些攻击可能需要较长时间
- 成功率: 不是所有攻击都能成功,需要满足特定条件
A: 可能的原因:
- RSA参数不满足攻击条件
- 输入参数有误
- 网络连接问题(在线攻击)
- 计算复杂度过高
A: 建议:
- 先分析RSA参数的特点
- 根据特点选择合适的攻击方法
- 尝试多种攻击方法
- 检查参数输入是否正确
A: 支持的格式:
- 整数 (int)
- 十六进制字符串 (hex)
- Base64编码
- PEM格式密钥
🎯 记住:RSA攻击的艺术在于选择正确的攻击方法!