1. 程式人生 > 程式設計 >python加密解密庫cryptography使用openSSL生成的密匙加密解密

python加密解密庫cryptography使用openSSL生成的密匙加密解密

密匙使用步驟一般是:

    1. 私匙簽名,傳送簽名後的資料, 公匙驗證。

    2.公匙加密,傳送加密後的資料,私匙解密。

一般使用情景是通過 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引數。

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()
  )

簽名:

私鑰可用於簽署訊息。這允許任何擁有公鑰的人驗證該訊息是由擁有相應私鑰的人建立的。RSA簽名需要特定的雜湊函式,並使用填充。以下是message使用RSA 進行簽名的示例,帶有安全雜湊函式和填充:

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',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('簽名後資料: ',signature)

有效的簽名填充是 PSS和 PKCS1v15.PSS 是任何新協議或應用的推薦選擇,PKCS1v15 只應用於支援傳統協議。

如果您的資料太大而無法在單個呼叫中傳遞,則可以分別對其進行雜湊並使用該值 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',backend=default_backend()
  )
 
# 如果您的資料太大而無法在單個呼叫中傳遞,則可以分別對其進行雜湊並使用該值 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,utils.Prehashed(chosen_hash)
)
print('簽名後資料: ',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',backend=default_backend()
  )
 
message = b"123 xiao"
 
# 簽名
signature = private_key.sign(
  # 原始資料
  message,hashes.SHA256()
)
print('簽名後的資料: ',signature)
 
 
# 公匙匯入
with open('Key_pub.pem','rb') as key_file:
  public_key = serialization.load_pem_public_key(
    key_file.read(),backend=default_backend()
  )
  
  
# 簽名資料與原始資料不對,丟擲異常
# 如果驗證不匹配,verify()會引發 InvalidSignature異常。
public_key.verify(
  # 簽名資料
  signature,# 原始資料
  message,hashes.SHA256()
)

如果您的資料太大而無法在單個呼叫中傳遞,則可以分別對其進行雜湊並使用該值 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',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,utils.Prehashed(chosen_hash)
)
print('簽名後的資料: ',sig)
 
 
# 公匙匯入
with open('Key_pub.pem',backend=default_backend()
  )
 
 
# 如果您的資料太大而無法在單個呼叫中傳遞,則可以分別對其進行雜湊並使用該值 Prehashed。
public_key.verify(
  sig,digest,utils.Prehashed(chosen_hash)
)

公匙,加密:

因為是使用進行加密的RSA加密有趣的是 公共金鑰,這意味著任何人都可以對資料進行加密。資料然後使用私鑰解密。

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',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('加密資料: ',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',backend=default_backend()
  )
  
 
plaintext = private_key.decrypt(
  # 加密的資訊
  ciphertext,label=None
  )
)
 
print('解密資料: ',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',ciphertext)
 
 
# 已有sar私匙, 匯入
with open('Key.pem',plaintext)

更多關於python加密解密庫cryptography的使用方法請檢視下面的相關連結