python3 RSA的加解密和签名/验签 简单实现 --Crypto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | from Crypto.PublicKey import RSA import Crypto.Signature.PKCS1_v1_5 as sign_PKCS1_v1_5 # 用于签名/验签 from Crypto.Cipher import PKCS1_v1_5 # 用于加密 from Crypto import Random from Crypto import Hash x = RSA.generate( 2048 ) # y = RSA.generate(2048, Random.new().read) #也可以使用伪随机数来辅助生成 s_key = x.export_key() # 私钥 print (s_key) g_key = x.publickey().export_key() # 公钥 print ( '*' * 80 ) print (g_key) # 写入文件--1# with open("c.pem", "wb") as x:# x.write(s_key)# with open("d.pem", "wb") as x:# x.write(g_key)# 从文件导入密钥 -- 通过私钥生成公钥 (公钥不会变 -- 用于只知道私钥的情况)--2# with open('c.pem','rb')as x:# 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) my_private_key = s_key #私钥 my_public_key = g_key #公钥 ############ 使用公钥 - 私钥对信息进行"加密" + "解密" ############## ''' 作用:对信息进行公钥加密,私钥解密。 应用场景: A想要加密传输一份数据给B,担心使用对称加密算法易被他人破解(密钥只有一份,一旦泄露,则数据泄露),故使用非对称加密。 信息接收方可以生成自己的秘钥对,即公私钥各一个,然后将公钥发给他人,私钥自己保留。 A使用公钥加密数据,然后将加密后的密文发送给B,B再使用自己的私钥进行解密,这样即使A的公钥和密文均被第三方得到, 第三方也要知晓私钥和加密算法才能解密密文,大大降低数据泄露风险。 ''' def encrypt_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 def decrypt_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() return plain_text def executer_without_signature(): # 加解密验证 text = "I love CA!" assert text = = decrypt_with_rsa(encrypt_with_rsa(text)) print ( "rsa test success!" ) ############ 2 使用私钥 - 公钥对信息进行"签名" + "验签" ############## ''' 作用:对解密后的文件的完整性、真实性进行验证(繁琐但更加保险的做法,很少用到) 应用场景: A有一私密文件欲加密后发送给B,又担心因各种原因导致B收到并解密后的文件并非完整、真实的原文件(可能被篡改或丢失一部分), 所以A在发送前对原文件进行签名,将[签名和密文]一同发送给B让B收到后用做一下文件的[解密 + 验签], 均通过后-方可证明收到的原文件的真实性、完整性。 ''' def to_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) print (f '\033[31m{signature}\033[0m' ) return signature def to_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) print (verify) return verify # true / false def executer_with_signature(): # 签名/验签 text = "I love CA!" assert to_verify_with_public_key(to_sign_with_private_key(text), text) print ( "rsa Signature verified!" ) if __name__ = = '__main__' : # executer_without_signature() # 只加密不签名 executer_with_signature() # 只签名不加密 # 二者结合食用更佳 ''' 如果是加密的同时又要签名,这个时候稍微有点复杂。 1、发送者和接收者需要各持有一对公私钥,也就是4个钥匙。 2、接收者的公私钥用于机密信息的加解密 3、发送者的公私钥用于机密信息的签名/验签 4、接收者和发送者都要提前将各自的[公钥]告知对方。 ''' |
pycrypto,pycrytodome 和 crypto 是一个东西,crypto 在 python 上面的名字是 pycrypto 它是一个第三方库,但是已经停止更新,所以不建议安装这个库;
windows 下 python3.6 版本以上安装比较麻烦(本人是 Python3.7,尝试安装未成功,如果需要尝试安装的,可以参考点击这里),在安装无果的情况下,可以安装 pycryptodome,它是pycrypto 的延伸版本,用法和 pycrypto 是一模一样的。
RSA算法简介:
RSA加密算法是一种非对称加密算法,
加密的秘钥是由公钥和私钥两部分组成秘钥对,
公钥用来加密消息,私钥用来对消息进行解密,
公钥是公开的,私钥则是用户自己保留的,
由于公钥是公开的,那么任何人只要获取到公钥,都可以使用公钥来加密发送伪造内容,出于安全性考虑,在发送消息之前我们可以使用RSA来签名。
签名使用私钥来进行签名,使用公钥来进行验签,通过签名我们可以确保用户身份的唯一性,从而提高安全性。
转载于:https://www.cnblogs.com/suguangti/p/12100215.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了