13

据我了解,我应该能够使用 RSA 来确保真实性或隐私,如我所愿。就我而言,我想确保真实性,因此我使用私钥加密数据并允许任何人使用公钥对其进行解密。这些数据并不是真正的秘密,但我需要保证它是由公钥(和私钥)的所有者创建的。

当我尝试使用 PyCrypto 解密时,我从 PyCrypto 收到No private key错误。代码是这样的:

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 的公钥进行解密?

4

2 回答 2

7

这是完全不安全的,因为您使用的是没有填充的原始 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 代码,以便创建这样的签名。

于 2013-10-23T20:37:06.767 回答
0

你的功能是正确的。您只需要为其提供指向您的私钥的路径即可解密,而不是您的公钥。公钥用于加密,私钥用于解密。

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
于 2013-11-20T04:07:16.840 回答