我想知道如何使用 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 中——如果把它放在那里会更合适,我很抱歉。感谢您的评论!