【问题标题】:How does two-way asymmetric encryption work?双向非对称加密如何工作?
【发布时间】:2011-01-22 19:17:02
【问题描述】:

假设我们有 Alice 和 Bob。

Alice 向 Bob 发送了一条她用 Bob 的公钥加密的消息。 Bob 是唯一可以使用他的私钥解密它的人。但是他怎么能确定消息来自爱丽丝呢?

假设他回复,使用 Alice 的公钥加密他的消息。只有 Alice 可以解密消息。但她怎么能确定它是 Bob 发送的呢?

Alice 是否必须在她的消息中添加某种公共哈希,以便 bob 可以说“这肯定来自 Alice?”

【问题讨论】:

    标签: public-key-encryption


    【解决方案1】:

    您描述的场景确实不提供真实性。所以 Alice 和 Bob 都不能确定他们正在互相交谈。该方案仅提供机密性,因此也不提供机密性。

    Bob 必须手动与 Alice 确认他认为是 Alice 的公钥的公钥确实是她的(通过呼叫她并读出负载并通过她的声音确认是 Alice)。

    这个问题通常由受信任的第三方(例如证书颁发机构,如 VeriSign)解决,该第三方颁发证书,说明例如Alice 确实是这个特定公钥的所有者。这是现代浏览器中解决它的方式,也是所有 SSL 会话(使用您选择的银行)的工作方式。证书颁发机构从您的银行签署证书(说明您的银行确实是证书包含的公钥的所有者)并且您的浏览器已经拥有来自证书颁发机构的内置证书(构建可以验证的证书链)。

    您描述的场景很容易受到所谓的 MITM(中间人)攻击,并且无法仅通过公钥加密来解决。

    【讨论】:

      【解决方案2】:

      Bob 也有 Alice 的公钥,Alice 用她的私钥签署了消息。 Bob 使用 Alice 的公钥来验证签名。

      反过来让 Alice 确保消息来自 Bob。

      您现在要做的就是确保 Bob 拥有 Alice 的真实公钥,而不是中间人注入的公钥。

      【讨论】:

      • 所以你需要验证公钥的所有字节?您是否可以查看密钥的特定部分以确保其在您之间是真实的?指纹够匹配吗?
      • 不,您使用公钥解密消息的散列(签名),然后自己作为接收者散列消息。如果哈希匹配,那么您知道它是由 Alice 发送的。 en.wikipedia.org/wiki/Digital_signature
      • 啊是的... md5 或 SHA-1 - 是吗?因此,一旦证书到达目的地 - 验证它一切正常的方法是比较 md5 和 SHA-1 ......我拥有的证书 - 显示这两个......我想这就是我正在阅读的内容带外比较”——意思是不要在不安全的设置上进行比较?
      • 它与证书哈希无关。它是消息内容的哈希。每条消息的哈希值都不同。我不确定你到底想做什么。我建议阅读“应用密码学”这本书并通读它。它可能会回答你的很多问题。
      • 我正在尝试验证证书没有在带外飞行中被更改......我在这里拥有的每个证书 - 都有一个 md5 和一个 SHA-1 哈希......我假设(可能是错误的)这些是我可以用来与最初在用户之间发送的验证哈希值进行比较的验证哈希值......如果哈希值对齐,那么发送很可能是安全的,并且没有“检测到”对证书的篡改......感谢您的推荐-我要查一下! :) 干杯。
      【解决方案3】:

      您所说的非常非常松散地看起来像是 .Net 框架中的非对称加密算法的另一种实现。

      .Net 使用两个分支进行非对称加密!!!

      1. RSA ** Grand Mac daddy 用于所有非对称编码目的。
      2. DSA ** 更多涉及使用和创建数字签名来验证作者。

      都是抽象的

      两者在工作方式以及开发人员如何实现它们方面非常相似,但在下面我读到存在两种截然不同的算法。

      你说的是选项 2。

      .Net 提供了一个名为 DSACryptoServiceProvider 的类,它允许您使用通常称为签名的值标记您的数据。

      根据 MS 官方课程教科书,它大致是如何工作的。

      数据 >>> 哈希算法 >>> 哈希值 >>>>>>>>> 不对称算法 >>> 签名 发件人的 PVT.KEY >>>

      下面展示了 Bob 如何检查 Alice 是否确实是发送者。

      数据 >>> 哈希算法 >>> 哈希值 ||解密签名

      如您所见,Bob 必须比较生成的 Hash 和 Decrypted Signature 为了验证 Alice 是发送者。 DSACrypto 类有 4 个方法 可以在这里使用,但从上下文来看,只有两个是有效的。在这个时间点,这就是 Bob 所能做的,如果他的公钥不是 alice 的公钥,那么软件应用程序应该阻止 Bob 继续前进,因为当 Bob 试图使用伪造的公钥时试图与爱丽丝交流。这是公钥的强加关系和强调的重要性。签名允许您验证公钥所有者。

      为什么? ::

      如果 Bob 拥有 Alice 的公钥,那么他可以使用 .VerifyHash 或 VerifyData 方法再次使用相同的算法来解密加密数据。鉴于这种情况,他们应该直截了当。这一切都是使用 Alice 的公钥完成的。只有 Alice 可以使用 SignHash 和 SignData 方法,因为它们需要 Alice 的私钥。

      正如您在上面看到的,特定级别的功能已经封装在 DSA 和 RSA CryptoServiceProvider 类中。它归结为您实现它们以每次验证 Alice 作为发送者的效果如何,因为 DSA 算法允许您通过匹配生成的输出来验证发送者。某个签名和哈希应该匹配,如果它们匹配,那么本质上 DSA 已授予您 Bob 和 Alice 之间一定程度的机密性。

      【讨论】:

      • 我希望这是有道理的,因为它来自一个试图通过 70-536 考试的学生。以上是我在此处发布的关于密码学的堆栈溢出的两个答案中的第二个。
      【解决方案4】:

      因为您假设私钥确实是“私人的”——即 alice 和 bob 在下班时不会将他们的 USB 密钥插入他们的机器。

      【讨论】:

      • 我在哪里做出这样的假设?
      • “你”没有,我指的是众所周知的“你”;是的,除非在 Alice 和 Bob 之间有一个信任通道,证书颁发机构是其间接实例,否则您不会使用这种加密。 Peh,我无法取消对您问题的支持。
      • 我不知道你在说什么。问题是关于验证消息的来源。重新阅读问题中的最后一句话,并注意您的答案没有解决问题。这与保持密钥安全无关。您对我的评论的回复也没有解决这个问题。你为什么回答?
      • 要验证来自接收器的消息来源,您需要第三方。如果您假设密钥是以明文形式发送的,那么您只会进入“天哪,这不会真正起作用”阶段。如果它以明文形式发送显然是行不通的,第三方安全机制负责这方面——最著名的机制是证书颁发机构;但是,这不是唯一的方法。您谈论“公共哈希”的部分是证书颁发机构 - 但是您不需要证书颁发机构。 Bob 和 alice 可以亲自见面并交换密钥。
      • 如果您不理解回复的要点,则无需攻击试图回答您问题的人。你可以简单地问那个人,具体来说,你不明白什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 2019-07-29
      • 1970-01-01
      • 2010-10-30
      • 2017-02-22
      • 2011-03-01
      • 1970-01-01
      相关资源
      最近更新 更多