RSA加密算法学习过程

今天无意中看到一个详解RSA算法的视频,还算看得明白,便把学习过程记录和分享一下

来自【软件科普】如何保证发出去的微信和QQ消息不被篡改?详解RSA加密算法_哔哩哔哩_bilibili

常见对称式加密

首先请来加密界的两位大神,Alice和Bob。假设Alice要发送一段密文“hello World”给Bob,她要怎么做?

最常见的一种方案是将每一位字母在字母表中的位置向右移一位,即变成“ifmmp xpsme”,当Bob需要解密时,仅需将每位字母向前移一位即可得出结果。当然也不必须是移位加密,这种加密方式甚至可以直接观察得出结果。但无论如何,双方要提前见面并制定好一套加密规则,也就是这次加密的“密钥”。

非对称式加密缺点很多。比如由于加密的双方使用的是同一份密钥,那么就无法使用数字签名来判断发送方的身份。又比如企业的加密信息,如果全部使用一样的密钥,只要一个员工因为蝇头小利将密钥泄露,那么整个公司都会遭受损失。

这种情况下,我们的主角RSA算法应运而生。

非对称加密与RSA算法

可以将非对称式加密比作一个信箱,每个人都可以向其中投入信件。但只有信箱的主人才有资格将信件全部取出。在非对称加密值中,每个人都持有一个公钥和私钥。公钥是公开的,可以比作是信箱的地址,将信件放入则意味着用公钥加密信息,当接受方接到密文并用私钥解密时则意味着将信件取出。显然,被公钥加密的信息应该极难由公钥反向推导出密文,而只能由私钥解密,这就是非对称式加密。

那么,RSA具体是怎么实现的呢?

首先是生成密钥,需要两个大质数p和q。这里为了从简取p=17,q=19,p*q=323。然后要用到欧拉函数\varphi (n),它的值为小于等于n的正整数中与n互质的数的个数,两个数互质即它们只有一个公约数1。

接下来要用到两个性质,\varphi (p)=p-1,p为质数。这是显而易见的,因为质数的定义就是如此。还有\varphi (pq)=\varphi (p)*\varphi (q),p,q互质,原因是由于欧拉函数为积性函数,这里涉及到数论的内容不细说。所以pq乘积的欧拉函数就是他们各自减一再相乘,即为288。

有了欧拉函数,我们还需要一个整数e和d,e的大小小于\varphi (n)且与\varphi (n)互质,d满足(e*d)mod\varphi (n)=1。此时整数n,e相当与公钥,n,d相当于私钥。

加密过程为\frac{origin^{e}}{n}=encryption,解密过程为\frac{encryption^{d}}{n}=origin

当p,q极大时,将它们的乘积拆分成p,q极为困难,因此我们难以求出\varphi (n)的值,因此也无法根据余数方程出d。因此RSA是安全的。

在使用时,我们只需将密文转换为Unicode编码再带入加密公式中即可加密数据。

代码实现(Python)

来自python实现RSA算法-Python教程-PHP中文网

#实现公钥加密 RSA

 

import rsa

import time

#计算下时间

 

start_time = time.time()

key = rsa.newkeys(1024) #数字代表 p * q 产生的存储空间 bit 大小, 也就是密文长度,数字越大,时间越长

privateKey = key[1]

publicKey = key[0]

#print(privateKey)

#print(publicKey)

end_time = time.time()

print("make a key:", end_time - start_time)

#产生公钥和私钥

 

message = 'Taiyuan is the best city of China.'

message = message.encode()

 

cryptedMessage = rsa.encrypt(message, publicKey)

print("crypted:", cryptedMessage)

print("length of cryptedMessage:", len(cryptedMessage))

# 加密的过程

 

decrypetdMessage = rsa.decrypt(cryptedMessage, privateKey)

print("decrypet:", decrypetdMessage)

# 解密的过程

 

now_time = time.time()

print("crypt and decrypt:", now_time - end_time)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值