Project Euler 182.yyt

Project Euler 182.yyt

暑假作业解题记录:第182题,RSA加密

  • 数论知识基础
  • python

目录

  • Project Euler 182.yyt
      • 目录
      • 数论基础和RSA加密
      • 代码

数论基础和RSA加密

RSA加密基于以下流程:
生成两个不同的素数p和q,计算n=pq以及 φ=(p1)(q1) φ = ( p − 1 ) ( q − 1 ) 。 找到整数e,满足 1<e<φ 1 < e < φ ,且 gcd(e,φ)=1 g c d ( e , φ ) = 1 。 RSA系统能加密的信息是区间[0,n-1]中的整数。因此,需要加密的文本首先需要转换成可加密的信息(即区间[0,n-1]内的某个整数)。
加密文本时,如果文本转换成的信息是m,则加密为 c=memodn c = m e m o d n 。解密文本时,需要以下流程: 计算d满足 ed=1modφ e d = 1 m o d φ , 如果加密的信息是c,则解密为 m=cdmodn m = c d m o d n 。 因此需要减少例如:m 使得 memodn=m m e m o d n = m 这样的未加密信息。

  • 整理上述试子可得: me11modn m e − 1 ≡ 1 m o d n ( 一 ) , 因为n=pq,且p和q为素数,有: me11modp m e − 1 ≡ 1 m o d p ( 二 ) , me11modq m e − 1 ≡ 1 m o d q ( 三 )
  • 根据书上定理可知:上述二试三试分别有(e-1,p-1),(e-1,q-1)个解,因此一试有 e1,p1+1(e1,q1)+1 ( ( e − 1 , p − 1 ) + 1 ) ∗ ( ( e − 1 , q − 1 ) + 1 ) 个解(加上0解)。所以只需求 e1,p1+1(e1,q1)+1 ( ( e − 1 , p − 1 ) + 1 ) ∗ ( ( e − 1 , q − 1 ) + 1 ) 的最小值所对应的e相加即可。

代码

import gmpy2
p=1009
q=3643
fi=(p-1)*(q-1)
n=p*q
e=2
x=[]
#print n
while e>1 and eif gmpy2.gcd(e, fi)==1:
        b=(gmpy2.gcd(e-1, p-1)+1)*(gmpy2.gcd(e-1, q-1)+1)
        if b==9:
            print e
            x.append(e)        


    e=e+1
print sum(x)

你可能感兴趣的:(密码学)