使用 PGP 很容易实现简单的转发否认:只需不签署您发送的电子邮件!任何人都可以发送包含任意内容和所谓发件人的电子邮件;签名专门用于取消前向否认。
但是,如果您不签名,您也会失去完整性。您想要的是能够发送这样一封电子邮件:
- 收件人可以合理地确定电子邮件来自他认为的发件人,并且在传输过程中没有被更改;
- 但是外部攻击者或收件人自己都没有获得任何可以向第三方证明所谓的发件人确实发送了电子邮件的证据。
像即时通讯这样的连接协议可以通过使用像Diffie-Hellman这样的协议建立的共享秘密来实现这些属性。当 Alice 和 Bob 共享秘密K(并使用身份验证来建立该共享知识),并且 Bob 收到一条带有正确MAC值且使用K的消息时,Bob 知道该消息来自 Alice,因为只有 Alice 和他自己知道K,而 Bob 自己也没有发送。然而,Bob 没有什么“令人信服”的东西可以展示,因为他知道K,他可以伪造所有的消息。
对于电子邮件,没有连接,因此没有半瞬时共享秘密:发件人和收件人共享的秘密值,从未存储在文件中,但仍保留用于多个连续的消息。但是,在OpenPGP 中,第 5.13 节有一种“使用 MAC 加密”的格式。该格式也非常灵活,因此可以构建一个包含以下内容的 OpenPGP 消息:
- 一个公钥加密的会话密钥包,其中包含一个用接收者的公钥加密的随机K ;
- 一个签名包,其中包括在前一个包上计算的签名(并且仅针对该包,而不是明文数据);
- 明文数据,作为“使用 MAC 加密”的数据包。
这样一封电子邮件将体现出具有完整性的前向否认性:从外部可以证明,所谓的发件人在一天之内至少向收件人发送了一封邮件;并且接收者可以显示K并且证明告诉发送者也知道K。但是,没有人可以证明任何特定的消息内容都是用K加密的。
不幸的是,尽管OpenPGP 格式可以支持很多组合,但这不一定是现有实现的情况(如GnuPG)。此外,“使用 MAC 加密”数据包使用廉价的自制 MAC(它只是附加数据的 SHA-1 哈希,并加密整个数据),这对我来说看起来不是很安全。我不知道对这种 MAC 结构的广泛研究,但我不会把我的最后一件衬衫押在它的坚固性上。
因此,您可以在PGP 中通过身份验证和完整性进行前向否认,但前提是相关软件支持这种特定组合,据我所知,它们不支持这种组合。然而。
在密码学研究中,还有另一种称为环签名的算法可以应用于该主题:使用环签名,发送者(Alice)计算一种特殊类型的签名,涉及她的私钥和接收者的公钥(Bob ),这样就可以从外部证明是 Alice 或 Bob 计算了签名,但究竟是哪一个人做的却是未知的。
目前在 OpenPGP 中没有定义对环签名的支持。