RSA算法的具体描述如下:
- 任意选取两个不同的大素数p和q,n=pq,根据欧拉函数(小于n且与n互素的正整数的个数)得:φ(n)=φ(pq)=φ(p)φ(q)=(p-1)(q-1)
- 任意取一个大整数e,满足gcd(e,φ(n))=1,整数e用作密钥
- 确定解密钥d,满足(de)modφ(n)=1,即de=kφ(n)+1,k≥1是一个任意的整数。所以,若知道e和φ(n),很容易计算出d
- 公开整数n和e,秘密保存d
- 将明文m(m<n是一个整数)加密成密文c,加密算法为:c=E(m)=memodn
- 将密文c解密成明文m,解密算法为:m=D(c)=cdmodn
然而,只根据n和e(注意:不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户才可对密文解密。
例题:攻防世界_easy_rsa
根据如上原理,写了以下脚本:
import gmpy2
p = 473398607161
q = 4511491
e = 17
N = (p-1)*(q-1)
k = 1
while 1:
de = k*N+1
if de%e==0:
print(de//e)
break
else:
k+=1
continue
后来知可以用gmpy2库中的函数invert(),直接求,代码如下:
import gmpy2
p = 473398607161
q = 4511491
e = 17
N = (p-1)*(q-1)
d = gmpy2.invert(e,N)
print(d)
标签:公钥,gmpy2,de,RSA,整数,明文,解密,密码学 From: https://www.cnblogs.com/Athena-ydy/p/17360211.html