0x00 背景
在今年的5space比赛中做到一道比较简单的RSA题。由于没怎么接触过crypto的题目(别的题都好难,做不出来呀233),在这里写一下解法,顺便记录一下有关RSA共模攻击的知识。
那么什么是共模攻击呢,大致就是我们可以获取到同一个明文m的经过两个公钥e1,e2加密的密文c1,c2,并且有c1=pow(m,e1,n);c2=pow(m,e2,n)
那么,若e1,e2互素,由扩展欧几里得算法,存在e1*s1+e2*s2==1。我们就可以求m≡m^(e1*s1+e2*s2)≡(m^e1)^s1*(m^e2)^s2≡c1^s1*c2^s2 mod n
。其中c1,c2已知,s1,s2可由欧几里得算法求出。
看一下python2的求解代码:
在linux系统下安装gmpy2库我是参考这个博文的:
gmpy2安装使用方法
import libnum
import gmpy2
def common_modulus(n, c1, c2, e1, e2):
assert(libnum.gcd(e1, e2))
_, s1, s2 = gmpy2.gcdext(e1, e2)#扩展欧几里得算法
#若s1<0,则c1^s1==(c1^-1)^(-s1),其中c1^-1为c1模n的逆元。
if s1 < 0:
s1 = -s1
c1 = gmpy2.invert(c1, n)
if s2 < 0:
s2 = -s2
c2 = gmpy2.invert(c2, n)
return pow(c1, s1, n)*pow(c2, s2, n)%n
0x01 具体题目rosb
加密脚本如下:
from