是否可以使用 GPG 将文件解密到标准输出而无需寄生信息(例如使用的密钥、提示输入密码)

是否可以使用 GPG 将文件解密到标准输出而无需寄生信息(例如使用的密钥、提示输入密码)

我已经搜索了好几天,但到目前为止还没有找到。也许我搜索的关键字不对。

我需要使用 GPG 来解密加密内存中的文件,而无需将解密的内容写入磁盘。

第三方软件将调用脚本 shell,提供加密内容和stdin密码作为参数。仅出于测试目的,我读取了一个 shell 变量

read pass

然后我输入了我的密码。

echo $pass | gpg  --passphrase-fd 0 --no-comment -q --no-verbose --decrypt fichier.chiffre.armor.gpg

这产生

You need a passphrase to unlock the secret key for
user: "Myself <[email protected]>"
2048-bit RSA key, ID 5F65F788, created 2019-02-22 (main key ID C7E00AC4)

message secret

我只希望获得message secret,而不是与解密相关的先前的文本。

如果我调用echo $pass | gpg --passphrase-fd 0 --no-comment -q --no-verbose --output decrypted.txt --decrypt fichier.chiffre.armor.gpg文件decrypted.txt仅包含message secret

我尝试使用/dev/stdoutas --output参数,但是失败了。

echo $pass | gpg  --passphrase-fd 0 --no-comment -q --no-verbose --output /dev/stdout --decrypt fichier.chiffre.armor.gpg


You need a passphrase to unlock the secret key for
user: "Myself <[email protected]>"
2048-bit RSA key, ID 5F65F788, created 2019-02-22 (main key ID C7E00AC4)

File `/dev/stdout' exists. Overwrite? (y/N)

关于如何仅使用 GPG 来实现这一点,您有什么想法吗?

谢谢,塞巴斯蒂安

答案1

我的 gpg 似乎没有输出与您的类似的信息消息,尤其是-q,但无论如何,如果如您所说,唯一的问题是您从 stderr 获得了额外的消息,您可以通过将其添加到您的命令中来消除它们(通过将 stderr 重定向到 /dev/null):

2>/dev/null

您可以重新使用 stdout,而不必担心安全擦除任何包含解密信息的临时文件。


[此外,--pinentry-mode loopback可能有助于避免某些提示]

答案2

实际上

You need a passphrase to unlock the secret key for
user: "Myself <[email protected]>"
2048-bit RSA key, ID 5F65F788, created 2019-02-22 (main key ID C7E00AC4)

没有写上stdout

当通过管道传输原始命令以sed 1,5d希望删除前 5 行时,它只会删除明文消息。

通过将输出重定向到文件,我们得到了我们需要的东西:

myself@myhost:~/gpg$ echo $pass | gpg  --passphrase-fd 0 --no-comment -q --no-verbose --decrypt fichier.chiffre.armor.gpg > toto.txt


You need a passphrase to unlock the secret key for
user: "Myself <[email protected]>"
2048-bit RSA key, ID 5F65F788, created 2019-02-22 (main key ID C7E00AC4)

myself@myhost:~/gpg$ cat toto.txt
message secret

stdout我对屏幕上所写的内容感到困惑。

相关内容