Python3加密解密庫Crypto的RSA加解密和簽名/驗(yàn)簽實(shí)現(xiàn)方法實(shí)例
關(guān)于非對(duì)稱加密算法我就不過多介紹了,本文著重于python3對(duì)RSA算法的實(shí)現(xiàn)。
from Crypto.PublicKey import RSA
import Crypto.Signature.PKCS1_v1_5 as sign_PKCS1_v1_5 #用于簽名/驗(yàn)簽
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) #也可以使用偽隨機(jī)數(shù)來輔助生成
s_key = x.export_key() #私鑰
g_key = x.publickey().export_key() #公鑰
# print(s_key,'\n111\n',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)
#從文件導(dǎo)入密鑰 -- 通過私鑰生成公鑰 (公鑰不會(huì)變 -- 用于只知道私鑰的情況)--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") #生成證書 -- 它和私鑰是唯一對(duì)應(yīng)的
# print(cert)
#實(shí)現(xiàn)RSA 非對(duì)稱加解密
my_private_key = s_key # 私鑰
my_public_key = g_key # 公鑰
############ 使用公鑰 - 私鑰對(duì)信息進(jìn)行"加密" + "解密" ##############
'''
作用:對(duì)信息進(jìn)行公鑰加密,私鑰解密。
應(yīng)用場景:
A想要加密傳輸一份數(shù)據(jù)給B,擔(dān)心使用對(duì)稱加密算法易被他人破解(密鑰只有一份,一旦泄露,則數(shù)據(jù)泄露),故使用非對(duì)稱加密。
信息接收方可以生成自己的秘鑰對(duì),即公私鑰各一個(gè),然后將公鑰發(fā)給他人,私鑰自己保留。
A使用公鑰加密數(shù)據(jù),然后將加密后的密文發(fā)送給B,B再使用自己的私鑰進(jìn)行解密,這樣即使A的公鑰和密文均被第三方得到,
第三方也要知曉私鑰和加密算法才能解密密文,大大降低數(shù)據(jù)泄露風(fēng)險(xiǎn)。
'''
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():
#加解密驗(yàn)證
text = "I love CA!"
assert text == decrypt_with_rsa(encrypt_with_rsa(text))
print("rsa test success!")
############ 使用私鑰 - 公鑰對(duì)信息進(jìn)行"簽名" + "驗(yàn)簽" ##############
'''
作用:對(duì)解密后的文件的完整性、真實(shí)性進(jìn)行驗(yàn)證(繁瑣但更加保險(xiǎn)的做法,很少用到)
應(yīng)用場景:
A有一私密文件欲加密后發(fā)送給B,又擔(dān)心因各種原因?qū)е翨收到并解密后的文件并非完整、真實(shí)的原文件(可能被篡改或丟失一部分),
所以A在發(fā)送前對(duì)原文件進(jìn)行簽名,將[簽名和密文]一同發(fā)送給B讓B收到后用做一下文件的[解密 + 驗(yàn)簽],
均通過后-方可證明收到的原文件的真實(shí)性、完整性。
'''
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)
return signature
def to_verify_with_public_key(signature, plain_text):
#公鑰驗(yàn)簽
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)
return verify #true / false
def executer_with_signature():
#簽名/驗(yàn)簽
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() #只簽名不加密
#二者結(jié)合食用更佳
'''
如果是加密的同時(shí)又要簽名,這個(gè)時(shí)候稍微有點(diǎn)復(fù)雜。
1、發(fā)送者和接收者需要各持有一對(duì)公私鑰,也就是4個(gè)鑰匙。
2、接收者的公私鑰用于機(jī)密信息的加解密
3、發(fā)送者的公私鑰用于機(jī)密信息的簽名/驗(yàn)簽
4、接收者和發(fā)送者都要提前將各自的[公鑰]告知對(duì)方。
'''
更多關(guān)于Python3加密解密庫Crypto的RSA加解密和簽名/驗(yàn)簽實(shí)現(xiàn)方法實(shí)例請(qǐng)查看下面的相關(guān)鏈接
相關(guān)文章
Python練習(xí)之操作MySQL數(shù)據(jù)庫
這篇文章主要介紹了Python練習(xí)之操作MySQL數(shù)據(jù)庫,文章通過如何創(chuàng)建MySQL數(shù)據(jù)表?如何向MySQL表中插入數(shù)據(jù)?如何查詢MySQL中的數(shù)據(jù)?的三個(gè)問題展開了詳細(xì)的內(nèi)容介紹2022-06-06
python使用post提交數(shù)據(jù)到遠(yuǎn)程url的方法
這篇文章主要介紹了python使用post提交數(shù)據(jù)到遠(yuǎn)程url的方法,涉及Python使用post傳遞數(shù)據(jù)的相關(guān)技巧,需要的朋友可以參考下2015-04-04
PyQt5每天必學(xué)之創(chuàng)建窗口居中效果
這篇文章主要介紹了PyQt5每天必學(xué)之創(chuàng)建窗口居中效果,使應(yīng)用程序窗口顯示在屏幕的中心,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
Python常用模塊logging——日志輸出功能(示例代碼)
logging模塊是Python的內(nèi)置模塊,主要用于輸出運(yùn)行日志,可以靈活配置輸出日志的各項(xiàng)信息。這篇文章主要介紹了Python常用模塊logging——日志輸出的實(shí)例代碼,需要的朋友可以參考下2019-11-11
python使用openpyxl實(shí)現(xiàn)對(duì)excel表格相對(duì)路徑的超鏈接的創(chuàng)建方式
這篇文章主要介紹了python使用openpyxl實(shí)現(xiàn)對(duì)excel表格相對(duì)路徑的超鏈接的創(chuàng)建方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03

