问题
分析
题目告诉我们该加密算法是雷宾加密算法,通过查找了解到
加密过程:
- 随机选取两个足够大且两者的值接近的素数p,q
- N=p*q
- C=M2 %N(M为明文,C为密文)
解密过程:
第三个式子可以通过扩展欧几里得算法得到一组yp和yq,前两个式子直接算就行.
在得到了mp,mq,yp,yq之后,最终得到的明文有4个
因此往往还需要一个验证码来得到正确的明文.
decrypt
n=523798549
c=162853095
yz=110001
p=10663
q=49123#在线分解n得到p,q
import gmpy2
mp=gmpy2.powmod(c,(p+1)//4,n)
mq=gmpy2.powmod(c,(q+1)//4,n)
def exgcd(m, n, x, y):
if n == 0:
x = 1
y = 0
return (m, x, y)
a1 = b = 1
a = b1 = 0
c = m
d = n
q = int(c / d)
r = c % d
while r:
c = d
d = r
t = a1
a1 = a
a = t - q * a
t = b1
b1 = b
b = t - q * b
q = int(c / d)
r = c % d
x = a
y = b
return (d, x, y)
result=exgcd(p,q,0,0)
yp=result[1]
yq=result[2]
r=(yp*mq*p+yq*mp*q)%n
print(bin(r))
_r=n-r
print(bin(_r))
s=(yp*p*mq-yq*q*mp)%n
print(bin(s))
_s=n-s
print(bin(_s))
'''
'''
得到的结果是这样的:
结合题目告诉我们的验证码可以知道是第一条,把它截去后面的验证码部分,将前面的转换成10进制数然后通过md5加密就可以得到flag了