您好,登錄后才能下訂單哦!
這篇文章給大家介紹怎么在python中使用openSSL生成密匙,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
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', '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('簽名后數據: ', 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', 'rb') as key_file: private_key = serialization.load_pem_private_key( key_file.read(), password=None, 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, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), 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', '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( # 原始數據 message, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), 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, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), 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', '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('簽名后的數據: ', sig) # 公匙導入 with open('Key_pub.pem', 'rb') as key_file: public_key = serialization.load_pem_public_key( key_file.read(), backend=default_backend() ) # 如果您的數據太大而無法在單個調用中傳遞,則可以分別對其進行散列并使用該值 Prehashed。 public_key.verify( sig, digest, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), 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', '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('加密數據: ', 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('解密數據: ', 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('加密數據: ', 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('解密數據: ', plaintext)
關于怎么在python中使用openSSL生成密匙就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。