簡體   English   中英

使用PyCrypto的RSA公鑰解密

[英]Decrypt using an RSA public key with PyCrypto

據我了解,我應該能夠使用RSA來確保真實性或隱私,如我所願。 就我而言,我想確保真實性,因此我使用私鑰加密數據,並允許任何人使用公鑰解密它。 數據並不是真正的秘密,但我需要保證它是由公共(和私人)密鑰的所有者創建的。

當我嘗試使用PyCrypto解密時,我從PyCrypto得到No private key error。 代碼是這樣的:

def _decrypt_rsa(decrypt_key_file, cipher_text):
    from Crypto.PublicKey import RSA
    from base64 import b64decode

    key = open(decrypt_key_file, "r").read()
    rsakey = RSA.importKey(key)
    raw_cipher_data = b64decode(cipher_text)
    decrypted = rsakey.decrypt(raw_cipher_data)
    return decrypted

我用公共密鑰文件的路徑(OpenSSH格式)調用它。加密數據不是由我生成的,它不是用Python而是用PHP完成的。 在PHP中有一個openssl_public_decrypt函數可以輕松解密這些數據。

是否有可能使用PyCrypto的公鑰解密?

這是完全不安全的,因為你使用原始RSA而沒有填充。

您的應用程序需要簽名,因此您不應該處理加密和解密。 例如,PKCS#1 v1.5是一個很好的協議,即使簽名是一個必須附加到你想要證明其真實性的數據。

要在Python中驗證PKCS#1 v1.5簽名,您可以:

from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA

rsa_key = RSA.importKey(open(verification_key_file, "rb").read())
verifier = PKCS1_v1_5.new(rsa_key)
h = SHA.new(data_to_verify)
if verifier.verify(h, signature_received_with_the_data):
    print "OK"
else:
    print "Invalid"

我強烈建議更改PHP代碼,以便創建這樣的簽名。

你的功能是正確的。 您只需要為其提供私鑰的路徑,以便解密而不是您的公鑰。 公鑰用於加密,私鑰用於解密。

def _decrypt_rsa(decrypt_key_file, cipher_text):
    '''
    Decrypt RSA encrypted package with private key
    :param decrypt_key_file: Private key
    :param cipher_text: Base64 encoded string to decrypt
    :return: String decrypted
    '''
    from Crypto.PublicKey import RSA
    from base64 import b64decode

    key = open(decrypt_key_file, "r").read()
    rsakey = RSA.importKey(key)
    #optionally could use OAEP
    #from Crypto.Cipher import PKCS1_OAEP
    #rsakey = PKCS1_OAEP.new(rsakey)
    raw_cipher_data = b64decode(cipher_text)
    decrypted = rsakey.decrypt(raw_cipher_data)
    return decrypted

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM