Python: 使用 GPG 和子进程的对称加密
Python: Symmetric Encryption with GPG and Subprocess
我正在尝试在 Python 中实现以下 bash 命令提供的功能。
echo "$DATA" | gpg --symmetric --armor --batch --passphrase "${KEY}"
到目前为止,我已尝试使用 subprocess
,但在传递数据时遇到困难。我尝试将其作为参数列表中的命令发送到 subprocess
,但这只是有效地回应了整个事情。
cmd = f"| gpg --symmetric --armor --batch --passphrase {key}".split()
temp = ["echo", f"\"{data}\""]
temp.extend(cmd)
res = subprocess.run(temp, stdout=subprocess.PIPE, universal_newlines=True)
encrypted = res.stdout.strip()
我也有兴趣使用 python-gnupg 模块,但还没有想出如何用它复制上面的内容。
在此先感谢您的帮助!
您可以将 input
参数用于 run()
/check_output()
:
from getpass import getpass
import subprocess
key = getpass("KEY: ")
data = b'Symmetric Encryption with GPG and Subprocess'
command = ["gpg", "--symmetric", "--armor", "--batch", "--passphrase", key]
out = subprocess.check_output(command, input=data, universal_newlines=False)
请注意,默认情况下,GNU echo
会附加一个换行符。使用 echo -n
不打印结尾的 \n
。无论哪种方式,您都需要在 Python.
中小心模仿这一点
如果有人想知道,我还得到了 python-gnupg
模块来为我的应用程序工作。我坚持使用 subprocess
答案,因为它减少了依赖性,但也想分享它。
gpg = gnupg.GPG()
encrypted = str(gpg.encrypt(data, recipients=None, symmetric=True, passphrase=key, extra_args=["--batch"]))
python-gnupg
模块历史悠久,存在严重的安全漏洞,由于决定使用 subproess
调用外部二进制可执行文件,它更有可能受到其中许多漏洞的影响。
相反,GnuPG 项目的建议是使用 GPGME C 的 CPython 绑定 API,它随 GPGME 源代码一起提供。
import gpg
from getpass import getpass
key = getpass("KEY: ")
c = gpg.Context(armor=True)
data = b"Symmetric encryption with GPGME."
ciphertext, result, sign_result = c.encrypt(data, sign=False, passphrase=key)
with open("some_file.txt.asc", "wb") as f:
f.write(ciphertext)
因为它使用对称加密,所以不会包含数字签名,也没有要检查的收件人密钥。这意味着 result
和 sign_result
都将 return None
。只有 ciphertext
包含任何东西,那就是 ASCII 装甲加密数据,可以像上面那样写入文件,也可以用它做其他事情。
该模块的文档非常出色,包含在 GPGME 源代码中,但在线草稿版本是 available here。
我正在尝试在 Python 中实现以下 bash 命令提供的功能。
echo "$DATA" | gpg --symmetric --armor --batch --passphrase "${KEY}"
到目前为止,我已尝试使用 subprocess
,但在传递数据时遇到困难。我尝试将其作为参数列表中的命令发送到 subprocess
,但这只是有效地回应了整个事情。
cmd = f"| gpg --symmetric --armor --batch --passphrase {key}".split()
temp = ["echo", f"\"{data}\""]
temp.extend(cmd)
res = subprocess.run(temp, stdout=subprocess.PIPE, universal_newlines=True)
encrypted = res.stdout.strip()
我也有兴趣使用 python-gnupg 模块,但还没有想出如何用它复制上面的内容。
在此先感谢您的帮助!
您可以将 input
参数用于 run()
/check_output()
:
from getpass import getpass
import subprocess
key = getpass("KEY: ")
data = b'Symmetric Encryption with GPG and Subprocess'
command = ["gpg", "--symmetric", "--armor", "--batch", "--passphrase", key]
out = subprocess.check_output(command, input=data, universal_newlines=False)
请注意,默认情况下,GNU echo
会附加一个换行符。使用 echo -n
不打印结尾的 \n
。无论哪种方式,您都需要在 Python.
如果有人想知道,我还得到了 python-gnupg
模块来为我的应用程序工作。我坚持使用 subprocess
答案,因为它减少了依赖性,但也想分享它。
gpg = gnupg.GPG()
encrypted = str(gpg.encrypt(data, recipients=None, symmetric=True, passphrase=key, extra_args=["--batch"]))
python-gnupg
模块历史悠久,存在严重的安全漏洞,由于决定使用 subproess
调用外部二进制可执行文件,它更有可能受到其中许多漏洞的影响。
相反,GnuPG 项目的建议是使用 GPGME C 的 CPython 绑定 API,它随 GPGME 源代码一起提供。
import gpg
from getpass import getpass
key = getpass("KEY: ")
c = gpg.Context(armor=True)
data = b"Symmetric encryption with GPGME."
ciphertext, result, sign_result = c.encrypt(data, sign=False, passphrase=key)
with open("some_file.txt.asc", "wb") as f:
f.write(ciphertext)
因为它使用对称加密,所以不会包含数字签名,也没有要检查的收件人密钥。这意味着 result
和 sign_result
都将 return None
。只有 ciphertext
包含任何东西,那就是 ASCII 装甲加密数据,可以像上面那样写入文件,也可以用它做其他事情。
该模块的文档非常出色,包含在 GPGME 源代码中,但在线草稿版本是 available here。