点击上方头像关注我,每周上午 09:00定时推送,每月不定期赠予技能书本。
本文2711字,阅读约需5分钟
Hi,大家好,我是CoCo。在之前的文章:Python实现各种加密,接口加解密不再难,先容了Base64、MD5、Sha1、Secret、RSA等几种加密办法,本日结合项目详细先容RSA加密。

一
RSA算法加密简介
01 先容
RSA加密算法是一种非对称加密算法,加密的秘钥是由公钥和私钥两部分组成秘钥对,公钥用来加密,私钥用来对进行解密,公钥是公开的,私钥则是用户自己保留的,由于公钥是公开的,那么任何人只要获取到公钥,都可以利用公钥来加密发送假造内容。
出于安全性考虑,在发送之前我们可以利用RSA来署名,署名利用私钥来进行署名,利用公钥来进行验签,通过署名我们可以确保用户身份的唯一性,从而提高安全性。
02 加密与署名的关系?
加密和署名都是为了安全性考虑,但略有不同。大略的说,加密是为了防止信息被透露,而署名是为了防止信息被修改。
(1) 加密
Task 1:Boss要给CoCo发送一条,分配保密的事情任务。
RSA的加密过程如下:
1.CoCo天生一对密钥(公钥和私钥),私钥不公开,CoCo自己保留。公钥为公开的,任何人可以获取。
2.CoCo通报自己的公钥给Boss,用CoCo的公钥对进行加密。
3.CoCo吸收到Boss加密的,利用CoCo自己的私钥对进行解密。
在这个过程中,只有2次通报过程,第一次是CoCo通报公钥给Boss,第二次是Boss加密给CoCo,纵然都被敌方截获,也没有危险性,由于只有CoCo的私钥才能对进行解密,防止了内容的透露。
(2) 署名
Task 2:CoCo收到Boss发的后,须要进行回答“收到”。
RSA署名的过程如下:
1.CoCo天生一对密钥(公钥和私钥),私钥不公开,CoCo自己保留。公钥为公开的,任何人可以获取。
2.CoCo用自己的私钥对加签,形成署名,并将加签的和本身一起通报给Boss。
3.Boss收到后,在获取CoCo的公钥进行验签,如果验签出来的内容与本身同等,证明是CoCo回答的。
在这个过程中,只有2次通报过程,第一次是CoCo通报加签的和本身给Boss,第二次是Boss获取CoCo的公钥,纵然都被敌方截获,也没有危险性,由于只有CoCo的私钥才能对进行署名,纵然知道了内容,也无法假造带署名的回答给Boss,防止了内容的修改。
综合两个场景会创造,第一个场景虽然被截获的没有透露,但是可以利用截获的公钥,将假指令进行加密,然后通报给CoCo。第二个场景虽然截获的不能被修改,但是的内容可以利用公钥验签来得到,并不能防止透露。
以是在实际运用中,要根据情形利用,也可以同时利用加密和署名,比如CoCo和Boss都有一套自己的公钥和私钥,当CoCo要给Boss发送时,先用Boss的公钥对加密,再对加密的利用CoCo的私钥加署名,达到既不透露也不被修改,更能担保的安全性。
即:公钥加密、私钥解密、私钥署名、公钥验签。
二
Python实现RSA加解密
接下来我们利用 Python 来实现 RSA 加密与署名,利用的第三方库是Crypto。
01 天生密钥对创建RSA密钥,步骤如下:
1、从 Crypto.PublicKey 包中导入 RSA,创建一个密码;
2、天生1024/2048位的RSA 密钥;
3、调用 RSA 密钥实例的 exportKey 方法,传入密码、利用的 PKCS 标准以及加密方案这三个参数;
4、将私钥写入磁盘的文件;
5、利用方法链调用 publickey 和 exportKey 方法天生公钥,写入磁盘上的文件。
示例代码如下:
私钥如下:
公钥如下:
02 公钥加密和私钥解密(1) 公钥加密
结果如下所示:
luLmeQPdOIgDLDmCvuIK4QmQg6QXxDhvQ1igNVgURfjij/lNC7bqbWznELaGWy3ZnYWvyJoy2YY8RbjVaYSqwL37/Eta9tR+0/RCcMWK1iXOInAxwHiukvHy3itWhYbu2lQcSljBjoF3/IEEGnh7+MF3MoECIlGVlBR9s6jg5ZU=
(2) 私钥解密
import base64from Crypto.PublicKey import RSAfrom Crypto.Cipher import PKCS1_v1_5def decrypt(en_data): ''' en_data:加密过后的数据,传进来是一个字符串 ''' # base64解码 msg = base64.b64decode(en_data) # 获取私钥 privatekey = open('private.pem').read() rsakey = RSA.importKey(privatekey) # 进行解密 cipher = PKCS1_v1_5.new(rsakey) data= cipher.decrypt(msg, 'DecryptError') # 解密出来的是字节码格式,decode转换为字符串 return data.decode()if __name__ == '__main__': en_data="luLmeQPdOIgDLDmCvuIK4QmQg6QXxDhvQ1igNVgURfjij/lNC7bqbWznELaGWy3ZnYWvyJoy2YY8RbjVaYSqwL37/Eta9tR+0/RCcMWK1iXOInAxwHiukvHy3itWhYbu2lQcSljBjoF3/IEEGnh7+MF3MoECIlGVlBR9s6jg5ZU=" print(decrypt(en_data))
结果如下所示:
ITester软件测试小栈
03 私钥署名与公钥验签
(1) 私钥署名
结果如下所示:
Eb7mtvQGHCuzOR475TPRCR95Qg4GK1Nhbdw2je83JBxPfD0WiZ1Di/vXgQ8eH9fmh5z80epATF0IGT3Lm4DJTgHq+apuvhtjYNKv4wnz7c5seTuqWXTEjA6h/PomqW/yMC5/cbPr7w+aYEpV+2E+NKc/brUS1e6+pN4vHkaOXwM=
(2) 公钥验签
from Crypto.Hash import SHAfrom Crypto.Signature import PKCS1_v1_5 as Sig_pkfrom Crypto.PublicKey import RSAimport base64def verify(data,sign) -> bool: ''' :param msg: 明文数据,署名之前的数据 :param sign:吸收到的sign署名 :return: ''' # base64解码 data = base64.b64decode(sign) # 获取公钥 key = open('public.pem').read() rsakey = RSA.importKey(key) # 将署名之前的内容进行hash处理 sha_name = SHA.new(sign.encode("utf-8")) # 验证署名 signer = Sig_pk.new(rsakey) res= signer.verify(sha_name, sign) # 验证通过返回True 不通过返回False return resif __name__ == '__main__': # 署名之前的内容 data= "CoCo" # 署名数据 sign="X3Gg+wd7UDh4X8ra+PGCyZFUrG+6jDeQt6ajMA0EjwoDwxlddLzYoS4dtjQ2q5WCcRhxcp8fjEyoPXBmJE9rMKDjEIeE/VO0sskbJiO65fU8hgcqdWdgbVqRryhOw+Kih+I6RIeNRYnOB8GkGD8Qca+n9JlOELcxLRdLo3vx6dw=" print(verify(data, sign))
结果如下所示:
False
三
结合项目实现RSA加解密
需求:接口须要韶光戳及token前50位鉴权,通过RSA公钥加密得到署名字符串。
01 RSA封装
rsa封装可在ITester软件测试小栈微信"大众年夜众号后台回答“rsa”,进行领取。
02 结合项目实现
(1) 处理鉴权信息
天生token前50位并与韶光戳进行拼接:
from time import timedef generator_sign(token): # 获取token的前50位 token_50 = token[:50] # 天生韶光戳 timestamp = int(time()) # print(timestamp) # 接拼token前50位和韶光戳 msg = token_50 + str(timestamp) print(msg) # 进行RSA加密 sign = rsaEncrypt(msg) return sign,timestamp
(2) 配置要求信息
要求URL与要求头存放在配置文件,以下示例存放在.ini文件:
[server]url=http://ITester.com/xxxauth_type=xxx.itester
(3) 处理要求
发起要求时进行判断,如果auth_type为配置文件指定的类型并且token不为空,则带上加密的鉴权信息。(requests_handler.py 其他代码略)
if conf.get("server","auth_type") == "xxx.itester" and token is not None: from Common.handle_rsa import generator_sign sign,timestamp = generator_sign(token) data["sign"] = sign data["timestamp"] = timestamp
总结:今天主要先容了RSA加解密,RSA广泛用于加密与解密,还有数字署名通信领域。利用Publick/Private秘钥算法中, 加密紧张用对方的公钥,解密用自己的私钥,署名用自己的私钥,验签用对方的公钥。
更多系列文章
敬请期待
我是CoCo,打算机科学与技能专业,深漂大厂互联网民工(女),坐标深圳。5年事情履历,3年持续输出技能文。ITester软件测试小栈(ID:ITestingA)号主,专注于软件测试技能和宝藏干货分享,每周定时更新原创技能文章,每月不定期赠予技能书本,愿我们在更高处相逢。喜好记得星标⭐我,每周及时得到最新推送,第三方转载请注明出处。
想获取更多最新干货内容
快来星标 置顶 关注我