RSA公钥加密算法

简介

最初的公钥方案RSA是1997年由Ron Rivest、Adi Shamir和Leonard Adleman在MIT开发,称为现在最广泛接受的公钥加密方法。RSA是分组加密,对于某个自然数n,它的明文和密文是 0 ∼ n − 1 0 \sim n - 1 0n1之间的某个整数。
对于明文分组P和密文分组C,RSA的加密和解密形式如下:
C = P e   m o d   n C = P^e\bmod n C=Pemodn
P = C d   m o d   n = ( P e ) d   m o d   n = P e d   m o d   n P = C^d\bmod n=(P^e)^d\bmod n=P^{ed}\bmod n P=Cdmodn=(Pe)dmodn=Pedmodn

要求

发送方和接收方都必须知道 n n n e e e的值,并且只有接收方知道 d d d的值。RSA的公钥 P K = ( e , n ) PK=(e,n) PK=(e,n),私钥 S K = ( d , n ) SK=(d,n) SK=(d,n)。为了该算法能够满足公钥加密要求,必须满足下列条件:

  1. 可以找到 e , d , n e,d,n e,d,n的值,使得对所有的 M < n , M e d = M   m o d   n M<n,M^{ed}=M\bmod n M<n,Med=Mmodn成立;
  2. 对所有满足 M < n M<n M<n的值,计算 M e M^e Me C d C^d Cd相对容易;
  3. 给定 e e e n n n,不可能推导出 d d d

前两个要求很容易满足,当 e e e n n n取很大的值时,第三个要求也能够满足。

算法

RSA的算法过程具体如下:

  1. 选择两个很大的素数 p 和 q p和q pq,计算他们的乘积 n n n作为加密和解密的模;
  2. 计算 n n n的欧拉函数值 ϕ ( n ) = ( p − 1 ) ( q − 1 ) \phi (n) = (p - 1)(q - 1) ϕ(n)=(p1)(q1),表示小于 n n n并且与 n n n互素的正整数的个数;
  3. 选择整数 e , e < n e,e<n e,e<n并且 e e e ϕ ( n ) \phi(n) ϕ(n)互素,即 g c d ( e , ϕ ( n ) ) = 1 gcd(e,\phi(n))=1 gcd(e,ϕ(n))=1
  4. 计算 d d d,它是 e e e关于模 ϕ ( n ) \phi(n) ϕ(n)的乘法逆元,即 d e   m o d   ϕ ( n ) = 1 de\bmod \phi(n)=1 demodϕ(n)=1
    d e = k ϕ ( n ) + 1 ( k ∈ Z + ) de=k\phi(n)+1(k\in Z^+) de=kϕ(n)+1(kZ+)

Python实现

已知 e , d , n e,d,n e,d,n,即已知公钥私钥,求加解密的结果

s=input('please input e,d,n:\n')
num=s.split(' ')
e=int(num[0])
d=int(num[1])
n=int(num[2])
print('PK=(%d,%d)\nSK=(%d,%d)\n'%(e,n,d,n))
while True:
    try:
        choice=input('input 1 or 2:\n1.Encode\n2.Decode\n')
        code=int(input('please input your message(integer):\n'))
        if choice=='1':
            print('C =',(code**e)%n)
        else:
            print('P =',(code**d)%n)
    except IOError:
        break

输入输出样例

输入 5 , 22 , 771 5,22,771 5,22,771之后的信息如下:

please input e,d,n:
5 77 221
PK=(5,221)
SK=(77,221)
input 1 or 2:
1.Encode
2.Decode

输入1加密54得到175

1
please input your message(integer):
54
C = 175

输入2解密175得到54

2
please input your message(integer):
175
P = 54

可以看到54加密为175,175解密为54,算法验证正确

破解

存在两种可能攻击RSA的方法:

  • 穷举

尝试所有的私钥,所以 e e e d d d的值越大,算法越安全,但是密钥太长会导致计算量太大。

  • 因式分解

通过因式分解 n n n为两个素质,但是当 p p p q q q很大时,因式分解问题十分困难,目前一般采用1024,2048或4096比特的密钥,如此长度的密钥对于当今所有应用可以认为强度足够。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cout0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值