GnuPG 的前向保密

信息安全 gnupg 密钥交换 前向保密
2021-09-06 09:45:06

我想知道如何使用 GnuPG 实现前向保密,我想我需要某种经过身份验证的密钥交换。假设我已经有以下工作:

  • Alice 和 Bob 都生成了自己的常规非对称密钥对
  • Alice 拥有 Bob 的公钥,Bob 拥有 Alice 的公钥
  • Alice 和 Bob 已验证他们拥有正确的密钥,因此彼此信任
  • Alice 可以发送使用 Bob 的公钥进行非对称加密的消息,Bob 可以解密、读取和验证签名(反之亦然)

我想解决的问题是,如果有人设法截获并存储了上周的加密消息,并随后设法从 Alice 或 Bob 那里获得了相应的私钥,那么他们就可以解密并读取旧消息。我希望使用临时会话密钥(协商但未发送)这将不再可能,因为上周的消息将使用随机会话密钥进行对称加密,并且此会话密钥从未在任何消息中发送。

我相信这需要像 Diffie-Hellman 这样的经过身份验证的密钥交换 (AKE),那么我的程序可以使用 GnuPG 作为库吗?

  • 生成合适的随机令牌
  • 此令牌与私钥的组合
  • (然后程序负责将临时数据存储在内存中,并传输加密、签名的消息)
  • 将对方收到的(token+key)与自己的私钥组合起来给出临时会话密钥k
  • 将此同意k用作对称会话密钥

理想情况下,此会话密钥不需要添加到任何密钥环中,并且创建它会比生成非对称密钥对快得多。

困惑

根据https://gnupg.org/faq/gnupg-faq.html#compatible上的常见问题解答:

“Diffie-Hellman”就是 PGP 所说的 Elgamal 加密算法。如果您的 PGP 生成的密钥对使用 Diffie-Hellman 加密子密钥,它将在 GnuPG 中显示为 Elgamal 子密钥。

但根据https://gnupg.org/gph/en/manual.html#AEN26上的手册,ElGamal 的密钥生成会生成一个密钥对:

选项 4 创建单个 ElGamal 密钥对,可用于制作签名和执行加密。

这使它听起来像一个非对称密钥对,这不是我想要的,而且听起来它也会被添加到密钥环中,这听起来不受欢迎且效率低下。所以我对 GnuPG 所说的“ElGamal”的含义有点困惑,我不明白如何将密钥交换协议视为等同于加密算法。

结论

感谢森林在下面的回答,我知道这是不可能的,即使 GnuPG 似乎有能力完成所需的数学运算。我把它打开了一会儿,以防其他人知道方法。

我将不得不进一步研究 OTR,这显然是一个单独的问题。

在问了这个问题后,我也意识到也许我应该把它放在 crypto.stackexchange 中——如果把它放在那里会更合适,我很抱歉。感谢您的评论!

1个回答

有这样的吗?

实际上有一个专门针对此操作的草案,名为Forward Secrecy Extensions for OpenPGP该草案的要点是必须为每条消息创建临时密钥,并在使用后安全删除。这会遇到一些问题。最重要的是,OpenPGP 扩展将无法保证从存储设备中安全地删除数据。许多存储设备不允许在原地擦除数据。这是通过固态驱动器作为磨损均衡的一种形式来完成的,目的是减少任何单个存储区域的磨损。某些文件系统采用一种技术来提高发生崩溃时的可靠性,称为写时复制这具有导致写入同一位置的副作用不会覆盖以前存在的数据。此外,许多系统会对其状态进行快照,从而破坏了安全擦除密钥的目的。

是什么让 PGP 难以实现前向保密?

PGP 和TLS 之类的主要区别在于TLS 速度很快。您可以确信握手将在一两秒钟内完成。这允许您将临时密钥材料完全存储在内存中。另一方面,PGP 加密的消息可能会无限期地处于未读状态,从而增加了密钥被盗的机会。因此,前向保密对于在单个会话中开始和完成密钥交换的实时系统很容易实现,但在无法保证消息将被快速读取的高度异步系统上实现起来要困难得多。

总体而言,PGP 难以与前向保密一起使用的主要原因是:

  • PGP 是交互式的,因此您不能仅将临时密钥保留在内存中一瞬间。
  • 密钥必须存储在非易失性存储设备上,此时安全擦除是不确定的。

可能的替代方案

您现在拥有的最可行的替代方案是拥有相当短暂的加密子密钥。创建一个长期有效的主密钥,最好存储在外部设备上(因此可以防止泄露)。子密钥应保留较短的时间,并在最短时间后撤销,例如一个月或一打消息。撤销密钥时,更新您的公钥以包含新生成的子密钥。与您通信的人需要定期更新他们的公钥副本才能与您通信。您需要了解您的系统是如何工作的,以避免在您的设备上留下以前私钥的痕迹。这可以通过将它们保存在不同的智能卡上来缓解,因为它们旨在存储这些密钥,并且通常还可以在收到通知时安全地擦除它们。GnuPG 支持使用智能卡作为密钥材料的来源。

您还可以使用OTR,它允许使用前向保密进行实时加密通信。它是用于各种消息系统的插件,使用 Diffie-Hellman 密钥交换和 AES 加密数据。目前,各种社交媒体消息传递应用程序(例如 Facebook 的 messenger)以及 IRC 和 XMPP 都支持它。还有一个Pidgin插件,一个支持多种协议的聊天客户端。Pidgin 支持的任何协议都可以使用 OTR 进行加密。