0x01 RSA简介
那么,有无可能在已知n和e的情况下,推导出d?
首先要知道
(1)ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。
(2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。
(3)n=pq。只有将n因数分解,才能算出p和q。
结论:如果n可以被因数分解,d就可以算出,也就意味着私钥被破解。
0x02 常见的RSA攻击方法
0x1 共模攻击
共模攻击,也称同模攻击,英文原名是 Common Modulus Attack 。
同模攻击利用的大前提就是,RSA体系在生成密钥的过程中使用了相同的模数n。
假设COMPANY用所有公钥加密了同一条信息M,也就是
c1 = m^e1%n
c2 = m^e2%n
此时员工A拥有密钥d1他可以通过
m = c1^d1%n
解密得到消息m
同时员工B拥有密钥d2
他可以通过
m = c2^d2%n
解密得到消息m如果,此时有一个攻击者,同时监听了A和B接收到的密文C1,C2,因为模数不变,以及所有公钥都是公开的,那么利用同模攻击,他就可以在不知道d1,d2的情况下解密得到消息m。
贴出破解脚本:
#coding=utf-8
import sys;
sys.setrecursionlimit(100000);
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
raise Exception(