# RSA算法
## 前言
网络世界中,发送的许多消息都是经过[加密](https://xcao.top/tags/加密)的。[加密](https://xcao.top/tags/加密)方式主要分为对称加密和非对称加密。然而对称加密不仅需要传输密文,还需要传输秘钥。如果秘钥在传输过程中遭到泄露,那么别人就可以知道你发送了什么。所以,非对称性加密几乎成了现在的主流。而[RSA](https://xcao.top/tags/rsa)[算法](https://xcao.top/tags/算法)就是现在非对称加密的主流[算法](https://xcao.top/tags/算法)之一。注意:base64之类的只是对字符进行编码,不能属于加密。
## RSA算法的实现
首先,我们随机找来两个质数p和q,在实际运用中,这两个质数大小都是1024比特(比特可以参考上一篇文章https://xcao.top/post-214.html)接着,我们可以求出n,n=pq,然后,我们需要计算n的欧拉函数即φ(n),这里 φ(n) 为(p-1)(q-1)。接着,需要找到公钥e,e的取值1<e< φ(n) e需要为正整数且e与 φ(n) 互质。接着还需要找到一个私钥d,d要求为正整数且ed除以 φ(n) 余数为1。
找到上述这些数字之后,我们就可以发送加密数据了。首先,需要接收方完成上述步骤,将公钥e,两质数积n传递给发送方。发送方收到这些数据后,便需要将发送的明文m进行一个运算。计算m的e次方,然后算出这个数与n的余数,将余数传递给接收方,这个算出来的数就是密文c。而接收方只需要一个简单的运算,算出密文c与的私钥d次方,算出这个数与n的余数。从数学定理上可以证明(具体的证明过程可以百度搜索,这里就不赘述了),算出来的这个余数一定等于明文m。这样就完成了一次安全的数据交换。为了更好的演示,我写了两个小程序去模拟RSA的信息传递过程。
```
#RSA算法接收方程序,by小草 https://xcao.top/?p=222
import random
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
def coprime(a, b):
return gcd(a, b) == 1
# 两个函数作用均为判断两数是否互质
p = 0
q = 0
while p == q:
p = random.choice([2, 3, 5, 7, 11, 13, 17, 19])
q = random.choice([2, 3, 5, 7, 11, 13, 17, 19])
n = p * q
n1 = (p - 1) * (q - 1) #φ(n)不方便打,以n1代替
# 随机取p和q(此处只取20以内的质数方便计算,并计算出n以及φ(n)
while True:
e = random.randint(1, n1)
if coprime(e, n1):
break
for i in range(1, 10000):
d = (i * n1 + 1) / e
if e*d > n1:
if d % 1 == 0:
d = int(d)
break
print('公钥是',e)
print('两质数积为',n)
# 计算出公钥以及私钥
c = int(input('请输入密文\n'))
m = pow(c,d)
m = m % n
print('明文是',m)
#RSA算法发送方程序,by小草 https://xcao.top/?p=222
e = int(input('请输入公钥\n'))
n=int(input('请输入两质数积\n'))
m = int(input('请输入明文\n'))
c = pow(m,e)
c = c % n
print('密文是',c)
```
## RSA算法安全性
那么,RSA算法是否安全呢。首先,在这里需要交换的数据有公钥e,密文m以及两质数之和n。而解密需要密文m,两质数之和n以及私钥d。那么我们能不能去计算出私钥d呢?从上边的实现过程可以发现,想要知道私钥d,就需要知道 φ(n) 想要知道 φ(n) 就需要知道p和q,也就是说,只要有人有能力去把两质数之和n给质因数分解,那么我们就有办法去破解RSA。但实际应用中RSA的两个质数是长度为1024的二进制数,以目前[技术](https://xcao.top/tags/技术)几乎无法破解。但随着量子计算机发展,有朝一日人们可能是有办法去分解的。但我们也相信,到了那个时候,一定也会有更先进的[技术](https://xcao.top/tags/技术)去进行加密。综上所述,目前人们是几乎无法破解RSA的,使用RSA算法加密的数据基本是安全的。

shejizuopin
- 粉丝: 1w+
- 资源: 1306
最新资源
- (源码)基于ESPIDF框架的阿里云物联网(IoT)LinkSDK示例项目.zip
- (源码)基于C语言的JPEG解码器.zip
- (源码)基于AVR微控制器的Modbus从站温度监测系统.zip
- (源码)基于STM32F103微控制器的USART通信示例项目.zip
- (源码)基于ESP32微控制器的自主避障遥控车.zip
- (源码)基于Arduino和Processing的天线追踪系统.zip
- (源码)基于C++的简单打飞机游戏.zip
- (源码)基于React框架的Search导航页Next版.zip
- [AB PLC例程源码][MMS_050801]SE Equipment Status Summary Faceplate for PowerFlex, Kinetix, E3 Plus,.zip
- [AB PLC例程源码][MMS_050800]SE Faceplates-AOIs for E3 Plus Overload Relays on DeviceNet.zip
- [AB PLC例程源码][MMS_050593]ME Faceplates for 1769 Digital and Analog I-O -Chinese V5V16.zip
- [AB PLC例程源码][MMS_050805]Ultra 3000 SERCOS Error Code Capture and History.zip
- [AB PLC例程源码][MMS_051276]DeviceNet Node Commissioning Application for Logix.zip
- [AB PLC例程源码][MMS_051271]SMS messaging with Micrologix.zip
- [AB PLC例程源码][MMS_051325]Elasped Time Add-on Instruction.zip
- [AB PLC例程源码][MMS_051450]PVc600 PID Faceplates.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


