Skip to content

RSA

RSA 是非对称加密算法。公钥加密,私钥解密。

五个核心变量

  1. \(p,q\) :两个非常大的质数 -- 随机生成,为私密信息;
  2. \(n\) :模数,\(n = p \times q\) ,是公钥的一部分,也是密文计算的基准;
  3. \(\phi(n)\) :欧拉函数。\(\phi(n) = (p-1)\times(q-1)\) ,是计算私钥的关键中间值;
  4. \(e\) :公钥指数(通常是 65537,即 0x10001)
  5. \(d\) :私钥指数,是解密的唯一要是。

加密与解密公式

  • 加密(公钥):
\[ c = m^e\quad(mod n) \]

(明文 \(m\) 的 \(e\) 次幂对模数取模,得到密文)

  • 解密(私钥):
\[ m = c^d\quad(mod n) \]

(密文的 \(d\) 次幂对模数取模,还原明文 \(m\) )

  • 一般 RSA 题目的本质:给出 \(n\) 和 \(e\) ,想办法分解出 \(p\) 和 \(q\) ,从而算出 \(d\) 。
from Crypto.Util.number import long_to_bytes, inverse

# 假设通过某种攻击(如 yafu, factordb)拿到了 p 和 q
p = 123...
q = 456...
e = 65537 # 或者题目给的 e
c = 789... # 题目给的密文

# 1. 计算 n
n = p * q

# 2. 计算欧拉函数 phi
phi = (p - 1) * (q - 1)

# 3. 计算私钥 d (核心步骤)
# d 是 e 模 phi 的乘法逆元
d = inverse(e, phi)
# 或者用 gmpy2.invert(e, phi),或者 python3.8+ 的 pow(e, -1, phi)

# 4. 解密 (标准公式)
m_int = pow(c, d, n)

# 5. 转成字符串
flag = long_to_bytes(m_int)
print(flag)
  • 先看 \(e\):

    • 如果 \(e=3\) 且 \(n\) 很大:直接开方攻击(你刚才用的脚本)。

    • 如果 \(e=65537\) (常态):进入第 2 步。

  • 看 \(n\):

    • 如果 \(n\) 比较短(比如 256 bit):用工具(yafu, factordb.com)暴力分解 \(n\) 得到 \(p, q\)。

    • 拿到 \(p, q\) 后:使用 标准解密脚本 计算 \(d\) 并解密。