3

在非对称密码系统的标准使用中,使用公钥进行加密,使用私钥进行解密。

反过来,“用私钥加密”称为“签名”。

尽管有术语和缺乏直接工具,但标准工具允许实现使用私钥进行加密的加密系统。

谁能清楚地解释为什么这种解决方案容易受到攻击?

用户案例:

假设 Alice 想以一种非传统的方式向 Bob 发送一些东西:

爱丽丝和鲍勃曾经见过面,爱丽丝给了鲍勃一个“公钥”,这个“公钥”是由她创建的私钥生成的,但她警告鲍勃要保密。而且她将私钥保密,并且从未将公钥提供给其他任何人。

Bob 是否可以确定他从 Alice 那里收到的消息(假设这些消息是由 Alice 私钥加密的)只能由他读取(假设他真的将 Alice 的公钥副本保密)?

以及如何将这种加密可靠性与传统方式进行比较,在我们的例子中,传统方式是 Bob 向 Alice 发送消息(由 Alice 的公钥加密)?

问题是关于什么的

非对称密钥被命名为“私有”和“公共”这一事实无助于理解我的问题。密钥具有基础属性,是我在广播“公钥”,使其具有“公共”属性。请在回答之前明确区分:我不是在考虑这些密钥的“公共”和“私有”属性,而是“私有密钥”加密与“公共密钥”加密的可靠性。

即使在这种特殊情况下具有误导性,我也不能使用其他术语。

我知道这种情况是非传统的,可能会导致一些不一致,或者不是非对称加密系统的重点,因为 Bob 和 Alice 在这里共享某种共同的秘密,而这不是非对称加密的重点。

我看到几个 Stackoverflow 答案表明“私钥”和“公钥”是可交换的(请阅读下面的答案)。这对于 RSA 来说是不正确的,因为从密钥生成公钥是微不足道的,并且反过来保证在计算上不可行。对于非信徒,在 openssl 中使用 RSA 生成密钥的过程是:

  1. 生成密钥
  2. 从密钥中提取公钥。

如果“私钥”和“公钥”之间存在如此大的差异,那么“私钥”加密与传统的“公钥”加密之间是否存在稳固性差异?

长选答案的简短答案

对“私钥”到底是什么的误解对我没有帮助。“私钥”有两种不同的定义。“实用私钥”和“理论私钥”。

来自 RSA 理论的理论私钥与公钥具有数学对称性:

  • 你不能从另一个中推断出一个
  • 无论哪种方式,加密都同样可靠

出于效率原因,来自 RSA 工具(如 openssl)的实用私钥包含附加信息,并且通常,部分公钥甚至是按约定设置的。这些假设打破了对称性:

  • 从“实用私钥”中获取公钥是微不足道的
  • 但加密仍然同样可靠

有关更多详细信息,请参阅所选答案!如果仍有误解,请发表评论...

编辑说明:

  • 非对称加密系统密钥对经常被宣传为可交换的(即使在当前的 stackoverflow 答案中也是如此),我试图反思这样一个事实,即它可能是危险的误解,因为在现实生活工具中并非如此。
  • 添加了用户案例,我希望这能澄清我的问题
  • 添加了最终的“简短答案”
4

6 回答 6

10

在非对称密码系统的标准使用中,使用公钥进行加密,使用私钥进行解密。

这取决于谁在做什么。假设 Alice 想向 Bob 发送一条只有 Bob 可以解码的消息。Alice 使用 Bob 的公钥加密消息(在“公钥”的标准定义下,即除了其所有者之外的其他人都知道的密钥)。现在只有知道 Bob 的私钥的人(想必唯一知道 Bob 的私钥的人其实就是 Bob)才能解密 Alice 给 Bob 的消息。

如果 Alice 想让 Bob 知道只有她可以发送它,那么她可以用她自己的私钥加密该消息,假设 Bob 在用 Bob 的公钥加密消息之前或之后知道她的公钥。假设她用她的私钥加密消息,然后用 Bob 的公钥加密结果。为了阅读消息,Bob 必须用他(Bob 的)私钥解密消息,然后用 Alice 的公钥再次解密结果。如果他现在阅读的是合理的文本,他就知道知道 Alice 的私钥(可能是 Alice)和他的公钥(可能是任何人)的人发送了这条消息。

在实践中,非对称算法的计算成本很高,所以你真正要做的是选择一个适当长度的随机会话密钥和一个商定的标准对称加密算法,如 AES。然后用(相对较快的)对称算法对主消息进行加密,并作为消息的一部分发送。消息的另一部分是加密的或双重加密的随机会话密钥。Bob 可以解密消息的会话密钥部分以获得会话密钥;然后他用它来解密消息的主要部分。

请注意,如果您要向许多人发送消息,您可以使用适当的消息加密,然后使用收件人的公钥为每个收件人加密一次会话密钥。每个接收者只能使用属于他们的密钥解密会话密钥信息,但实际上所有人都可以解密它。如果消息很大(比如 2 MB 的 PDF),那么这比使用每个收件人的公钥单独加密消息要经济得多。

反过来,“用私钥加密”称为“签名”。

不; 签名是一个单独的操作。如果您阅读 Schneier 的“实用密码学”,您会看到作者建议使用一对公钥/私钥进行加密,使用第二对进行签名工作。例如,签名使用来自签名密钥的私钥对原始消息的固定长度散列进行加密。任何知道签名密钥的公钥部分的人都可以解密签名以获得原始消息的哈希值。据推测,同一个接收者也可以解密消息(使用签名密钥对的公钥),然后可以检查接收到的消息的哈希是否与从签名导出的哈希相匹配。任何不匹配都表明存在问题,应丢弃该消息。

有很多方法可以做这些事情 - 取决于安全要求。

但基本的一点是,一个人知道非对称密钥的私钥,并且可能很多人都知道非对称密钥的公共部分(这是非常安全的)。发件人可以使用收件人公钥对数据进行加密;发件人也可以使用自己的私钥对其进行加密。收件人可以使用自己的私钥解密收到的消息,如有必要,还可以使用发件人的公钥。


这个问题,即使在大约 2009-09-05T13:00-07:00 修正,也不完全连贯,IMNSHO。

您应该阅读“实用密码学”中的第 13 章“RSA”(可能也阅读了前面的一些章节 - 最值得注意的是第 3.3 节公钥加密)。

加密和解密符号

让我们定义一些符号来讨论正统的公钥密码术。让我们从基本的对称加密开始:

  • C = E(K,m) 是加密算法 E 在(明文)消息 m 上使用密钥 K 生成的加密消息(密文,C)。
  • P = D(K,C) 是由解密算法 D 使用密钥 K 对(加密的)消息 c 发现的纯文本消息(纯文本,P)。
  • 要成为一个工作系统,m = P,所以 D(K,E(K,m)) = m。

到目前为止,这种表示法适用于对称加密,因为相同的值 K 用于加密和解密。任何知道 K(和算法,但 Kerckhoff 的“密钥中的秘密”原则意味着您假设攻击者知道算法 - 任何相反的假设都是加密的“蛇油”)的人都可以解密消息。

在非对称加密系统中,E a和 D a是算法 A 的加密和解密方法。非对称密码的关键区别在于E a使用的密钥 K encrypt与 D 使用的密钥 K decrypt不同一个。此外,为了实用,即使您知道 K加密,推导出 K解密也必须在计算上不可行,反之亦然。

使用非对称加密,Alice 创建了一对密钥(S alice,P alice)。按照惯例,S alice是密钥,P alice是公钥。请注意,Alice 知道这两个密钥。重要的是:

  1. S alice和 P alice是不同的。
  2. Alice 不会让其他任何人知道其中一个密钥 (S alice );至关重要的是,其他任何人都不知道这些信息。
  3. Alice 可以让其他人知道另一个密钥(P alice),而不会损害系统的安全性。

类似地,Bob 将创建一对密钥 (S bob , P bob )。注意:

  • Bob 知道密钥 S bob、 P bob和 P alice
  • Alice 知道密钥 S alice、 P alice和 P bob

爱丽丝向鲍勃发送消息

现在,当 Alice 想向 Bob 发送一条消息 M alice-bob以便 Bob 可以读取它(但没有其他人可以)时,她必须使用 Bob 的密钥 P bob对其进行加密。因此,她创建了一条消息:

  • C alice-bob = E a (P bob , M alice-bob )

Bob 知道(从外部证据)消息是用 P bob加密的,所以他知道他必须用 S bob解密它:

  • M alice-bob = D a (S bob , C alice-bob )

然而,在这一点上,他只知道这条消息来自知道他的 P bob密钥的人。他不知道它来自爱丽丝,除非通过外部证据。

如果 Bob 和 Alice 同意必须对他们的消息进行加密,以便他们都确信收到的消息来自对方,那么他们都必须确信除了 Alice 之外没有人知道 S alice,并且除了 Bob 之外没有人知道鲍勃_ _ 他们还必须确信 Bob 知道 P alice并且 Bob 必须确信 P alice确实属于 Alice,并且 Alice 知道 P bob并且 Alice 必须确信 P bob确实属于 Bob。建立这些信任关系是 PKI(公钥基础设施)的主要内容。

假设满足这些标准,那么 Alice 可以将她的消息发送给 Bob,Bob 确信只有 Alice 可以发送它。如前所述,该机制是双重加密:

  • C1 alice-bob = E a (S alice ,M alice-bob )
  • C2 alice-bob = E a (P bob ,C1 alice-bob )

Alice 将 C2 alice-bob发送给 Bob(连同一些签名或 MAC 以确认它在传输过程中没有损坏),然后 Bob 计算:

  • D1 alice-bob = D a (S bob ,C2 alice-bob )
  • D2 alice-bob = D a (P alice ,D1 alice-bob )

如果一切都按计划进行,则 D2 alice-bob = M alice-bob

RSA 密钥对的机制

RSA 加密算法基于这样一个事实:如果您有两个公开的数字(它们是一个公钥的两个部分),即指数e和模数n,那么给定消息m,很容易计算c = m e mod n。然而,仅给定c(以及en )推导出m在计算上是不可行的。但是,如果您知道另一个指数d,那么您可以神奇地计算出r = c d mod nr = m如果您已经适当地计算了edn。在不知道其他信息的情况下从en计算d是不可行的。

在 RSA 加密方案下,您开始使用两个(大)随机确定的素数pq,它们的乘积是n。RSA 算法基于这样一个事实,即极难分解n (仅给出n确定pq);如果有人找到一种简单的方法来分解大数,那么 RSA 算法就会立即被破坏。

一旦你有了n,你需要确定指数ed使得:

  • ed = 1 mod t其中t = LCM(p-1, q-1),LCM 是最小公倍数。

您可以选择两个值之一作为小的奇数 - 例如,Schneier 和 Ferguson 建议e = 3。然后,您使用他们在书的大约 6 页中涵盖的一些计算来计算d 。通常,d将是一个相当大的数字。然后,您可以将 ( e , n ) 对发布为复合公钥,将值 ( p , q , t , d ) 作为私钥保密。给定en ,在不首先分解n的情况下推导出d在计算上是不可行的. “实用密码学”建议使用两个不同的对 ( e 1 , d 1 ) 和 ( e 2 , d 2 ),从相同的值n派生,您使用e 1加密消息,使用e 2进行数字签名;他们甚至建议对这些使用值 3 和 5。


OpenSSL 和密钥生成

我相信您对 OpenSSL 如何生成 RSA 密钥的描述令人困惑。

生成过程首先必须生成较大的随机素数,即上述符号中的pq。有一些随机方法可以确定给定的大数是否(可能)是素数;计算两个这样的素数需要一点时间。总而言之,它们首先用于计算n,然后是d(假设e是通过某种约定建立的)。您在 OpenSSL 中看到的两个阶段是确定n,然后确定d


用户案例剖析

问题说:

假设 Alice 想以一种非传统的方式向 Bob 发送一些东西:

爱丽丝和鲍勃曾经见过面,爱丽丝给了鲍勃一个“公钥”,这个“公钥”是由她创建的私钥生成的,但她警告鲍勃要保密。而且她将私钥保密,并且从未将公钥提供给其他任何人。

到现在为止还挺好。“公钥”不是很公开,但这并没有什么坏处。

Bob 是否可以确定他从 Alice 那里收到的消息(假设这些消息是由 Alice 私钥加密的)只能由他读取(假设他真的将 Alice 的公钥副本保密)?

如果加密技术有任何用途,那么是的;只有 Alice 和 Bob 可以阅读 Alice 用她的密钥加密的消息,因为只有 Alice 和 Bob 知道与她的密钥一起使用的公钥。

以及如何将这种加密可靠性与传统方式进行比较,在我们的例子中,传统方式是 Bob 向 Alice 发送消息(由 Alice 的公钥加密)?

困惑:该部分从讨论 Alice 向 Bob 发送消息开始;现在您已切换到 Bob 向 Alice 发送消息。

当 Bob 和 Alice 见面时,Alice 给了 Bob 她的 P alice公钥。据推测,鲍勃也给了爱丽丝他的 P bob公钥。并且两个公钥的公开流通都非常有限——这很好,但对系统的安全性并不重要。

现在,当 Bob 想向 Alice 发送一条消息时,他可以使用她的 P alice公钥对其进行加密,而 Alice(并且只有 Alice)可以使用她的 S alice密钥解密该消息。或者,Bob 可以用他的 S bob密钥加密消息,而 Alice 可以用 Bob 的 P bob公钥解密它。两组加密和解密都可以工作。

问题是关于什么的

非对称密钥被命名为“私有”和“公共”这一事实无助于理解我的问题。密钥具有基础属性,是我在广播“公钥”,使其具有“公共”属性。请在回答之前明确区分:我不是在考虑这些密钥的“公共”和“私有”属性,而是“私有密钥”加密与“公共密钥”加密的可靠性。

用正确的私钥加密和用正确的公钥解密与用正确的公钥加密和用正确的私钥解密一样可靠。区别在于谁可以做哪些操作。如果您清楚地了解谁在进行加密,谁在进行解密,以及谁知道哪些密钥,那么这些方法的保密性就变得相当清楚了。

即使在这种特殊情况下具有误导性,我也不能使用其他术语。

好吧,在您的情况下,“公钥”并不是那么广为人知,但这就是它的不寻常之处。

我知道这种情况是非传统的,可能会导致一些不一致,或者不是非对称加密系统的重点,因为 Bob 和 Alice 在这里共享某种共同的秘密,而这不是非对称加密的重点。

非对称加密方案的全部意义在于攻击者(通常称为 Eve,窃听者)是否知道公钥并不重要。只要 Alice 和 Bob 将私钥保密,就可以安全地发送消息。但是,您必须了解,如果 Alice 向 Bob 发送仅由 Alice 的密钥加密的消息,那么任何知道 Alice 的公钥的人(例如 Eve)都可以阅读该消息。除非 Eve 也知道密钥,否则 Eve 无法创建声称来自 Alice 的虚假消息 - 如果 Eve 发现 Alice 的密钥,Eve 可以随时假装是 Alice。但她能读懂。如果 Alice 向 Bob 发送仅由 Bob 的公钥加密的消息,那么只有 Bob 可以读取该消息(使用他的密钥),但是 Bob 无法知道它是真的来自 Alice,还是 Eve 假装是 Alice 发送的。这就是为什么你必须努力确保 Bob 知道只有 Alice 可以发送消息,并且 Alice 知道只有 Bob 可以阅读消息。

于 2009-09-04T21:26:04.810 回答
6

仅仅是因为当你加密某些东西时,你是在屏蔽它,以便只有一个人可以读取它(拥有私钥的人)。你没有那个人的私钥,你只有他们的公钥。

如果你用你的私钥加密它,任何人都可以用你的公钥解密它——这就是签名的原则——他们可以知道它是用你的私钥加密的!

于 2009-09-03T09:09:18.093 回答
3

更明确地说,“使用私钥加密”意味着要解密,您需要使用公钥。这不是问题,除非任何人都可以解密您的 [在此处插入项目],因为公钥就是:public保护数据没有用,这个系统是用来验证数据的。

例如,Alice 想向 Bob 发送一个文件(是的,是的,向我开枪)。Alice 不在乎其他人是否可以阅读她的文件,这不是机密文件,但她希望 Bob 确保她发送的内容就是他收到的内容。然后她可以用她的私钥加密她的文件,Bob 可以用她的公钥解密文件,确保文件没有被篡改。但如果其他人正在监听交易,他们也可以解密和读取文件。他们只是无法改变它。


对于您提供的情况,更好的方法是在它们相遇时交换密钥,以便实际上有两个密钥对。您自己提到,由于算法进行了优化,如果您尝试使用公钥进行加密,则 RSA 实际上并不能正常工作。如果这是其他算法的常见情况,我不会完全感到惊讶。它们被设计为以一种方式运行(私有/加密,公共/解密)并且是一种已知的“昂贵”操作,因此它们可能在现实中进行了大量优化。

除此之外,我认为您的计划没有任何安全问题......只要密钥真正保密。私有/公共只是基于典型用法的通用名称。没有什么可以强迫您将公钥完全公开。在您的情况下,您可能喜欢将它们称为“加密密钥”和“解密密钥”,但我不会同时使用每个密钥。事实上,出于 Jonathan Leffler 在他的评论中给出的原因,我建议你在你的程序中这样称呼它们:

“公钥”是可以由多人共享的东西。这就是“公钥”的定义。其他任何事情都非常令人困惑

于 2009-09-03T09:21:23.790 回答
1

我认为您错过了公钥/私钥加密的重点(至少据我了解)。

在您的情况下,对称加密也可以正常工作。使用非对称加密的原因是规模问题。

假设你有,不只是 Bob 和 Alice,还有字母表中每个字母的虚构人物。这些人希望能够向任何人发送消息,确保只有收件人才能阅读。使用正常的对称加密,这将需要每个人之间共享密钥,所以如果我们有来自字母镇的 26 个人,那就是26x25密钥,每个人都必须记住并保护 25 个秘密密钥。

输入对称(又名公钥/私钥)加密。现在每个人都有一个私钥和一个公钥,具有正常的规则。要向 Fred 发送消息,您需要查找他的(并且只有一个)公钥。然后你给他发信息。只有 Fred 可以阅读此消息。在这个方案中,你有26x2密钥,每个人只需要记住和保护1 个密钥。还需要有一个公钥来源,但这很容易。

使用您描述的非对称加密方式,为每组人使用一对密钥,然后将需要26x25x2密钥。

再说一次,它是关于可扩展性的。对称方案所需的密钥数量为N^2-N,而在非对称方案中,只有2*N.

于 2009-09-04T21:39:15.550 回答
0

我不知道是否存在版权问题,但我会从这个论坛引用“Valery Pryamikov” 。

签名和加密是两个不同的原型,具有不同的安全要求,其中需要不同的填充模式。使用短语“用公钥解密”是密码学历史上最令人讨厌的术语,布鲁斯·施奈尔 (Bruce Schneier) 的《应用密码学》一书广为流传。它本身应该用于描述具有消息恢复的签名方案(例如 RSA)。该短语还用于将非对称加密和签名调整为旧的协议验证模型,例如 BAN。但是,就其本身而言,这只是用词不当-每个人都知道公钥,而解密操作具有为内容提供隐私的意义-如果每个人都知道解密密钥,这是不可能的。

即使如此原始 RSA 允许交换公钥和私钥,但实际上它们不能交换。使用 CRT(中国剩余定理)实现私钥解密,以提供 4 倍更好的私钥操作性能。为此-您不仅需要指数,还需要对这些因子进行模数分解和乘法逆运算。公钥只有模数和指数,不能用于此类计算。

于 2009-09-03T11:39:54.800 回答
0

你在这里误用了这些术语。

如果密钥是真正的私有和公开的,那么是的,任何用私有密钥加密的东西都只能由公钥解密,但如果密钥是真正公开的,任何人都可以解密。

让我们忽略它。

这里的问题是鲍勃知道的。Bob 真的知道 Alice 是否将她的公钥发送给了其他人吗?如果不是,他不能保证只有他可以解密消息。技术中没有任何东西可以确保这一点。任何由 Alice 的私钥加密的东西都可以用她的公钥解密,因此任何拥有该密钥的人都可以解密。根据公钥的本质,应该是任何人。

确保给 Bob 的消息只能由 Bob 解密的唯一方法是让 Bob 给 Alice 他的公钥,并让 Alice 用他的公钥加密她想要发送给 Bob 的所有内容,这将使数据无法通过以下方式解密除了鲍勃以外的任何人。她是否也用她的私钥加密相同的数据(即签署数据)不是重点。

当然,鲍勃同样无法知道爱丽丝没有将完全相同的消息发送给其他任何人,并为其他人的公钥对其进行加密。

于 2009-09-04T21:03:08.353 回答