是否可以将消息和 public 密钥从 stdin 传递到 gpg/gpg2?

Is it possible to pass both a message and a public key from stdin to gpg/gpg2?

如果我在进程内存中同时拥有消息 (M) 和 public 密钥 (P),那么在不写入临时中间文件的情况下使用 P 加密 M 的方法是什么?

有没有机会我可以将两者都传递到标准输入并使用一些棘手的协议 gpg(2) 支持从管道接受两者?

如果没有 - php 的其他替代方案是什么(请记住没有本机绑定并且不可能使用第 3 方扩展(它不在标准 ubuntu 存储库中并且支持自定义构建和自定义存储库太昂贵了))?

我不相信存在这样的机制。 GnuPG 希望将密钥环作为一个文件来执行公钥操作——我不相信它能够接受实际的 public 密钥来进行一次性加密操作,而它们不在密钥环中。

您首先必须将该 public 密钥导入密钥环,然后将该密钥环位置传递给 GnuPG —— 换句话说,您必须能够将它写到某个地方。如果你不想把它们放在磁盘上,你可以使用 /dev/shm,它是大多数 Linux 系统上的 ramdisk。

对大部分来说,这是我的回答similar question posted on Server Fault。已复制,因为跨站点复制是不可能的。

GnuPG 要求将您要使用的所有密钥导入密钥环。

如果您不想将它导入您的普通密钥环,请使用另一个(临时)密钥环,甚至是一个临时 GnuPG 主目录(这也将绕过任何配置)。如果您不想将密钥存储在硬盘上,请考虑使用 memdisk。

临时钥匙圈

设置--primary-keyring temporary.gpg默认使用(并在必要时创建)临时密钥环。它将在您的 GnuPG 主目录中创建(默认为 ~/.gnupg/temporary.gpg)。您的普通密钥环仍然可用,但导入将转到临时密钥环。想删就删。

例如:

gpg --primary-keyring temporary.gpg --import key.asc
gpg --primary-keyring temporary.gpg --recipient 0xDEADBEEF --encrypt
rm ~/.gnupg/temporary.gpg # can be omitted, not loaded by default

临时 GnuPG 主目录

这也将重置所有配置,并且可能有助于测试一些东西。设置 --homedir [folder] 或环境变量 $GNUPGHOME,导入密钥,执行任何操作,然后根据需要删除文件夹。

例如:

export GNUPGHOME=/tmp/gnupg # Or apply --homedir on each invocation
gpg --import key.asc
gpg --recipient 0xDEADBEEF --encrypt
rm -r $GNUPGHOME # Can be omitted
unset $GNUPGHOME

GnuPG 在权限方面非常挑剔,您可能需要对 $GNUPGHOME 文件夹应用更严格的权限才能执行所有操作。很可能保留一些游乐场-$GNUPGHOME

PHP 在 Ubuntu

中的 GnuPG

GnuPG 有一个官方 PHP PEAR 模块,它也是 packaged for Ubuntu in the official repositories,我强烈建议使用这个模块而不是手动构建 GnuPG 接口。