RSA大礼包_wp
frame0,4
Common Modulus Attack
前提条件
模数一样,待加密的明文一样,公钥互素
- Alice: $(n_1,e_1,m_1)$, Bob: $(n_2,e_2,m_2)$
- $n_1 = n_2$
- $m_1 = m_2$
- $gcd(e_1,e_2) = 1$
攻击原理
$$
存在 (s,t) \quad s.t.\ e_1s+e_2t=gcd(e_1,e_2)=1 \\
c_1^s \cdot c_2^t \equiv (m^{e_1})^s \cdot (m^{e_2})^t \equiv m^{e_1s+e_2t} \equiv m \pmod n
$$
exp
1 | from Crypto.Util.number import inverse |
结果
1 | b'\x98vT2\x10\xab\xcd\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00My secre' |
frame1,18
模不互素攻击
前提条件
- $gcd(n1,n2)!=1$
- $n_1 \neq n_2$
攻击原理
$$
最大公因数获取其中一个大素数: p = gcd(n1,n2) \\
n除p获取另一个大素数: q_i = n_i \div p \quad (i=1 \ or \ 2) \\
phi_i(n) = (q_i-1)(p-1) \\
d_i = inverse(e_i,n_i) \\
m_i \equiv c_i^{d_i} \pmod n_i
$$
结果
1 | b'\x98vT2\x10\xab\xcd\xef\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00. Imagin' |
frame10
Fermat’s factorization method
前置
$$
\because \forall 奇数n = ab = x^2-y^2 \\
\therefore n = ab = (x+y)(x-y) \\
$$
$$
a = x+y \\
b = x-y
$$
算法
$$
y^2 = x^2 - n >= 0 \\
\therefore x^2>=n ,即: x>=\sqrt n\\
\therefore 可以从x = \sqrt n 开始,计算x^2-n为完全平方数即可求出x,y \\
然后求得a,b
$$
exp
1 | from gmpy2 import iroot |
结果
1 | 10 |
frame2,9,16
Pollard’s p-1 algorithm
前置
费马小定理: 若$p$是素数,且$p \nmid a$, 则$a^{p-1} \equiv 1 \pmod p$
B-Smooth数: 如果一个整数的所有素因子都不大于B,则称该整数为B-Smooth数
原理
条件
- 设大整数的一个因子是p, p-1需要是B-Smooth的
$$
设p-1是B-Smooth的,即p-1 = p_1 p_2\cdots p_n \ (\forall 1 \leq i \leq n,p_i \leq B) \\
若p_i两两不同,则p_1 p_2\cdots p_n \mid B! \\
即 (p-1) \mid B! , B! = k(p-1) \\
\therefore a^{B!} \equiv a^{k(p-1)} \equiv 1 \pmod p \\
$$
分解过程
$$
假设n = pq\\
计算gcd = gcd(a^{B!}-1,n) \\
如果 0 < gcd < n, 则gcd为n的一个因子
$$
算法
设置$ a = 2$(或者其他方便的数字)
循环$j = 2,3,\cdots B$
若$p_1,p_2,\cdots,p_n$这些素数是随机在小s于B的数中选的,那么最大的素数大概率要大于0.8B
因此在$j<0.8B$之前不计算gcd,可以节省时间
- 令$a \equiv a^j \pmod n$
- 计算$d = gcd(a-1,n)$
- 如果$1<d<n$, 则返回$d$
exp
优化前
1 | from Crypto.Util.number import GCD |
优化后
1 | from Crypto.Util.number import GCD |
结果
1 | 2 |
frame3,8,12,16,20
Broadcast Attack
前提条件
e很小
大于e个人,使用相同的e对同一m进行加密,否则无法正确解密
$$
\because m<n \\
\therefore m^e<N = n_1\cdot n_2 \cdots \cdot n_e \\
$$
攻击原理
选取了相同的加密指数 e(这里取 e=3),对相同的明文 m 进行了加密并进行了消息的传递,那么有:
$$
c_1 \equiv m^3 \pmod {n_1} \\
c_2 \equiv m^3 \pmod {n_2} \\
c_3 \equiv m^3 \pmod {n_3} \\
$$
对上述等式运用中国剩余定理,在 e=3 时,可以得到:
$$
N = n_1\cdot n_2\cdot n_3 \\
c_x \equiv m^3 \pmod N
$$
通过对 $c_x$ 进行三次开方就可以求得明文
结果
1 | b'\x98vT2\x10\xab\xcd\xef\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t is a f' |
frame7,11,15
Known High Bits Message Attack
前提条件
- 已知明文 $m$ 的高位,记为 $m_0$
- $e$比较小
原理
$$
\because c \equiv (m_0+x)^e \pmod n \\
set \ f(x) = (m+x)^e - c \\
\therefore 存在 x , \ s.t. f(x) = k\cdot n (k = 0,1,2,…)
$$
求解出x后,依据coppersmith定理,可以求出剩下的所有明文部分
exp
在本地的sage环境下运行
or
1 | n = 155266493936043103849855199987896813716831986416707080645036022909153373110367007140301635144950634879983289720164117794783088845393686109145443728632527874768524615377182297125716276153800765906014206797548230661764274997562670900115383324605843933035314110752560290540848152237316752573471110899212429555149 |
结果
1 | - 7 |
frame0-5,7-18,20
原理
线性同余方程为 $lcg[i]=(a*lcg[i-1]+b)%m$
过程
16bit为一组
1 | # 使用f1的p作为例子 |
1 | 512 |
计算a,b
1 | # calculate the a,b |
验证a,b是否正确
1 | # verify the a,b |
1 | 35550 init 65157 True 58272 True 35615 True 23346 True 1609 True 62996 True 55939 True 36038 True 46669 True 60360 True 11303 True 62362 True 21137 True 47292 True 25611 True 41902 True 24341 True 37104 True 42543 True 61698 True 40921 True 59492 True 22163 True 28566 True 6365 True 29464 True 6455 True 62314 True 3617 True 9484 True 53787 True |
exp
1 | def crack_PRG(n): |