2017-10-20 24 views
0

Question n00b simple: J'essaie de répliquer le comportement de la fonction openssl_private_decrypt en PHP pour décrypter un fichier qu'un fournisseur m'envoie qui a été crypté via la fonction openssl_public_encrypt. J'utilise python 3.4 et donc la seule bibliothèque que je peux voir disponible est pyopenssl, mais il est suffisamment bas niveau que je ne peux pas facilement trouver comment faire ce que je veux faire. C'est probablement très simple, mais est-ce que quelqu'un a un exemple de ce que je veux faire?Comment décrypter le fichier crypté RSA (via PHP et OpenSSL) avec pyopenssl?

Répondre

0

Grâce à @mnistic, ça a marché, mais avec quelques modifications. Voici le code de travail final (vous devez garder à l'esprit les valeurs par défaut de openssl_private_decrypt):

from cryptography.hazmat.primitives import serialization 
from cryptography.hazmat.backends import default_backend 
from cryptography.hazmat.primitives.asymmetric import padding 

# It's critical that the file be opened in mode "rb"! 
with open("private.key", 'rb') as key_file: 
    private_key = serialization.load_pem_private_key(key_file.read(), password=None, backend=default_backend()) 

with open('encrypted_file', 'rb') as encrypted_file: 
    ciphertext = encrypted_file.read() 

plaintext = private_key.decrypt(ciphertext, padding.PKCS1v15()) 

S'il vous plaît noter que ciphertext a besoin d'être plus courte que la taille de bloc maximale de la clé (ce qui est le nombre de bits la clé divisée par 8 pour RSA). J'espère que cela aidera les futurs googleurs!

1

Avec le Cryptography module, que vous pouvez installer avec:

$ pip install cryptography

En supposant que vous avez la clé privée stockée dans un fichier appelé « path/to/key.pem », tout d'abord vous chargez la clé privée :

from cryptography.hazmat.primitives import serialization 
with open("path/to/key.pem", "rb") as key_file: 
    private_key = serialization.load_pem_private_key(
     key_file.read(), 
     password=None, 
     backend=default_backend() 
    ) 

Et puis vous décryptez avec:

plaintext = private_key.decrypt(
    ciphertext, 
    padding.OAEP(
     mgf=padding.MGF1(algorithm=hashes.SHA1()), 
      algorithm=hashes.SHA1(), 
      label=None 
    ) 
)