RSA 素数对称式泄露
原理
RSA 加密需要两个大数,p 和 q(这两个都是质数)
把 p 和 q 乘起来,得到 n(也就是 n = p * q),n 是公开的
如果要解密,就必须把 n 拆回 p 和 q。正常情况下,这几乎不可能做到,因为 p 和 q 太大了
但如果生成 p 和 q 时偷了懒,让它们之间存在某种 “对称” 关系,攻击者就能利用这个关系轻松地把 n 分解开
实战案例
EasyRSA(素数对称式泄露)

题目给出条件
1 | z = Fraction(1, Derivative(arctan(p), p)) - Fraction(1, Derivative(arth(q), q)) |
Derivative(arctan(p), p):求反正切函数对p的导数我们知道
d(arctan(p))/dp = 1 / (1 + p²)Fraction(1, ...):用 1 除以这个导数所以第一项变成:
1 / (1/(1+p²)) = 1 + p²第二项:
Derivative(arth(q), q),其中arth是反双曲正切函数它的导数是
d(arth(q))/dq = 1 / (1 - q²)再用 1 除以它,得到:
1 / (1/(1-q²)) = 1 - q²最后相减:
z = (1 + p²) - (1 - q²) = p² + q²
所以这行代码实际计算的是 z = p² + q²,又因为 n = pq
利用完全平方公式
1 | (p + q) ^ 2 = p ^ 2 + 2pq + q ^ 2 |
因此


令:
1 | s = p + q = sqrt(z + 2n) |
假设 p > q,则

1 | from math import isqrt |