欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2020年02月11日 08:58:15   作者:xiaoqingyu123  
這篇文章主要介紹了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)

更多關(guān)于python加密解密庫cryptography的使用方法請查看下面的相關(guān)鏈接

相關(guān)文章

  • 基于PyQT5制作一個敏感詞檢測工具

    基于PyQT5制作一個敏感詞檢測工具

    這篇文章主要介紹了如何利用PyQT5制作簡易的敏感詞檢測工具??梢愿鶕?jù)敏感詞庫文件篩選,查看輸入的文本中是否包含敏感詞匯,從而過濾出相關(guān)的敏感詞。感興趣的可以了解一下
    2022-02-02
  • 詳解Python如何求不同分辨率圖像的峰值信噪比

    詳解Python如何求不同分辨率圖像的峰值信噪比

    這篇文章主要為大家詳細介紹了如何利用Python中的?NumPy?和?OpenCV?庫實現(xiàn)求不同分辨率圖像的峰值信噪比,感興趣的小伙伴可以跟隨不想一起學習一下
    2023-01-01
  • 詳解python 拆包可迭代數(shù)據(jù)如tuple, list

    詳解python 拆包可迭代數(shù)據(jù)如tuple, list

    拆包是指將一個結(jié)構(gòu)中的數(shù)據(jù)拆分為多個單獨變量中。下面通過本文給大家介紹python 拆包可迭代數(shù)據(jù)如tuple, list的相關(guān)資料,需要的朋友參考下吧
    2017-12-12
  • Python操作MongoDB的教程分享

    Python操作MongoDB的教程分享

    MongoDB?是一個流行的?NoSQL?數(shù)據(jù)庫,以其半結(jié)構(gòu)化的文檔存儲方式而聞名,本文將帶大家逐步了解如何使用Python與MongoDB進行交互,從連接到基本操作,快跟隨小編一起學習一下吧
    2023-08-08
  • Python+Pygame實戰(zhàn)之文字劇情游戲的實現(xiàn)

    Python+Pygame實戰(zhàn)之文字劇情游戲的實現(xiàn)

    這篇文章主要為大家詳細介紹了如何利用Python和Pygame實現(xiàn)兩款文字劇情游戲——《巨龍之洞》和《太空礦工》,感興趣的小伙伴可以了解一下
    2022-12-12
  • VS2022編譯安裝Qt6.5源碼教程

    VS2022編譯安裝Qt6.5源碼教程

    這篇文章主要介紹了VS2022編譯安裝Qt6.5源碼,在這里解壓方式可以使用7z解壓,也可以使用MinGW中的tar進行解壓,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • Python openpyxl模塊學習之輕松玩轉(zhuǎn)Excel

    Python openpyxl模塊學習之輕松玩轉(zhuǎn)Excel

    Python提供了許多操作Excel的模塊,能夠讓我們從繁瑣的工作中騰出雙手。本文主要為大家介紹的是openpyxl模塊,它的功能相對與其他模塊更為齊全,感興趣的小伙伴快來學習一下吧
    2021-12-12
  • python 使用正則表達式按照多個空格分割字符的實例

    python 使用正則表達式按照多個空格分割字符的實例

    今天小編就為大家分享一篇python 使用正則表達式按照多個空格分割字符的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • tensorflow 利用expand_dims和squeeze擴展和壓縮tensor維度方式

    tensorflow 利用expand_dims和squeeze擴展和壓縮tensor維度方式

    今天小編就為大家分享一篇tensorflow 利用expand_dims和squeeze擴展和壓縮tensor維度方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python查詢IP地址歸屬完整代碼

    Python查詢IP地址歸屬完整代碼

    這篇文章主要介紹了Python查詢IP地址歸屬完整代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評論