Ошибка расшифровки Python Gnupg из-за неверного пароля на сгенерированных ключах - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь использовать пакет Python gnupg из здесь для шифрования GPG. Я написал пример кода, чтобы убедиться, что я правильно использую API, но в большинстве существующих примеров пакета используется домашний каталог. Я хотел бы иметь возможность импортировать / экспортировать ключи и взаимодействовать с API через это.

Мой тестовый код ниже:

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")

В приведенном выше примере я вручную скопировал зашифрованный текст в sampleEncrypted.txt. Функция генерации ключа взята из здесь . При использовании этого способа шифрование работает должным образом, и я получаю ASCII-кодированный большой двоичный объект.

Однако при попытке расшифровать файл расшифровка не удалась. Если я не предоставляю парольную фразу, я получаю приглашение от OpenPGP, предлагающее мне ввести мой пароль, так что он по крайней мере частично работает, но дешифрование не выполняется, а сообщение о состоянии просто «дешифрование не удалось». Если я пытаюсь вручную ввести пароль «helloWorld» в графическом интерфейсе pinentry-qt, появляется сообщение об ошибке «Bad Passphrase». Я также попытался использовать decrypt_file с входным файлом, содержащим ASCII-блоб, как описано на странице python-gnupg, к тому же результату.

Я на Python 3 в системе Windows, если это имеет значение. Также отмечу, что при использовании gpg через командную строку все работает как положено.

1 Ответ

0 голосов
/ 05 ноября 2018

Вы забыли сохранить результаты в файл.

Я добавил опции output= к gpg.encrypt и gpg.decrypt и, конечно, к вашим функциям.

import gnupg

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

    input_data = gpg.gen_key_input(
        name_email='me@email.com',
        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" )
...