python使用rsa非对称加密过程解析
这篇文章主要介绍了python使用rsa非对称加密过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
1、安装rsa
支持python2.7或者python3.5以上版本
使用豆瓣pypi源来安装rsa
pipinstall-ihttps://pypi.douban.com/simplersa
2、加密解密
2.1、生成公私钥对
importrsa #1、接收者(A)生成512位公私钥对 #a.lemon_pub为PublicKey对象,lemon_priv为PrivateKey对象 #b.512为秘钥的位数,可以自定义指定,例如:128、256、512、1024、2048等 lemon_pub,lemon_priv=rsa.newkeys(512)
此时的状态
2.2、发送者加密
#2、发送者(B)使用接收者(A)的公钥去加密消息
#rsa只能处理字节类型,故字符串类型需要转化为字节类型
love_talk="Lemonlittlegirl,Iloveyouverymuch!".encode("utf-8")
cryto_info=rsa.encrypt(love_talk,lemon_pub)#使用接收者(A)的公钥加密
此时状态
2.3、接收者解密
#3.接收者(A)使用自己的私钥去解密消息
talk_real=rsa.decrypt(cryto_info,lemon_priv)
talk_real2=talk_real.decode("utf-8")
print(talk_real2)
3、其他场景加密解密
importrsa
#生成密钥
pubkey,privkey=rsa.newkeys(512)
#保存密钥
print("==============保存密钥===============")
withopen('public.pem','w+')asf:
f.write(pubkey.save_pkcs1().decode())
withopen('private.pem','w+')asf:
f.write(privkey.save_pkcs1().decode())
#导入密钥
withopen('public.pem','r')asf:
pubkey=rsa.PublicKey.load_pkcs1(f.read().encode())
withopen('private.pem','r')asf:
privkey=rsa.PrivateKey.load_pkcs1(f.read().encode())
"""
加密RSA
"""
defrsa_encrypt(message):
crypto_email_text=rsa.encrypt(message.encode(),pubkey)
returncrypto_email_text
text=rsa_encrypt("firsttestrsa")
print(text)
"""
解密
"""
defrsa_decrypt(message):
message_str=rsa.decrypt(message,privkey).decode()
returnmessage_str
newmessage=rsa_encrypt("haha,onetwothreefoursmile!")
message=rsa_decrypt(newmessage)
print("\n",message)
"""
签名
"""
message='这是重要指令:...'
crypto_email_text=rsa.sign(message.encode(),privkey,'SHA-1')
"""
验证
"""
#收到指令明文、密文,然后用公钥验证,进行身份确认
rsa.verify(message.encode(),crypto_email_text,pubkey)
4、加密过程的封装
#导入base64模块来进行base64编码
importbase64
importrsa
classHandleSign:
#定义服务器公钥,往往可以存放在公钥文件中
server_pub="""
-----BEGINPUBLICKEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQENQujkLfZfc5Tu9Z1LprzedE
O3F7gs+7bzrgPsMl29LemonPYvIG8C604CprLittlenJpnhWu2lGirlWZyLq6sBr
tuPorOc42+gInFfyhJAwdZB6Sqlove7bW+jNe5youDtU7very6Gx+muchGo8Dg+S
kKlZFc8Br7SHtbL2tQIDAQAB
-----ENDPUBLICKEY-----
"""
@classmethod
defto_encrypt(cls,msg,pub_key=None):
"""
非对称加密
:parammsg:待加密字符串或者字节
:parampub_key:公钥
:return:base64密文字符串
"""
ifisinstance(msg,str):#如果msg为字符串,则转化为字节类型
msg=msg.encode('utf-8')
elifisinstance(msg,bytes):#如果msg为字节类型,则无需处理
pass
else:#否则抛出异常
raiseTypeError('msg必须为字符串或者字节类型!')
ifnotpub_key:#如果pub_key为空,则使用全局公钥
pub_key=cls.server_pub.encode("utf-8")
elifisinstance(pub_key,str):#如果pub_key为字符串,则转化为字节类型
pub_key=pub_key.encode('utf-8')
elifisinstance(pub_key,bytes):#如果msg为字节类型,则无需处理
pass
else:#否则抛出异常
raiseTypeError('pub_key必须为None、字符串或者字节类型!')
public_key_obj=rsa.PublicKey.load_pkcs1_openssl_pem(pub_key)#创建PublicKey对象
#2.创建PublicKey对象
#public_key_obj=rsa.PublicKey.load_pkcs1(pub_key)
cryto_msg=rsa.encrypt(msg,public_key_obj)#生成加密文本
cipher_base64=base64.b64encode(cryto_msg)#将加密文本转化为base64编码
returncipher_base64.decode()#将字节类型的base64编码转化为字符串类型
if__name__=='__main__':
#待加密字符串或者字节
love_talk="Lemonlittlegirl,Iloveyouverymuch!"
#1.用自己生成的publickye测试下
#lemon_pub,lemon_priv=rsa.newkeys(512)
#lemon_pub2=lemon_pub.save_pkcs1()
#调用to_encrypt类方法来进行加密
cryto_info=HandleSign.to_encrypt(love_talk)
print(cryto_info)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。