【问题标题】:What makes ECDH rely on two public keys alone? [closed]是什么让 ECDH 单独依赖两个公钥? [关闭]
【发布时间】:2018-10-05 19:38:20
【问题描述】:

我有一个关于 ECDH(椭圆曲线 Diffie-Hellman)的基本问题。

整个想法是双方交换自己的公钥并获得相同的私钥。但是,您可以轻松地拦截这两个密钥。输入另一个公钥很简单。

所以主要问题是生成您自己的公钥。这是否意味着重新生成给定的公钥并非易事,即在您输入另一个公钥之前无法恢复用于生成给定公钥的原始参数 密钥并到达相同的私钥?

【问题讨论】:

  • 公钥是从私钥生成的,但是从公钥中获取私钥是使该方案成为有用的密码原语的难题。您在这里混淆了术语。私钥对一方来说是唯一的,并且只有他们知道。他们交换公钥并得到一个共同的共享密钥,而不是私钥。

标签: cryptography elliptic-curve ecdh


【解决方案1】:

ECDH 密钥交换用于创建私钥,而是用于计算共享密钥。这是由每一方首先创建自己的 EC 公钥/私钥对,然后使用自己的 EC 私钥和对方的 EC 公钥来执行 ECDH 计算,这导致双方计算相同的值。

第一步是为每个用户生成一个 EC 公钥/私钥对。假设 Alice 和 Bob 各自生成一个密钥对。在这个例子中,Alice 的 EC 私钥是 x,她的 EC 公钥是 xC,Bob 的 EC 私钥是 y,他的 EC 公钥是 yC。然后这些用于执行 ECDH 密钥派生。

接下来,Alice 使用她的 EC 私钥和 Bob 的 EC 公钥计算 x * yC == xyC。类似地,Bob 使用他的 EC 私钥和 Alice 的 EC 公钥来计算 y * xC == xyC。那么xyC就是ECDH算法创建的共享密钥。

【讨论】:

  • ECDH 唯一的密钥交换是公钥交换。一旦每一方计算出相同的私钥,它就被用作完全不同算法的密钥。私有 ECDH 密钥永远不会交换,因为不需要交换它 - 毕竟双方都已经拥有它
  • @LolitaGherp 没错。每一方获取对方的公钥,并与自己的私钥一起使用来计算共享秘密。
  • @LolitaGherp 查看我的编辑。您似乎对 ECDH 的实际作用感到困惑。
  • @LolitaGherp 代码做的第一件事是ECDiffieHellmanCng alice = new ECDiffieHellmanCng())。如果您单击此构造函数的链接,则会显示“初始化 ECDiffieHellmanCng 类的新实例使用随机密钥对。”所以它实际上创建了一个EC公钥/私钥对。正在发生的事情并不明显。不要将 EC 私钥与 ECDH 共享密钥混淆。
  • 对于ECDiffieHellmanKeyDerivationFunction,它所做的是从 ECDH 获取原始共享密钥并对其执行散列以生成实际使用的共享密钥。这样做是因为原始共享密钥的所有位都没有足够的熵,并且应用哈希会生成该熵。
【解决方案2】:

ECDH 不仅仅依赖于公钥;这些只是需要发送的唯一组件。相反,它依赖于由双方生成的两个公共/私有密钥对。 Diffie-Hellman 密钥协商 (DH) 的诀窍在于,a 在给定私钥和另一方的公钥的情况下计算 shared-secret。此共享密钥在双方当且仅当使用正确的私钥和公钥时是相同的。

一对的公钥和私钥在密钥对生成期间链接; DH公钥由曲线的基点和私钥计算得出。需要密钥之间的这种特定联系来计算相同的共享秘密。为了使计算成功,还需要两个密钥使用相同的域参数;换句话说,公钥需要在同一条曲线上。

第三方/对手当然可以复制任何一方的公钥。然而,这对攻击者没有帮助,因为它无法访问任何一个随附的私钥。因此,除了参与密钥协议的各方之外,没有其他方能够计算出相同的共享密钥;您需要其中一个私钥来执行此操作。


更进一步,攻击者有可能创建一个不同的密钥对。 如果该密钥对的公钥被其他方接受,则可以创建一个或两个不同的共享秘密。 p>

SSL / TLS 例如主要使用 ephemeral(临时)密钥; 任何公共 ECDH 密钥都被接受。这意味着这种形式的 DH不提供相关方的身份验证。因此,中间人 (MitM) 攻击是可能的除非使用其他身份验证措施。用于浏览器的 TLS 使用服务器证书/服务器签名。

但这部分回答了一个你(还没有)问过的问题。


有时“密钥”一词被错误地替换为“私钥”,即使在有关加密的书籍中也是如此。这很令人困惑,因为显然不可能有一个共享的私钥:“共享”和“私有”是两个对立面。 Diffie-Hellman 不计算共享私钥,它生成一个共享密钥,然后用于计算一个或多个会话密钥。

【讨论】:

  • 我的主要问题是,S1 端如何拥有自己的公钥 PK1通过具有相同的密钥 PK1 和 PK2 生成。让我们假设,S3 侧充当 S1 侧。唯一的问题是生成PK1,以便它可以输入PK2。问题是 ECDH 为何如此安全,以至于 S3 端无法提供参数来生成 PK1 并简单地输入 PK2。 PK1只有140字节,ECDH算法是公开的,所有输入参数都是公开定义的,实际值未知。
  • 您不使用两个公钥来获得密钥。您使用您的 DH 私钥和对方的 DH 公钥。第三方 (S3) 不知道私钥。只有两侧的 DH 参数(曲线)必须相同。当然还有共享的秘密。
【解决方案3】:

我很确定,ECDH 密钥是在一方的私钥和另一方的公钥之间生成的。

假设两方是 bob 和 alice,那么根据 ECDH 方案,这成立。

ECDH(bob_private_key, alice_public_key) == ECDH(bob_public_key, alice_private_key)

因为除了 alice 和 bob 之外没有人可以生成相同的密钥。

在这里查看python中的实现, https://stackoverflow.com/a/52506717/1619003

@Maarten 解释了可能让您感到困惑的地方,密钥和私钥之间的区别。

【讨论】:

  • ECDH 私钥只能从两个 ECDH 公钥生成,反之则不行。拥有 ECDH 私钥后,您可以将其用作完全不同算法的输入,例如对称算法
  • 不知道你在这里解释什么,我从来没有说过任何关于生成 EC 公钥/私钥对的事情。
猜你喜欢
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
相关资源
最近更新 更多