python gnupg解密由于生成的密钥密码错误而失败

时间:2018-11-05 01:09:55

标签: python python-3.x encryption gnupg

我正在尝试使用here中的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.。密钥生成功能取自here。以这种方式使用它时,加密将按预期工作,并且我得到了ASCII编码的blob。

但是,当尝试解密文件时,解密失败。如果我不提供密码,则会从OpenPGP收到提示,提示我输入密码,因此它至少可以部分使用,但是解密失败,状态消息只是“解密失败”。如果我尝试在pinentry-qt GUI中手动输入“ helloWorld”密码,则错误消息为“密码错误”。我也尝试过对python-gnupg页面上所述的包含ASCII blob的输入文件使用decrypt_file,以获得相同的结果。

如果有帮助,我在Windows系统上使用Python 3。我还要注意,通过命令行使用gpg时,一切都会按预期进行。

1 个答案:

答案 0 :(得分:0)

您忘记将输出保存到文件中。

我在N+1output=中添加了gpg.encrypt选项,当然也添加了您的功能。

gpg.decrypt