如何导出私有/秘密 ASC 密钥以解密 GPG 文件

Posted

技术标签:

【中文标题】如何导出私有/秘密 ASC 密钥以解密 GPG 文件【英文标题】:How to Export Private / Secret ASC Key to Decrypt GPG Files 【发布时间】:2011-08-01 01:05:24 【问题描述】:

背景:我的老板曾尝试将 ASC 密钥与公共和私人部分一起导出给我,但每当我得到文件时,私人部分永远不会加载,也不会解密任何文件。

我们已尝试使用以下方法导出 ASC 密钥:

Windows 应用程序 Kleopatra 2.1(包含在 gpg4win 中)

Windows 应用程序 GNU 隐私助手(包含在 gpg4win 中)

        Error: "Decryption failed. Secret Key Not available." 

如何正确导出秘密或私有 asc 密钥来解密 gpg 文件?

【问题讨论】:

【参考方案1】:

您可以使用command-line tool from GPG 导出私钥。它适用于 Windows 外壳。使用以下命令:

gpg --export-secret-keys

使用--export 的正常导出将不包含任何私钥,因此您必须使用--export-secret-keys

编辑:

总结一下我的 cmets 中给出的信息,这是允许您将 ID 为 1234ABCD 的特定密钥导出到文件 secret.asc 的命令:

gpg --export-secret-keys --armor 1234ABCD > secret.asc

您可以使用以下命令找到您需要的 ID。 ID 是第二列的第二部分:

gpg --list-keys

仅导出 1 个特定密钥而不是全部:

gpg --export-secret-keys keyIDNumber > exportedKeyFilename.asc

keyIDNumber 是您尝试导出的所需密钥的密钥 ID 号。

【讨论】:

@Brian:这会将密钥转储到控制台。如果要将其存储在文件中,可以将输出重定向到任意文件名(“gpg --export-secret-keys > secret.asc”)。 @Brian:这会为您提供 ASCII 而不是二进制的输出。如果你把它保存在一个文件中,那并不重要。但是一旦你想以任何其他方式传递它,ASCII 版本更容易处理(例如在电子邮件中内联发送它) 也许你想把你的密钥带到另一个地方。在这种情况下,您应该加密导出的数据:“gpg --export-secret-keys keyIDNumber | gpg -c >encrypted”用“gpg -o unencrypted encrypted”解密它。 从 GnuPG 导出的密钥仍然是加密的(这就是您不需要输入私钥密码的原因),因此真的不需要再次加密。 @FerryBoender Are you sure about that?【参考方案2】:

以上所有回复都是正确的,但可能缺少关键步骤,您需要编辑导入的密钥并“最终信任”该密钥

gpg --edit-key (keyIDNumber)
gpg> trust

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

并选择 5 以启用导入的私钥作为您的密钥之一

【讨论】:

【参考方案3】:

看黑獭的治疗

https://montemazuma.wordpress.com/2010/03/01/moving-a-gpg-key-privately/

如果站点关闭,请参考 archive.org 备份:

https://web.archive.org/web/20170518155052/https://montemazuma.wordpress.com/2010/03/01/moving-a-gpg-key-privately/

其中包括一种相当安全的密钥传输方式。您可以将该建议放入如下所示的 shell 脚本中以供重复使用。

首先从显示的列表中获取你想要的KEYID

$ gpg -K

从结果列表中记下传输所需的 KEYID(秒后的 8 个十六进制数)。

然后在第一个帐户上调用经过测试的 shell scipts "export_private_key" 并生成您的 pubkey.gpg + keys.asc。随后调用第二个帐户“import_private_key”。这是他们用 cat 显示的内容(复制和粘贴内容):

$ cat export_private_key 
gpg -K
echo "select private key"
read KEYID
gpg --output pubkey.gpg --export $KEYID
echo REMEMBER THE COMING PASS-PHRASE
gpg --output - --export-secret-key $KEYID | \
   cat pubkey.gpg - | \
   gpg --armor --output keys.asc --symmetric --cipher-algo AES256
ls -l pubkey.gpg keys.asc
####################  E X P O R T _ P R I V A T E _ K E Y  #####################

现在通过某种方式将“pubkey.gpg”(如果需要)和私有“keys.asc”转移到第二个帐户并启动下面显示的程序。

$ cat import_private_key 
gpg --no-use-agent --output - keys.asc | gpg --import
###################  I M P O R T _ P R I V A T E _ K E Y  ######################

本着 Otter 的精神“那个,应该是,那个”。

【讨论】:

感谢您将公钥和私钥包含在一个受密码保护的文件中的脚本。让我的生活更美好! 选项 --no-use-agent 在 gpg 版本 2 中已过时。【参考方案4】:

我认为你还没有导入私钥,正如消息错误所说,要从 gnupg 导入公钥/私钥:

gpg --import mypub_key
gpg --allow-secret-key-import --import myprv_key

【讨论】:

我在询问是否要从可以工作的计算机导出...您只能在本地服务器上导入密钥。 @Brian McCarthy:你想说什么? 如果私钥已经导入,我们真的需要导入公钥吗?据我了解,任何东西都可以从私钥中生成公钥。 @farhany 我认为是的,因为您在签名时需要它。【参考方案5】:

这最终对我有用:

   gpg -a --export-secret-keys > exportedKeyFilename.asc 

您可以使用任何名称命名 keyfilename.asc,只要您保留 .asc 扩展名即可。 此命令将用户计算机上的所有密钥复制到调用该命令的工作目录中的 keyfilename.asc。

仅导出 1 个特定密钥而不是全部:

   gpg -a --export-secret-keys keyIDNumber > exportedKeyFilename.asc

keyIDNumber 是您尝试导出的所需密钥的密钥 ID 号。

【讨论】:

您可以使用“--list-keys”列出所有可用的键。第二列将包含诸如“2048g/1234ABCD”之类的 ID。找到所需的密钥并使用“gpg --export-secret-keys 1234ABCD > secret.asc”将其导出,当然要使用正确的 ID 更改 1234ABCD。您还可以添加“-a”标志。它使用 ASCII 字符写入输出,以防二进制输出引起问题。 @demento,感谢您提供额外的反馈...我将其添加到答案中 如果你真的想要 asc,你仍然需要 -a 然后如何将它们导入另一台计算机? @Natim 我想您将exportedKeyFilename.asc 带到另一台计算机,然后在包含.asc 文件的目录中执行gpg --allow-secret-key-import --import exportedKeyFilename.asc。见:unix.stackexchange.com/questions/184947/…【参考方案6】:

类似于@Wolfram J 的回答,这是一种加密您的私钥with a passphrase 的方法:

gpg --output - --armor --export $KEYID | \
    gpg --output private_key.asc --armor --symmetric --cipher-algo AES256

以及对应的解密方法:

gpg private_key.asc

【讨论】:

不幸的是,如果您的密钥最初是密码短语,这将不起作用。我提出了一个问题:github.com/open-keychain/open-keychain/issues/2723【参考方案7】:

1.导出一个密钥(这是你老板应该为你做的)

gpg --export-secret-keys yourKeyName > privateKey.asc

2.Import Secret Key(导入你的私钥)

gpg --import privateKey.asc

3.尚未完成,您仍然需要最终信任密钥。 您需要确保最终也信任密钥。

gpg --edit-key yourKeyName

输入trust、5、y,然后退出

来源:https://medium.com/@GalarnykMichael/public-key-asymmetric-cryptography-using-gpg-5a8d914c9bca

【讨论】:

以上是关于如何导出私有/秘密 ASC 密钥以解密 GPG 文件的主要内容,如果未能解决你的问题,请参考以下文章

kubernetes:gpg 解密后,来自秘密 yaml 的值在节点 js 容器中被破坏

给定会话密钥和秘密,我们如何解密 Rails cookie?

导出不带密码的 gpg 密钥

安全与加密-使用gpg实现加密与解密

无法使用前端 xxx 解决:rpc 错误:代码 = 未知 desc = (...) 输出:`退出状态 2:gpg:解密失败:没有密钥`

openssl加解密原理