使用`os.system`调用gpg时如何传递加密的消息和密码?

时间:2019-04-21 06:18:02

标签: python-3.x ubuntu encryption gnupg

我在python中有一条加密的消息作为字符串。我想用一个叫做gpg的程序解密它。

在终端中,使用gpg需要:

  1. gpg --decrypt -a
  2. 然后它会提示您输入加密的消息
  3. 然后提示输入私钥。

enter image description here

当加密的消息保存在python的变量中时,是否有办法在python中完成所有这些操作?我知道您使用os模块向其他程序发出终端命令。

import os
import getpass
message = '093j0rawrkj2or2r'
private_key = getpass.getpass()
os.system("gpg --decrypt -a")
...?

1 个答案:

答案 0 :(得分:0)

要输入加密的字符串,您可以先echo将其加密,然后通过管道输入gpg命令。

echo <message> | gpg --decrypt ...

要输入密码,有多种方法depending on your env and gpg version。在我的 Ubuntu 18.04.2 gpg 2.2.4 上起作用的是使用--pinentry-mode=loopback,然后传入--passphrase

gpg --decrypt -a --pinentry-mode=loopback --passphrase="yourpassphrase" 

Python代码将如下所示:

import os

message = '093j0rawrkj2or2r'
command = "echo '{}' | gpg --decrypt -a --pinentry-mode=loopback --passphrase=yourpassphrase".format(message)
os.system(command)

但是放置实际的--passphrase-yourpassphrase是非常不安全的。另一种选择是将密码短语放入某个文件中,然后使用--passphrase-file选项。

import os

message = '093j0rawrkj2or2r'
command = "echo '{}' | gpg --decrypt -a --pinentry-mode=loopback --passphrase-file=yourpassphrasefile".format(message)
os.system(command)

我不知道您在哪里收到加密的消息,但是我通常使用加密的文件。如果加密的输入来自文件,只需将echo <string>替换为cat <filepath>

cat somefile.txt | gpg --decrypt -a --pinentry-mode=loopback --passphrase-file=yourpassphrasefile