Search code examples
pythonencryptionrsapycryptodome

Incorrect decryption RSA pycryptodome


I try to implement RSA in Python with pycryptodome, the encrypt Works fine but the decrypt function no, my code is the following:

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Signature import pss
from Crypto.Hash import SHA256

class RSA_OBJECT:


           def create_KeyPair(self):

    self.key = RSA.generate(self.KEY_LENGTH)


def save_PrivateKey(self, file, password):

    key_cifrada = self.key.export_key(passphrase=password, pkcs=8,protection="scryptAndAES128-CBC")
    file_out = open(file, "wb")
    file_out.write(key_cifrada)
    file_out.close()


def load_PrivateKey(self, file, password):
           key_cifrada = open(file, "rb").read()
    self.private_key = RSA.import_key(key_cifrada, passphrase=password)


def save_PublicKey(self, file):
          key_pub = self.key.publickey().export_key()
    file_out = open(file, "wb")
    file_out.write(key_pub)
    file_out.close()

def load_PublicKey(self, file):

    key_publica = open(file, "rb").read()
    self.public_key = RSA.import_key(key_publica)    

I don't know why, because I think that the code is correct, anyone can help me?


Solution

  • Your problem you generate two different keys;

    self.public_key = RSA.generate(self.KEY_LENGTH)
    self.private_key = RSA.generate(self.KEY_LENGTH)
    

    you should;

    key = RSA.generate(self.KEY_LENGTH)
    

    and

    private_key = key.export_key()
    file_out = open("private.pem", "wb")
    file_out.write(private_key)
    
    public_key = key.publickey().export_key()
    file_out = open("receiver.pem", "wb")
    file_out.write(public_key)
    

    See here in more details;


    Note: note that key object has two functionality due to public keys encryption. You can write a private key into a file and public key into another. In this way, you can distribute the key. See RSAKey.