Descifrar utilizando una clave pública RSA con PyCrypto

Según tengo entendido, debería poder utilizar RSA para garantizar la autenticidad o la privacidad, según lo desee. En mi caso, quiero asegurar la autenticidad, así que cifro los datos con la clave privada y permito que cualquiera los descifre con la clave pública. Los datos no son realmente secretos, pero debo garantizar que fueron creados por el propietario de la clave pública (y privada).

Cuando bash descifrar usando PyCrypto, no obtengo ningún error de clave privada de PyCrypto. El código es este:

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 

Lo estoy llamando con la ruta al archivo de clave pública (en formato OpenSSH). Los datos encriptados no son generados por mí y no se hizo con Python sino con PHP. En PHP hay una función openssl_public_decrypt que descifra estos datos fácilmente.

¿Es posible descifrar usando la clave pública con PyCrypto?

Eso es totalmente inseguro, porque está utilizando RSA sin formato sin relleno.

Su aplicación necesita una firma, por lo que no debe tratar con cifrados y descifrados. Por ejemplo, PKCS # 1 v1.5 es un buen protocolo, a pesar de que la firma es un dato que se debe adjuntar a lo que desea probar la autenticidad.

Para verificar una firma PKCS # 1 v1.5 en Python, usted hace:

 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" 

Recomiendo encarecidamente cambiar el código PHP para que cree tal firma.

Su función es correcta. Solo necesita darle la ruta a su clave privada para descifrarla en lugar de su clave pública. La clave pública es para cifrar, la clave privada es para descifrar.

 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