共模攻击
rsa中的共模攻击
介绍
共模攻击是指在不分解d的情况下依旧可以求出m的一种算法,常见给出了c1,c2:
1 | c1 = pow(m , e1 , N) |
要求gcd(e1 , e2)=1,即e1,e2互质,那么则有:
1 | e1*s1 + e2*s2 = 1 |
可以有:m = ( c1^s1 * c2^s2) % N,下面给出证明:
1 | (c1^s1 * c2^s2) % N = ( ((m^e1)%N) ^ s1 * (((m^e2)%N) ^ s2) |
注意
假定s2为负数,并不是对c2开根号,而是求c2的逆元
,交给pow函数即可
例题
1 | from Crypto.Util.number import getPrime, inverse, long_to_bytes, bytes_to_long |
题解
- e1 和 e2 明显互质,可以用共模攻击,先求出s1和s2,随便选取一个即可,然后直接求出m即可:
1 | from Crypto.Util.number import inverse, long_to_bytes |
特例-gcd(e1,e2) != 1
- 上述说了,共模攻击是要求e1和e2互质,即(e1,e2)=1,才有
e1*s1+e2*s2=1
,才可以继续进行后续的操作 - 但是若(e1,e2)!=1,而有
(e1,e2)=e
呢?此时是有e1*s1+e2*s2=e
的,按照上述的推理,我们得到的应该是
1 | (c1^s1 * c2^s2) % N = (m ^ e)%N |
分两种情况:
1: m^e < N:
那么此时直接开e次根即可
2: m^e > N:
此时直接开根答案并不对
1 | M = (c1^s1 * c2^s2) % N = (m ^ e)%N |
例题
1 | e1*e2= 59653 |
EXP
- 直接上题解
1 | from Crypto.Util.number import inverse, long_to_bytes |
- 下面对exp解释:
- 先找到合适的e1,e2,以及对应的M
gmpy2.gcdext(e1,e2)
:
返回一个包含三个值的元组
s[0]->gcd(e1,e2),s[1]->s1, s[2] -> s2 (e1s1 + e2s2 ==gcd(e1,e2))
gmpy2.invert(c, n)
计算c关于模m的逆元
2.c(M)带入爆破,此时满足 mk = c + n * k
gmpy2.iroot
用于计算整数
x
的k
次根。它返回一个元组(root, is_exact)
,其中:
- root:
x
的k
次根的整数部分。- is_exact:一个布尔值,指示
root
是否是x
的确切k
次根
3.判断爆破出来的是否包含flag即可
- 标题: 共模攻击
- 作者: D0wnBe@t
- 创建于 : 2024-10-16 19:13:19
- 更新于 : 2024-10-20 13:43:10
- 链接: http://downbeat.top/2024/10/16/共模攻击/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论