使用外部密钥解密加密的GPG文件

15

我使用 gpg 加密了一个文件,现在想解密该文件。

是否有方法可以在不导入秘钥文件的情况下解密该文件?

我们有一个名为 key.sec 的文件包含了秘钥;我们能否将该秘钥文件作为参数传递给 gpg(当我们从 bash 命令行运行 decrypt 命令时)以便解密加密的文件?还是必须先导入秘钥再解密加密的文件?


1
相关链接:http://unix.stackexchange.com/questions/104941/is-there-a-way-to-embed-a-gpg-public-key-in-a-script-without-adding-it-to-the-ke 和 http://lists.gnupg.org/pipermail/gnupg-users/2004-October/023409.html - Ciro Santilli OurBigBook.com
3个回答

12

您必须将密钥添加到密钥环中。根据gpg(1)文档的描述:

   --no-default-keyring
          Do not add the default keyrings to the list of
          keyrings. Note that GnuPG will not operate without any
          keyrings, so if you use this option and do not provide
          alternate keyrings via --keyring or --secret-keyring,
          then GnuPG will still use the default public or secret
          keyrings.

您可以执行--import --no-default-keyring --secret-keyring temporary来导入密钥,在解密内容时使用--secret-keyring temporary,完成后删除~/.gnupg/temporary.gpg文件。但这只是一个解决办法。


一个 key.sec 不会自己制作只有一个密钥的钥匙扣吗?还是我混淆了协议? - Maarten Bodewes
2
@owl:我从未深入研究过GPG,以确定单个孤立的密钥是否“是”密钥环,但我会感到惊讶;句子“请注意,没有任何密钥环,GnuPG将无法运行”似乎是一个含糊不清的陈述,即孤立的密钥不是密钥环。 - sarnold
2
请注意,在GnuPG 2.1中,“--secret-keyring”已经过时且无效。没有所谓的“秘密密钥环”,私钥存储在一个名为“private-keys-v1.d”的目录中,该目录由“gpg-agent”拥有和操作。 - starfry
@starfry,如果你足够熟悉gnupg2,请考虑在这里添加一个新的答案。(并请回复评论,这样我就可以回来并点赞 :)) - sarnold
@sarnold,我已经添加了一个更详细的答案。 - starfry

9

您必须导入密钥才能使用它,但是GnuPG 2.x版本管理秘密密钥的方式已经改变。现在有一个gpg-agent守护程序来处理秘密密钥访问,从2.1版本开始,它的使用是强制性的。

以下是快速创建临时密钥环以使用包含在文件中的秘密密钥进行解密的方法:

$ mkdir -m 700 ~/.gnupg-temp
$ gpg --homedir .gnupg-temp --import key.sec
$ gpg --homedir .gnupg-temp -d an_ecrypted_file

如果你想进行后续清理,请停止代理并删除该目录:

$ gpg-connect-agent --homedir .gnupg-temp KILLAGENT /bye
$ rm -r ~/.gnupg-temp

曾经有一个选项--secret-keyring,关于此选项,版本2.1的文档中有如下说明:

此选项已过时且被忽略。所有保密密钥存储在位于GnuPG主目录下的private-keys-v1.d目录中。

private-keys-v1.d目录(位于--homedir~/.gnupg内)由代理所有和操作。


2
Mohammed的目标似乎是将其公钥和私钥分开。毕竟,我们是否想让密钥与用于加密数据的数据保存在一起呢?因此,Mohammed和其他10,650多人(在我撰写此文时)对其可行性感兴趣。确实是可以做到的,以下是操作方法:
公开托管只有两个钥匙:它们都是公钥
您的GPG公钥用于加密数据。 您的SSH公钥在.ssh/authorized_keys中,以便进行非交互式登录。
通过公私钥分离来回传加密文件: 在具有秘密密钥的主机上执行以下bash代码片段,该代码片段将通过scp从DMZ主机获取加密文件,并将gpg解密的标准输出涂抹回DMZ主机到一个文件中,以便读取/操作。已经测试并且已知能够正确运行。
echo "$(gpg -d $(scp myuser@192.168.1.10:/home/myuser/test-gpg.txt.asc .;ls ./test-gpg.txt.asc))" | ssh myuser@192.168.1.10 'cat > /home/myuser/test-gpg.txt'

注意,一旦解密开始,你仍然会被要求输入密码。但是一旦提供了密码,脚本就会继续并将解密的gpg流注入到DMZ主机上的文件中。
不要忘记在需要读取其内容的操作完成后,使用rm test-gpg.txt删除解密文件。
因此,非常有可能将你的秘钥与公共可访问主机分开,在DMZ之外的主机上安全地保管你的秘钥。希望这有帮助- Terrence Houlahan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接