据我所知,我应该能够如我所愿地使用 RSA 来确保真实性或隐私。就我而言,我想确保真实性,因此我使用私钥加密数据,并允许任何人使用公钥解密数据。数据并不是真正的秘密,但我需要保证它是由公钥(和私钥)的所有者创建的。
当我尝试使用PyCrypto解密时,我收到来自PyCrypto的无私钥错误。代码是这样的:
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