如果电子邮件文本已知,是否可以推断出 PGP 私钥?

信息安全 pgp
2021-08-27 09:56:15
  • 假设我向 A 人发送了一封 PGP 加密的电子邮件,向 B 人发送了未加密的同一封电子邮件(相同的主题行、相同的消息文本)。
  • 假设秘密服务截获了两条消息。
  • 特勤局从相同的主题行正确地假设两封邮件包含相同的文本。
  • 这是否使秘密服务能够推断出我或个人 A 的私钥,并解密我随后发给个人 A 的所有加密电子邮件?
4个回答

不,在这种情况下,私钥仍然是安全的:

  • 作为发件人,您的密钥根本不参与该过程。当您加密发给 A 的电子邮件时,您使用的是 A 的公钥,而不是您的私钥。如果您完全使用您的私钥,那将是对您发送的电子邮件进行签名,这是完全不同的。

  • 也不涉及 A 的私钥。您使用 A 的公钥进行加密。如果潜在的攻击者想知道一条消息m,以及如果用 A 的公钥加密这条消息会变成什么,那么......他可以自己做!A 的公钥是公开的,每个人都知道,每个人都可以用那个密钥加密东西。

  • 在加密机制的一般情况下,这样的系统应该能够抵抗攻击者可以学习几对(甚至许多)明文/密文对的情况。这些被称为已知明文攻击(攻击者学习明文/密文对),选择明文攻击(攻击者选择明文,并获得相应的密文)和选择密文攻击(攻击者选择密文并获得明文)。如果一对,甚至一百万对就足以破坏它,那么 PGP 将被认为是非常弱的。

首先,让我们看看 PGP 是如何工作的。摘自RFC4880

 OpenPGP combines symmetric-key encryption and public-key encryption
   to provide confidentiality.  When made confidential, first the object
   is encrypted using a symmetric encryption algorithm.  Each symmetric
   key is used only once, for a single object.  A new "session key" is
   generated as a random number for each object (sometimes referred to
   as a session).  Since it is used only once, the session key is bound
   to the message and transmitted with it.  To protect the key, it is
   encrypted with the receiver's public key.  The sequence is as
   follows:

   1.  The sender creates a message.

   2.  The sending OpenPGP generates a random number to be used as a
       session key for this message only.

   3.  The session key is encrypted using each recipient's public key.
       These "encrypted session keys" start the message.
   
   4.  The sending OpenPGP encrypts the message using the session key,
       which forms the remainder of the message.  Note that the message
       is also usually compressed.

   5.  The receiving OpenPGP decrypts the session key using the
       recipient's private key.

   6.  The receiving OpenPGP decrypts the message using the session key.
       If the message was compressed, it will be decompressed.

发送的文本使用某种对称加密进行加密,对称加密密钥使用接收方私钥进行加密。所以现在这个问题可以分解成两个问题:

  1. 对对称加密的已知明文攻击。
  2. 对非对称加密的已知明文攻击。

先问第一个。在 GnuPG 中,使用的一些对称算法 是:AES、Twofish、CAST5、DES3。这些算法使用 128 位的最小密钥大小,因此已知对这些算法的明文攻击是困难的。您可以在此线程中阅读有关 AES 的更多信息。

来到第二个问题,对非对称加密的攻击。ElGamal 和 RSA 用于 GnuPG。根据这个线程,已知的针对 RSA 的明文攻击是不可能的。

另外,也请看看这个问题

发送加密的 PGP 消息是(根据PGP 上的 Wiki 文章):

  1. T使用一次性随机生成的密钥(会话密钥)对消息进行对称加密算法加密S,得到密文E
  2. S使用接收者的公钥使用非对称加密算法加密会话密钥Pub(我们得到S');
  3. 发送E发送S'给收件人;
  4. 收件人然后可以S'用她的私钥解密Pr得到S,然后用S解密E得到T

据此,我假设获取收件人的私钥Pr同时具有T并且E是不可能的,因为非对称加密部分与密文或明文无关。

正如正确指出的那样,私钥不参与加密,问题中唯一涉及的场景是公钥,显然每个人都已经拥有公钥,所以安全机构是否拦截真的没关系无论是否公共 anc 加密消息,它都可以使用公钥加密任何它想要的东西。

然而,有趣的问题是明文消息是否已签名但未加密。那里使用了私钥,这就是已知明文、选择明文攻击所指的场景类型。人们相信 RSA 类型算法(基于有限域中的幂运算)可以抵抗这些攻击。这意味着即使知道明文找到私钥的复杂性基本上与尝试 2 到 2^4096 之间的每个数字相同(如果您的密钥长度为 4096 位)。这是因为素数的密度是 n/log n,所以几乎有 2^4096/4096 = 2^4084 个素数要测试。

但事实是,没有人知道一般来说是否不可能执行已知的明文攻击。有一些方法可以对所谓的“弱密钥”执行选定的明文攻击(例如,质数生成器是概率性的,因此您最终可能会得到一个非质数私钥,它基本上与其最大的质数分量一样弱)。但从来没有证明没有普遍的攻击,这只是一种信念。就像直到几年前才知道是否有一种方法可以测试一个数字是否在多项式时间内确定性地为素数,然后他们找到了一种方法(但在这种情况下,存在失败率非常低的概率算法)多项式和打破密钥没有这样的已知算法)