Fewmitz
Fewmitz

Reputation: 497

python gnupg decryption failing due to bad password on generated keys

I'm trying to use the Python gnupg package from here to do GPG encryption. I wrote some sample code to make sure I was using the API correctly but most of the existing examples of the package use a home directory. I'd like to be able to import/export the keys and interact with the API through that.

My test code is below:

def doEncryptFile(pubKeyFile, inDataFile):
    f = open(pubKeyFile,"r")
    data = f.read()
    f.close()
    gpg = gnupg.GPG()
    import_result = gpg.import_keys(data)
    public_key = gpg.list_keys()[0]

    f = open(inDataFile,"r")
    decData = f.read()
    f.close()

    encrypted = gpg.encrypt(decData, public_key['fingerprint'])
    print("encrypted?")
    print(str(encrypted.ok))
    print(str(encrypted.status))
    print(str(encrypted))

    return str(encrypted)

def doDecryptFile(privKeyFile, inDataFile, privPass):
    f = open(privKeyFile,"r")
    data = f.read()
    f.close()
    gpg = gnupg.GPG()
    import_result = gpg.import_keys(data)
    public_key = gpg.list_keys()[0]

    f = open(inDataFile,"rb")
    decData = f.read()
    f.close()

    decrypted_data = gpg.decrypt(decData, passphrase=privPass)
    print("decrypted?")
    print(str(decrypted_data.ok))
    print(str(decrypted_data.status))


gpg = gnupg.GPG()
key = do_key_generation(gpg, "helloWorld")
print(str(type(key)))
private_key = gpg.export_keys(key.fingerprint, True, passphrase="helloWorld")
public_key = gpg.export_keys(key.fingerprint)

with open('sample_public.asc', 'w') as f:
    f.write(public_key)

with open('sample_private.asc', 'w') as f:
    f.write(private_key)


doEncryptFile(r"sample_public.asc", "sampleDecryptedData.txt")
doDecryptFile(r"sample_private.asc", "sampleEncrypted.txt", privPass="helloWorld")

In the above example I manually copied the encrypted text to sampleEncrypted.txt. The key generation function is taken from here. When using it this way, the encryption works as expected and I get the ASCII-encoded blob.

However when trying to decrypt the file the decryption fails. If I do not provide the passphrase I get a prompt from OpenPGP telling me to enter my password, so it's at least partially working, but the decryption fails and the status message is just "decryption failed". If I try to manually enter the "helloWorld" password in the pinentry-qt GUI the error message is "Bad Passphrase". I've also tried using decrypt_file with input file containing the ASCII blob as described on the python-gnupg page, to the same result.

I'm on Python 3 on a Windows system if that makes a difference. I'll also note that when using gpg through the command line everything works as expected.

Upvotes: 0

Views: 2004

Answers (1)

kelalaka
kelalaka

Reputation: 5636

You forgot to save the outputs to a file.

I added the output= options to the gpg.encrypt and gpg.decrypt, and of course to your functions.

import gnupg

def do_key_generation(gpg, passphrase = "helloWorld"):

    input_data = gpg.gen_key_input(
        name_email='[email protected]',
        passphrase=passphrase,
    )
    key = gpg.gen_key(input_data)
    print(key)
    return key

def doEncryptFile(pubKeyFile, inDataFile, outputDatafile):
    f = open(pubKeyFile,"r")
    data = f.read()
    f.close()
    gpg = gnupg.GPG()
    import_result = gpg.import_keys(data)
    public_key = gpg.list_keys()[0]

    f = open(inDataFile,"rb")
    decData = f.read()
    f.close()


    encrypted = gpg.encrypt(decData, public_key['fingerprint'],output=outputDatafile)
    print("encrypted?")
    print(str(encrypted.ok))
    print(str(encrypted.status))
    print(str(encrypted))

def doDecryptFile(privKeyFile, inDataFile, privPass,outputDatafile):
    f = open(privKeyFile,"r")
    data = f.read()
    f.close()
    gpg = gnupg.GPG()
    import_result = gpg.import_keys(data)
    public_key = gpg.list_keys()[0]

    f = open(inDataFile,"rb")
    decData = f.read()
    f.close()

    decrypted_data = gpg.decrypt(decData, passphrase=privPass,output=outputDatafile)
    print("decrypted?")
    print(str(decrypted_data.ok))
    print(str(decrypted_data.status))


gpg = gnupg.GPG()
key = do_key_generation(gpg, "helloWorld")

print(str(type(key)))

private_key = gpg.export_keys(key.fingerprint, True, passphrase='helloWorld')
public_key = gpg.export_keys(key.fingerprint)

with open('sample_public.asc', 'w') as f:
    f.write(public_key)

with open('sample_private.asc', 'w') as f:
    f.write(private_key)


doEncryptFile(r"sample_public.asc", "sampleFile.txt","sampleEncrypted.txt")
doDecryptFile(r"sample_private.asc", "sampleEncrypted.txt", privPass="helloWorld", outputDatafile="sampleDecrypted.txt" )

Upvotes: 0

Related Questions