Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
关于非对称加密算法我就不过多介绍了,本文着重于python3对RSA算法的实现。
fromCrypto.PublicKeyimportRSA
importCrypto.Signature.PKCS1_v1_5assign_PKCS1_v1_5#用于签名/验签
fromCrypto.CipherimportPKCS1_v1_5#用于加密
fromCryptoimportRandom
fromCryptoimportHash
x=RSA.generate(2048)
#y=RSA.generate(2048,Random.new().read)#也可以使用伪随机数来辅助生成
s_key=x.export_key()#私钥
g_key=x.publickey().export_key()#公钥
#print(s_key,'\n111\n',g_key)
#写入文件--1
#withopen("c.pem","wb")asx:
#x.write(s_key)
#withopen("d.pem","wb")asx:
#x.write(g_key)
#从文件导入密钥--通过私钥生成公钥(公钥不会变--用于只知道私钥的情况)--2
#withopen('c.pem','rb')asx:
#s_key=RSA.importKey(x.read())
##new_g_key=s_key.publickey().export_key()
##print(new_g_key)
#
#cert=s_key.export_key("DER")#生成证书--它和私钥是唯一对应的
#print(cert)
#实现RSA非对称加解密
my_private_key=s_key#私钥
my_public_key=g_key#公钥
############使用公钥-私钥对信息进行"加密"+"解密"##############
'''
作用:对信息进行公钥加密,私钥解密。
应用场景:
A想要加密传输一份数据给B,担心使用对称加密算法易被他人破解(密钥只有一份,一旦泄露,则数据泄露),故使用非对称加密。
信息接收方可以生成自己的秘钥对,即公私钥各一个,然后将公钥发给他人,私钥自己保留。
A使用公钥加密数据,然后将加密后的密文发送给B,B再使用自己的私钥进行解密,这样即使A的公钥和密文均被第三方得到,
第三方也要知晓私钥和加密算法才能解密密文,大大降低数据泄露风险。
'''
defencrypt_with_rsa(plain_text):
#先公钥加密
cipher_pub_obj=PKCS1_v1_5.new(RSA.importKey(my_public_key))
_secret_byte_obj=cipher_pub_obj.encrypt(plain_text.encode())
return_secret_byte_obj
defdecrypt_with_rsa(_secret_byte_obj):
#后私钥解密
cipher_pri_obj=PKCS1_v1_5.new(RSA.importKey(my_private_key))
_byte_obj=cipher_pri_obj.decrypt(_secret_byte_obj,Random.new().read)
plain_text=_byte_obj.decode()
returnplain_text
defexecuter_without_signature():
#加解密验证
text="IloveCA!"
asserttext==decrypt_with_rsa(encrypt_with_rsa(text))
print("rsatestsuccess!")
############使用私钥-公钥对信息进行"签名"+"验签"##############
'''
作用:对解密后的文件的完整性、真实性进行验证(繁琐但更加保险的做法,很少用到)
应用场景:
A有一私密文件欲加密后发送给B,又担心因各种原因导致B收到并解密后的文件并非完整、真实的原文件(可能被篡改或丢失一部分),
所以A在发送前对原文件进行签名,将[签名和密文]一同发送给B让B收到后用做一下文件的[解密+验签],
均通过后-方可证明收到的原文件的真实性、完整性。
'''
defto_sign_with_private_key(plain_text):
#私钥签名
signer_pri_obj=sign_PKCS1_v1_5.new(RSA.importKey(my_private_key))
rand_hash=Hash.SHA256.new()
rand_hash.update(plain_text.encode())
signature=signer_pri_obj.sign(rand_hash)
returnsignature
defto_verify_with_public_key(signature,plain_text):
#公钥验签
verifier=sign_PKCS1_v1_5.new(RSA.importKey(my_public_key))
_rand_hash=Hash.SHA256.new()
_rand_hash.update(plain_text.encode())
verify=verifier.verify(_rand_hash,signature)
returnverify#true/false
defexecuter_with_signature():
#签名/验签
text="IloveCA!"
assertto_verify_with_public_key(to_sign_with_private_key(text),text)
print("rsaSignatureverified!")
if__name__=='__main__':
executer_without_signature()#只加密不签名
executer_with_signature()#只签名不加密
#二者结合食用更佳
'''
如果是加密的同时又要签名,这个时候稍微有点复杂。
1、发送者和接收者需要各持有一对公私钥,也就是4个钥匙。
2、接收者的公私钥用于机密信息的加解密
3、发送者的公私钥用于机密信息的签名/验签
4、接收者和发送者都要提前将各自的[公钥]告知对方。
'''
更多关于Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例请查看下面的相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。