今天无意中看到一个详解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。然后要用到欧拉函数,它的值为小于等于n的正整数中与n互质的数的个数,两个数互质即它们只有一个公约数1。
接下来要用到两个性质,,p为质数。这是显而易见的,因为质数的定义就是如此。还有
,p,q互质,原因是由于欧拉函数为积性函数,这里涉及到数论的内容不细说。所以pq乘积的欧拉函数就是他们各自减一再相乘,即为288。
有了欧拉函数,我们还需要一个整数e和d,e的大小小于且与
互质,d满足(e*d)mod
=1。此时整数n,e相当与公钥,n,d相当于私钥。
加密过程为,解密过程为
当p,q极大时,将它们的乘积拆分成p,q极为困难,因此我们难以求出的值,因此也无法根据余数方程出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)