版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
简介
最初的公钥方案RSA是1997年由Ron Rivest、Adi Shamir和Leonard Adleman在MIT开发,称为现在最广泛接受的公钥加密方法。RSA是分组加密,对于某个自然数n,它的明文和密文是
之间的某个整数。
对于明文分组P和密文分组C,RSA的加密和解密形式如下:
要求
发送方和接收方都必须知道 和 的值,并且只有接收方知道 的值。RSA的公钥 ,私钥 。为了该算法能够满足公钥加密要求,必须满足下列条件:
- 可以找到 的值,使得对所有的 成立;
- 对所有满足 的值,计算 和 相对容易;
- 给定 和 ,不可能推导出 。
前两个要求很容易满足,当 和 取很大的值时,第三个要求也能够满足。
算法
RSA的算法过程具体如下:
- 选择两个很大的素数 ,计算他们的乘积 作为加密和解密的模;
- 计算 的欧拉函数值 ,表示小于 并且与 互素的正整数的个数;
- 选择整数 并且 与 互素,即 ;
- 计算
,它是
关于模
的乘法逆元,即
,
则 。
Python实现
已知 ,即已知公钥私钥,求加解密的结果
'''
example:e=5 d=77 n=221
limit:what you encode or decode needs to be smaller than 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
'''某一轮输入输出样例
please input e,d,n:
5 77 221
PK=(5,221)
SK=(77,221)
input 1 or 2:
1.Encode
2.Decode
1
please input your message(integer):
54
C = 175
input 1 or 2:
1.Encode
2.Decode
2
please input your message(integer):
175
P = 54
可以看到54加密为175,175解密为54,算法验证正确
'''
破解
存在两种可能攻击RSA的方法:
- 穷举
尝试所有的私钥,所以 和 的值越大,算法越安全,但是密钥太长会导致计算量太大。 - 因式分解
通过因式分解 为两个素质,但是当 和 很大时,因式分解问题十分困难,目前一般采用1024,2048或4096比特的密钥,如此长度的密钥对于当今所有应用可以认为强度足够。