python加密解密庫(kù)cryptography使用openSSL生成的密匙加密解密
密匙使用步驟一般是:
1. 私匙簽名,發(fā)送簽名后的數(shù)據(jù), 公匙驗(yàn)證。
2.公匙加密,發(fā)送加密后的數(shù)據(jù),私匙解密。
一般使用情景是通過 openssl 生成密匙后再操作的。Linux下生成密匙也很簡(jiǎn)單。
yum 安裝 openssl
yum -y install openssl
生成三個(gè)密匙文件。
rsa_private_key.pem 私匙文件
rsa_private_key_pkcs8.pem pkcs8格式私匙,
rsa_public_key.pem 公匙
openssl genrsa -out rsa_private_key.pem 1024 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_pkcs8.pem openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
導(dǎo)入私匙:
序列化密鑰可以選擇使用密碼在磁盤上進(jìn)行加密。在這個(gè)例子中,我們加載了一個(gè)未加密的密鑰,因此我們沒有提供密碼。如果密鑰被加密,我們可以傳遞一個(gè)bytes對(duì)象作為 password參數(shù)。
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization # 已有sar私匙, 導(dǎo)入 with open('Key.pem', 'rb') as key_file: private_key = serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() )
簽名:
私鑰可用于簽署消息。這允許任何擁有公鑰的人驗(yàn)證該消息是由擁有相應(yīng)私鑰的人創(chuàng)建的。RSA簽名需要特定的散列函數(shù),并使用填充。以下是message使用RSA 進(jìn)行簽名的示例,帶有安全散列函數(shù)和填充:
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding # 已有sar私匙, 導(dǎo)入 with open('Key.pem', 'rb') as key_file: private_key = serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) message = b"aaaa, bbbb, cccc" # 簽名操作 signature = private_key.sign( message, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA256() ) print('簽名后數(shù)據(jù): ', signature)
有效的簽名填充是 PSS和 PKCS1v15.PSS 是任何新協(xié)議或應(yīng)用的推薦選擇,PKCS1v15 只應(yīng)用于支持傳統(tǒng)協(xié)議。
如果您的數(shù)據(jù)太大而無法在單個(gè)調(diào)用中傳遞,則可以分別對(duì)其進(jìn)行散列并使用該值 Prehashed。
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives.asymmetric import utils # 已有sar私匙, 導(dǎo)入 with open('Key.pem', 'rb') as key_file: private_key = serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) # 如果您的數(shù)據(jù)太大而無法在單個(gè)調(diào)用中傳遞,則可以分別對(duì)其進(jìn)行散列并使用該值 Prehashed。 chosen_hash = hashes.SHA256() hasher = hashes.Hash(chosen_hash, default_backend()) hasher.update(b"data &") hasher.update(b"more data") digest = hasher.finalize() sig = private_key.sign( digest, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), utils.Prehashed(chosen_hash) ) print('簽名后數(shù)據(jù): ', sig)
驗(yàn)證:
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding # 已有sar私匙, 導(dǎo)入 with open('Key.pem', 'rb') as key_file: private_key = serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) message = b"123 xiao" # 簽名 signature = private_key.sign( # 原始數(shù)據(jù) message, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA256() ) print('簽名后的數(shù)據(jù): ', signature) # 公匙導(dǎo)入 with open('Key_pub.pem', 'rb') as key_file: public_key = serialization.load_pem_public_key( key_file.read(), backend=default_backend() ) # 簽名數(shù)據(jù)與原始數(shù)據(jù)不對(duì),拋出異常 # 如果驗(yàn)證不匹配,verify()會(huì)引發(fā) InvalidSignature異常。 public_key.verify( # 簽名數(shù)據(jù) signature, # 原始數(shù)據(jù) message, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA256() )
如果您的數(shù)據(jù)太大而無法在單個(gè)調(diào)用中傳遞,則可以分別對(duì)其進(jìn)行散列并使用該值 Prehashed。
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives.asymmetric import utils # 已有sar私匙, 導(dǎo)入 with open('Key.pem', 'rb') as key_file: private_key = serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) chosen_hash = hashes.SHA256() hasher = hashes.Hash(chosen_hash, default_backend()) hasher.update(b'data &') hasher.update(b'more data') digest = hasher.finalize() sig = private_key.sign( digest, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), utils.Prehashed(chosen_hash) ) print('簽名后的數(shù)據(jù): ', sig) # 公匙導(dǎo)入 with open('Key_pub.pem', 'rb') as key_file: public_key = serialization.load_pem_public_key( key_file.read(), backend=default_backend() ) # 如果您的數(shù)據(jù)太大而無法在單個(gè)調(diào)用中傳遞,則可以分別對(duì)其進(jìn)行散列并使用該值 Prehashed。 public_key.verify( sig, digest, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), utils.Prehashed(chosen_hash) )
公匙,加密:
因?yàn)槭鞘褂眠M(jìn)行加密的RSA加密有趣的是 公共密鑰,這意味著任何人都可以對(duì)數(shù)據(jù)進(jìn)行加密。數(shù)據(jù)然后使用私鑰解密。
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding # 公匙導(dǎo)入 with open('Key_pub.pem', 'rb') as key_file: public_key = serialization.load_pem_public_key( key_file.read(), backend=default_backend() ) message = b'test data' ciphertext = public_key.encrypt( message, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) print('加密數(shù)據(jù): ', ciphertext)
私匙解密公私加密的信息:
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding # 已有sar私匙, 導(dǎo)入 with open('Key.pem', 'rb') as key_file: private_key = serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) plaintext = private_key.decrypt( # 加密的信息 ciphertext, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) print('解密數(shù)據(jù): ', plaintext)
完整的公匙加密,私匙解密獲取信息。
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding # 公匙導(dǎo)入 with open('Key_pub.pem', 'rb') as key_file: public_key = serialization.load_pem_public_key( key_file.read(), backend=default_backend() ) message = b'test data' ciphertext = public_key.encrypt( message, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) print('加密數(shù)據(jù): ', ciphertext) # 已有sar私匙, 導(dǎo)入 with open('Key.pem', 'rb') as key_file: private_key = serialization.load_pem_private_key( key_file.read(), password=None, backend=default_backend() ) plaintext = private_key.decrypt( # 加密的信息 ciphertext, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) print('解密數(shù)據(jù): ', plaintext)
更多關(guān)于python加密解密庫(kù)cryptography的使用方法請(qǐng)查看下面的相關(guān)鏈接
相關(guān)文章
詳解python 拆包可迭代數(shù)據(jù)如tuple, list
拆包是指將一個(gè)結(jié)構(gòu)中的數(shù)據(jù)拆分為多個(gè)單獨(dú)變量中。下面通過本文給大家介紹python 拆包可迭代數(shù)據(jù)如tuple, list的相關(guān)資料,需要的朋友參考下吧2017-12-12Python+Pygame實(shí)戰(zhàn)之文字劇情游戲的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何利用Python和Pygame實(shí)現(xiàn)兩款文字劇情游戲——《巨龍之洞》和《太空礦工》,感興趣的小伙伴可以了解一下2022-12-12Python openpyxl模塊學(xué)習(xí)之輕松玩轉(zhuǎn)Excel
Python提供了許多操作Excel的模塊,能夠讓我們從繁瑣的工作中騰出雙手。本文主要為大家介紹的是openpyxl模塊,它的功能相對(duì)與其他模塊更為齊全,感興趣的小伙伴快來學(xué)習(xí)一下吧2021-12-12python 使用正則表達(dá)式按照多個(gè)空格分割字符的實(shí)例
今天小編就為大家分享一篇python 使用正則表達(dá)式按照多個(gè)空格分割字符的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12tensorflow 利用expand_dims和squeeze擴(kuò)展和壓縮tensor維度方式
今天小編就為大家分享一篇tensorflow 利用expand_dims和squeeze擴(kuò)展和壓縮tensor維度方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02