公钥密码学RSA入门

发布时间 2023-04-27 21:07:35作者: Athena-ydy

RSA算法的具体描述如下:

  1. 任意选取两个不同的大素数p和q,n=pq,根据欧拉函数(小于n且与n互素的正整数的个数)得:φ(n)=φ(pq)=φ(p)φ(q)=(p-1)(q-1)
  2. 任意取一个大整数e,满足gcd(e,φ(n))=1,整数e用作密钥
  3. 确定解密钥d,满足(de)modφ(n)=1,即de=kφ(n)+1,k≥1是一个任意的整数。所以,若知道e和φ(n),很容易计算出d
  4. 公开整数n和e,秘密保存d
  5. 将明文m(m<n是一个整数)加密成密文c,加密算法为:c=E(m)=memodn
  6. 将密文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)