python加密解密庫cryptography使用openSSL生成的密匙加密解密
密匙使用步驟一般是:
1. 私匙簽名,發(fā)送簽名后的數(shù)據(jù), 公匙驗證。
2.公匙加密,發(fā)送加密后的數(shù)據(jù),私匙解密。
一般使用情景是通過 openssl 生成密匙后再操作的。Linux下生成密匙也很簡單。
yum 安裝 openssl
yum -y install openssl
生成三個密匙文件。
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
導入私匙:
序列化密鑰可以選擇使用密碼在磁盤上進行加密。在這個例子中,我們加載了一個未加密的密鑰,因此我們沒有提供密碼。如果密鑰被加密,我們可以傳遞一個bytes對象作為 password參數(shù)。
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
# 已有sar私匙, 導入
with open('Key.pem', 'rb') as key_file:
private_key = serialization.load_pem_private_key(
key_file.read(),
password=None,
backend=default_backend()
)
簽名:
私鑰可用于簽署消息。這允許任何擁有公鑰的人驗證該消息是由擁有相應私鑰的人創(chuàng)建的。RSA簽名需要特定的散列函數(shù),并使用填充。以下是message使用RSA 進行簽名的示例,帶有安全散列函數(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私匙, 導入
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é)議或應用的推薦選擇,PKCS1v15 只應用于支持傳統(tǒng)協(xié)議。
如果您的數(shù)據(jù)太大而無法在單個調(diào)用中傳遞,則可以分別對其進行散列并使用該值 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私匙, 導入
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ù)太大而無法在單個調(diào)用中傳遞,則可以分別對其進行散列并使用該值 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)
驗證:
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私匙, 導入
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)
# 公匙導入
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ù)不對,拋出異常
# 如果驗證不匹配,verify()會引發(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ù)太大而無法在單個調(diào)用中傳遞,則可以分別對其進行散列并使用該值 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私匙, 導入
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)
# 公匙導入
with open('Key_pub.pem', 'rb') as key_file:
public_key = serialization.load_pem_public_key(
key_file.read(),
backend=default_backend()
)
# 如果您的數(shù)據(jù)太大而無法在單個調(diào)用中傳遞,則可以分別對其進行散列并使用該值 Prehashed。
public_key.verify(
sig,
digest,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
utils.Prehashed(chosen_hash)
)
公匙,加密:
因為是使用進行加密的RSA加密有趣的是 公共密鑰,這意味著任何人都可以對數(shù)據(jù)進行加密。數(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
# 公匙導入
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私匙, 導入
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
# 公匙導入
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私匙, 導入
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)
更多關于python加密解密庫cryptography的使用方法請查看下面的相關鏈接
相關文章
深入討論Python函數(shù)的參數(shù)的默認值所引發(fā)的問題的原因
這篇文章主要介紹了深入討論Python函數(shù)的參數(shù)的默認值所引發(fā)的問題的原因,利用了Python解釋器在內(nèi)存地址分配中的過程解釋了參數(shù)默認值帶來陷阱的原因,需要的朋友可以參考下2015-03-03
Python將xml和xsl轉(zhuǎn)換為html的方法
這篇文章主要介紹了Python將xml和xsl轉(zhuǎn)換為html的方法,實例分析了使用libxml2模塊操作xml和xsl轉(zhuǎn)換為html的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03
python中l(wèi)ambda與def用法對比實例分析
這篇文章主要介紹了python中l(wèi)ambda與def用法對比,實例分析了lambda與def的區(qū)別與使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04
pyodps中的apply用法及groupby取分組排序第一條數(shù)據(jù)
這篇文章主要介紹了pyodps中的apply用法及groupby取分組排序第一條數(shù)據(jù),問綻放圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值需要的小伙伴可以參考一下2022-05-05
python求numpy中array按列非零元素的平均值案例
這篇文章主要介紹了python求numpy中array按列非零元素的平均值案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06

