代码之家  ›  专栏  ›  技术社区  ›  vaab

为什么我们不应该在非对称密码系统中用私钥加密?

  •  3
  • vaab  · 技术社区  · 15 年前

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

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

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

    有人能清楚地解释为什么这种解决方案是脆弱的吗?

    用户案例:

    考虑到Alice想以非传统方式向Bob发送一些东西:

    爱丽丝和鲍勃曾经见过面,爱丽丝给了鲍勃一把“公钥”,是由她创建的一把私钥生成的,但她警告鲍勃要保守秘密。她把这把私人钥匙保密,从来没有把这把公共钥匙给任何人。

    Bob能确定他从Alice收到的信息(前提是这些信息是用Alice私钥加密的)只能被他阅读(前提是他真的对Alice的公钥保密)?

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

    问题是什么

    非对称密钥被命名为“private”和“public”这一事实无助于理解我的问题。密钥具有底层属性,而正是我广播的“公钥”赋予了它“公共”属性。请在回答之前明确区分:我不考虑这些密钥的“公共”和“私有”属性,而是考虑“私有密钥”加密与“公共密钥”加密的牢固性。

    我不能用另一个术语,即使它在这个特殊情况下是误导性的。

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

    我看到了几个stackoverflow答案,它们表明“private key”和“public key”是可交换的(请阅读下面的答案)。对于RSA来说,这是不正确的,因为从密钥生成公钥是很简单的,而且这在另一方面保证在计算上不可行。对于不信教的人,openssl with rsa中的密钥生成过程是:

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

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

    从长选择的答案中得到短答案

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

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

    • 你不能从另一个推论出来
    • 加密在任何方面都同样可靠

    实用私钥 从RSA工具(如openssl)中,出于效率的考虑,包含了额外的信息,而且通常,公钥的一部分甚至是由约定设置的。这些假设打破了对称性:

    • 从“实用私钥”中获取公钥是很简单的
    • 但加密仍然同样可靠

    有关详细信息,请参阅所选答案!如果误解仍然存在,请评论…

    编辑注释:

    • 不对称加密系统密钥对经常被宣传为可交换的(即使在当前的stackoverflow答案中),我试图围绕这样一个事实进行反思:这可能是一个危险的误解,因为现实生活中的工具并非如此。
    • 添加了用户案例,希望这能澄清我的问题
    • 增加了最后的“简短回答”
    6 回复  |  直到 14 年前
        1
  •  8
  •   Jonathan Leffler    15 年前

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

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

    如果Alice希望Bob知道只有她可以发送消息,那么她可以使用自己的私钥加密消息,假设Bob知道她的公钥,无论是在用Bob的公钥加密消息之前还是之后。假设她用她的私钥加密消息,然后用Bob的公钥加密结果。要读取消息,Bob必须用他的(Bob的)私钥解密消息,然后用Alice的公钥再次解密结果。如果他现在读到的是合理的文本,他知道知道知道爱丽丝的私钥(大概是爱丽丝)和他的公钥(可能是任何人)的人发送了这条消息。

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

    请注意,如果要向许多人发送邮件,则可以对邮件进行一次正确的加密,然后使用收件人的公钥为每个收件人加密一次会话密钥。每个收件人只能使用属于他们的密钥来解密会话密钥信息,但实际上所有人都可以对其进行解密。如果消息很大(比如2 MB的pdf),那么这比用每个接收者的公钥分别加密消息要经济得多。

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

    不;签名是一个单独的操作。如果你读了施耐尔的 Practical Cryptography “,您将看到作者建议使用一对公钥/私钥进行加密,第二对用于签名工作。例如,签名使用签名密钥中的私钥加密原始消息的固定长度哈希。任何知道签名密钥的公钥部分的人都可以解密签名以获取原始消息的散列值。大概,同一个接收者也可以解密消息(使用签名密钥对的公钥),然后可以检查接收到的消息的散列是否与从签名派生的散列相匹配。任何不匹配都表示有问题,应丢弃该消息。

    根据安全性要求,有很多方法可以做到这些事情。

    但最基本的一点是,一个人知道非对称密钥的私钥,而且可能有许多人知道非对称密钥的公共部分(这是完全安全的)。数据可以由发送方使用收件人公钥加密;也可以由发送方使用自己的私钥加密。接收者可以使用自己的私钥解密接收到的消息,必要时还可以使用发送者的公钥。


    这个问题,即使在2009-09-05t13:00-07:00进行了修正,也不完全一致,imnsho。

    您应该阅读“实用密码学”中的第13章“RSA”(可能在阅读了前面的一些章节之后,尤其是第3.3节公钥加密)。

    加密和解密符号

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

    • c=e(k,m)是由加密算法e使用密钥k on(纯文本)消息m生成的加密消息(密文,c)。
    • p=d(k,c)是通过解密算法d使用密钥k在(加密)消息c上发现的纯文本消息(纯文本,p)。
    • 作为一个工作系统,m=p,所以d(k,e(k,m))=m。

    到目前为止,这个符号应用于对称加密,因为在加密和解密中都使用相同的值k。任何知道k的人(以及算法,但是Kerkhoff的“密钥中有秘密”原则意味着你假设攻击者知道算法——任何相反的假设都是加密的“蛇油”)可以解密消息。

    使用非对称加密系统,e D 是算法A的加密和解密方法。非对称密码的密钥区别特征是密钥K 加密 e使用 与K键不同 解密 D使用 . 此外,为了实用,推导k必须是计算上不可行的。 解密 即使你知道K 加密 反之亦然。

    通过非对称加密,Alice创建了一对密钥, 爱丽丝 ,P 爱丽丝 )按惯例,S 爱丽丝 是密钥和P 爱丽丝 是公钥。注意爱丽丝知道这两把钥匙。重要的是:

    1. S 爱丽丝 和P 爱丽丝 是不同的。
    2. 爱丽丝不让任何人知道其中一把钥匙 爱丽丝 );这一信息对于其他人来说是至关重要的。
    3. 爱丽丝可以让别人知道另一把钥匙(P 爱丽丝 )不影响系统的安全性。

    同样,Bob将创建一对密钥, 鲍勃 ,P 鲍勃 )注意:

    • 鲍勃知道钥匙 鲍勃 ,P 鲍勃 和P 爱丽丝 .
    • 爱丽丝知道钥匙 爱丽丝 ,P 爱丽丝 和P 鲍勃 .

    爱丽丝给鲍勃发了个信

    现在,当爱丽丝想发信息的时候,M 爱丽丝鲍勃 ,为了让鲍勃能读到它(但其他人都不能读),她必须用鲍勃的密钥P加密它。 鲍勃 . 因此,她创造了一个信息:

    • C 爱丽丝鲍勃 = e (P) 鲍勃 ,米 爱丽丝鲍勃 )

    Bob(从外部证据)知道消息是用p加密的 鲍勃 所以他知道他必须用S解密 鲍勃 :

    • 爱丽丝鲍勃 = D (S) 鲍勃 ,C 爱丽丝鲍勃 )

    然而,在这一点上,他所知道的信息是,它来自于一个了解他的P的人。 鲍勃 关键。他不知道它来自爱丽丝,除非是通过外在的证据。

    如果Bob和Alice同意对他们的消息进行加密,使他们都确信收到的消息来自另一方,那么他们都必须确信除了Alice以外没有人知道S 爱丽丝 除了鲍勃没有人知道 鲍勃 . 他们还必须确信 爱丽丝 鲍勃和鲍勃都知道 爱丽丝 真的属于爱丽丝 鲍勃 爱丽丝知道,爱丽丝必须相信 鲍勃 确实属于鲍勃。建立这些信任关系是PKI(公钥基础设施)的一个重要组成部分。

    假设满足这些条件,那么Alice可以以Bob确信只有Alice可以发送消息的方式向Bob发送消息。如前所述,该机制是双重加密:

    • C1 爱丽丝鲍勃 = e (S) 爱丽丝 ,米 爱丽丝鲍勃 )
    • 指挥控制 爱丽丝鲍勃 = e (P) 鲍勃 C1 爱丽丝鲍勃 )

    爱丽丝发送C2 爱丽丝鲍勃 给Bob(连同一些签名或Mac以确认它在传输过程中没有损坏),然后Bob计算:

    • D1 爱丽丝鲍勃 = D (S) 鲍勃 C2 爱丽丝鲍勃 )
    • D2 爱丽丝鲍勃 = D (P) 爱丽丝 D1 爱丽丝鲍勃 )

    如果一切都按计划进行,d2 爱丽丝鲍勃 = m 爱丽丝鲍勃 .

    RSA密钥对的机制

    RSA加密算法基于这样一个事实:如果您有两个公开的已知数字(它们是一个公开密钥的两部分),那么指数 E 模量 N号 ,然后给出消息 ,很容易计算 C = E 国防部 N号 . 然而,在计算上无法推导 仅给出 C (和) E N号 )但是,如果你知道另一个指数, D ,然后你可以神奇地计算 R = C D 国防部 N号 R = 如果你已经计算了 E ,请 D N号 适当地。计算是不可行的 D E N号 不知道其他信息。

    在RSA加密方案下,您开始使用两个(大)随机确定的素数, Q 他们的产品是 N号 . RSA算法是基于这样一个事实,即它非常难考虑 N号 (决定 Q 仅给出 N号 );如果有人找到一种简单的分解大数字的方法,那么RSA算法就会立即被破坏。

    一旦你拥有 N号 ,需要确定指数 E D 这样:

    • 预计起飞时间 =1模 T 哪里 T =lcm(p-1,q-1),lcm是最小公倍数。

    您可以选择两个值中的一个作为小奇数-Schneier和Ferguson建议 E =3,例如。然后你计算 D 使用他们书中大约6页的计算。通常情况下, D 将是一个相当大的数字。然后您可以发布这对( E ,请 N号 )作为复合公钥,保留值( ,请 Q ,请 T ,请 D )秘密作为私钥。鉴于 E N号 ,在计算上推导 D 无第一因子分解 N号 . "实用密码术“建议使用两对不同的密码( E ,请 D )和( E ,请 D ,源自同一值 N号 ,你在哪里使用 E 加密消息,以及 E 对于数字签名,他们甚至建议使用值3和5。


    OpenSSL和密钥生成

    我相信,您对OpenSSL如何生成RSA密钥的描述是混淆的。

    生成过程首先必须生成大量随机素数, Q 在上面的符号中。有一些随机方法可以确定一个给定的大数是否是素数;计算两个这样的素数需要一点时间。综合起来,它们首先用于计算 N号 然后 D (假设) E 是由一些惯例确定的)。您在OpenSSL中看到的两个阶段正在确定 N号 ,然后确定 D .


    用户案例剖析

    问题是:

    考虑到Alice想以非传统方式向Bob发送一些东西:

    爱丽丝和鲍勃曾经见过面,爱丽丝给了鲍勃一把“公钥”,是由她创建的一把私钥生成的,但她警告鲍勃要保守秘密。她把这把私人钥匙保密,从来没有把这把公共钥匙给任何人。

    到目前为止,一切都很好。“公开密钥”不是很公开,但没有什么害处。

    Bob能确定他从Alice收到的信息(前提是这些信息是用Alice私钥加密的)只能被他阅读(前提是他真的对Alice的公钥保密)?

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

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

    混乱 :该部分首先讨论Alice向Bob发送消息;现在您已切换到Bob向Alice发送消息。

    鲍勃和爱丽丝相遇时,爱丽丝给了鲍勃一张P。 爱丽丝 公钥。据推测,鲍勃也给了爱丽丝他的P 鲍勃 公钥。两个公共密钥的公共流通都非常有限——这很好,但对系统的安全并不重要。

    现在,当Bob想给Alice发送消息时,他可以用她的P加密。 爱丽丝 公共密钥,Alice(并且只有Alice)可以使用她的 爱丽丝 秘钥。或者,Bob可以用他的S加密消息 鲍勃 秘密钥匙,爱丽丝可以用鲍勃的密码解密。 鲍勃 公钥。两组加密和解密都可以工作。

    问题是什么

    非对称密钥被命名为“private”和“public”这一事实无助于理解我的问题。密钥具有底层属性,而正是我广播的“公钥”赋予了它“公共”属性。请在回答之前明确区分:我不考虑这些密钥的“公共”和“私有”属性,而是考虑“私有密钥”加密与“公共密钥”加密的牢固性。

    用正确的私钥加密和用正确的公钥解密同样可靠,就像用正确的公钥加密和用正确的私钥解密一样。区别在于谁能做哪项手术。如果你清楚地知道谁在加密,谁在解密,谁知道哪个密钥,那么方法的秘密就变得相当清楚了。

    我不能用另一个术语,即使它在这个特殊情况下是误导性的。

    嗯,在你的案例中,“公共密钥”并不是所有人都知道的,但这就是所有不寻常的地方。

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

    非对称加密方案的关键是,攻击者(通常称为eve,窃听者)是否知道公钥并不重要。只要私有密钥由Alice和Bob保密,消息就可以安全地发送。但是,您必须理解,如果Alice向Bob发送的消息仅由Alice的密钥加密,那么任何知道Alice的公钥的人(如Eve)都可以阅读该消息。伊芙不能创建一个假消息,除非她也知道秘密密钥-如果伊芙发现爱丽丝的秘密密钥,伊芙可以在她喜欢的任何时候假装爱丽丝。但她能看懂。如果爱丽丝给鲍勃发了一封只有鲍勃的公钥加密的邮件,那么只有鲍勃才能阅读(使用他的秘密密钥),但是鲍勃无法知道这封邮件到底是爱丽丝发的还是伊芙假装爱丽丝发的。这就是为什么你必须努力确保鲍勃知道只有爱丽丝才可以发送信息,而爱丽丝知道只有鲍勃才能阅读信息。

        2
  •  6
  •   Richard    15 年前

    简单地说,因为当您加密某个东西时,您要屏蔽它,以便只有一个人可以阅读它(拥有私钥的人)。你不拥有那个人的私钥,你所拥有的只是他们的公钥。

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

        3
  •  3
  •   Matthew Scharley    15 年前

    更明确地说,“使用私钥加密”意味着要解密,需要使用公钥。这不是问题,只是 任何人 然后可以解密您的[insert item here],因为公钥只是: 公众的 . 它对 保护 数据,此系统用于 验证 数据。

    例如,艾丽斯想把一份文件发给我(是的,是的,开枪打我)。爱丽丝不在乎别人是否能读她的文件,这不是机密,但她希望鲍勃能确定她发送的是他收到的。然后,她可以用她的私钥加密她的文件,Bob可以用她的公钥解密文件,确保文件没有被篡改。但是如果有人在监听事务,他们也可以解密和读取文件。他们就是改变不了。


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

    除此之外,我认为你的计划没有任何安全问题…只要钥匙是真正保密的。private/public只是基于典型用法的通用名称。没有什么能强迫你把一把公钥完全公开。在您的案例中,您可能希望将它们称为“加密密钥”和“解密密钥”,但我不会将每一个密钥都用于这两者。事实上,我建议你在你的程序中这样称呼他们,理由是乔纳森·莱弗勒在他的评论中给出的:

    “公钥”是可以由多个人共享的东西。这就是“公钥”的定义。还有什么事情很混乱

        4
  •  1
  •   Mike Cooper    15 年前

    我认为您遗漏了公钥/私钥加密的要点(至少据我所知)。

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

    假设你有,不仅仅是鲍勃和爱丽丝,还有想象中字母表中每一个字母的人。这些人希望能够向任何人发送消息,确保只有收件人才能阅读。使用一个普通的对称加密,这需要每个人之间共享一个密钥,所以如果我们有来自字母小镇的26个人,也就是说 26x25 钥匙,每个人都必须记住并保管25把秘密钥匙。

    输入对称(即公钥/私钥)加密。现在每个人都有一个普通规则的私钥和一个公钥。要向Fred发送消息,您可以查看他的(只有一个)公钥。然后你给他发信息。只有弗雷德能阅读这封信。在这个计划中,你有 26x2 钥匙,每个人只需要记住和保护 秘钥。还需要有一个公共密钥源,但这很容易。

    按照您描述的方式使用非对称加密,每一组人都需要一对密钥。 26x25x2 钥匙。

    所以,这也是关于可伸缩性的。对称方案所需的密钥数为 N^2-N ,在非对称方案中,只有 2*N .

        5
  •  0
  •   vaab    15 年前

    我不知道是否有版权问题,但我会引用“瓦莱里·普雷米科夫” 从 this forum .

    签名和加密是两种不同的原型 安全性要求,其中需要不同的填充 模式。使用短语“公开解密”密钥是 布鲁斯广泛使用的密码学史术语 施耐尔的书《应用密码学》。这句话本身就是 应该用来描述带有消息的签名方案 恢复(如RSA)。这个短语也用来调整不对称 对旧协议验证模型(如 禁令。然而,就其本身而言,这只是一个误称-公钥是 众所周知,解密操作具有提供 内容的隐私-如果解密密钥是 大家都知道。

    即使如此,原始RSA允许交换公钥和私钥,但是 事实上,它们不能互换。私钥解密是 用CRT(中国余数定理)实现4x 更好的私钥操作性能。为了这个-你不需要 只有指数,还有模和乘法的因式分解 一些乘积的倒数这些因素。公钥只有模数 指数,不能用于此类计算。

        6
  •  0
  •   Lasse V. Karlsen    15 年前

    你误用了这里的术语。

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

    让我们无视这一点。

    这里的问题是鲍勃知道的。鲍勃真的知道艾丽斯是否把她的公开钥匙寄给了其他人吗?如果没有,他就不能确保只有他才能解密消息。技术中没有任何东西可以确保这一点。任何被Alice私钥加密的东西都可以被她的公钥解密,因此任何拥有该密钥的人都可以解密。就公共钥匙的性质而言,应该是任何人。

    确保Bob的消息只能由Bob解密的唯一方法是Bob向Alice提供他的公钥,并使Alice通过他的公钥加密她要发送给Bob的所有内容,这将使Bob以外的任何人都无法解密数据。她是否也用自己的私钥加密相同的数据(即在数据上签名)是不重要的。

    当然,鲍勃也不知道爱丽丝没有向其他人发送完全相同的消息,而是为其他人的公钥加密。