Skip to content

Latest commit

 

History

History
445 lines (346 loc) · 10.2 KB

File metadata and controls

445 lines (346 loc) · 10.2 KB

🔐 RSA攻击方法工具使用教程

📋 目录

  1. GUI界面使用
  2. 命令行使用
  3. 编程接口使用
  4. 各种攻击方法详解
  5. 实战案例

🖥️ GUI界面使用

启动GUI界面

# 方法1: 使用启动脚本 (推荐)
python run_gui.py

# 方法2: 直接运行
python src/gui/rsa_gui.py

# 方法3: 使用Mac应用程序
open "dist/RSA CTF Tools.app"

RSA攻击标签页使用

  1. 选择攻击方法

    • 在下拉框中选择要使用的攻击方法
    • 每种方法都有详细的说明和适用条件
  2. 输入参数

    • 模数n: RSA公钥中的模数
    • 公钥指数e: 通常是65537或3
    • 密文c: 要破解的密文
    • 其他参数: 根据攻击方法的需要
  3. 执行攻击

    • 点击"执行攻击"按钮开始
    • 或点击"运行演示"查看示例
  4. 查看结果

    • 攻击成功会显示解密的明文
    • 失败会显示错误信息和建议

💻 命令行使用

查看帮助信息

# 查看所有可用的攻击方法
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}")

🎯 各种攻击方法详解

1. 小指数攻击 (e=3)

适用场景: 当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()

2. Wiener攻击 (低私钥指数)

适用场景: 当私钥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()

3. 共模攻击

适用场景: 相同模数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()

4. 广播攻击 (Håstad攻击)

适用场景: 相同消息用相同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()

5. 费马分解攻击

适用场景: 两个质因数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()

📚 实战案例

CTF题目解题流程

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)

GUI操作步骤

  1. 启动应用程序

    python run_gui.py
  2. 选择"RSA攻击"标签页

  3. 输入参数:

    • 在"模数 n"框中输入: 3233
    • 在"公钥指数 e"框中输入: 17
    • 在"密文 c"框中输入: 2201
  4. 选择攻击方法:

    • 从下拉菜单选择适合的攻击方法
    • 建议先尝试"自动选择攻击方法"
  5. 执行攻击:

    • 点击"执行攻击"按钮
    • 等待结果显示

💡 使用技巧

1. 攻击方法选择指南

条件 推荐攻击方法 成功率
e = 3, 消息很小 小指数攻击 高
e 很大, n 较小 Wiener攻击 中
相同n, 不同e 共模攻击 高
相同e, 不同n 广播攻击 中
p和q接近 费马分解 高

2. 调试技巧

# 启用详细输出
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参数验证通过")

3. 错误处理

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)

⚠️ 注意事项

  1. 合法使用: 仅用于学习和合法的CTF比赛
  2. 参数验证: 确保输入的参数格式正确
  3. 网络需求: 某些攻击需要网络连接(如在线分解)
  4. 计算时间: 某些攻击可能需要较长时间
  5. 成功率: 不是所有攻击都能成功,需要满足特定条件

🆘 常见问题

Q: 为什么攻击失败了?

A: 可能的原因:

  • RSA参数不满足攻击条件
  • 输入参数有误
  • 网络连接问题(在线攻击)
  • 计算复杂度过高

Q: 如何提高攻击成功率?

A: 建议:

  • 先分析RSA参数的特点
  • 根据特点选择合适的攻击方法
  • 尝试多种攻击方法
  • 检查参数输入是否正确

Q: 支持哪些数据格式?

A: 支持的格式:

  • 整数 (int)
  • 十六进制字符串 (hex)
  • Base64编码
  • PEM格式密钥

🎯 记住:RSA攻击的艺术在于选择正确的攻击方法!