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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。