我有一个关于 ECDH(椭圆曲线 Diffie-Hellman)的基本问题。
整个想法是双方交换自己的公钥并获得相同的私钥。但是,您可以轻松地拦截这两个密钥。输入另一个公钥是微不足道的。
所以主要问题是生成你自己的公钥。这是否意味着重新生成给定的公钥并非易事,即在您可以输入另一个公钥并获得相同的私钥之前,不可能恢复用于生成给定公钥的原始参数?
我有一个关于 ECDH(椭圆曲线 Diffie-Hellman)的基本问题。
整个想法是双方交换自己的公钥并获得相同的私钥。但是,您可以轻松地拦截这两个密钥。输入另一个公钥是微不足道的。
所以主要问题是生成你自己的公钥。这是否意味着重新生成给定的公钥并非易事,即在您可以输入另一个公钥并获得相同的私钥之前,不可能恢复用于生成给定公钥的原始参数?
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 不仅仅依赖于公钥;这些只是需要发送的唯一组件。相反,它依赖于双方生成的两个公钥/私钥对。Diffie-Hellman 密钥协议 (DH) 的技巧是,在给定对方的私钥和公钥的情况下计算共享密钥。当且仅当使用正确的私钥和公钥时,此共享密钥在双方都是相同的。
一对的公钥和私钥在密钥对生成期间链接;DH公钥由曲线的基点和私钥计算得出。需要密钥之间的这种特定联系来计算相同的共享秘密。为了使计算成功,还需要两个密钥使用相同的域参数;换句话说,公钥需要在同一条曲线上。
第三方/对手当然可以复制任何一方的公钥。然而,这对攻击者没有帮助,因为它无法访问任何一个随附的私钥。因此,除了参与密钥协议的各方之外,没有其他方能够计算出相同的共享密钥;您需要其中一个私钥来执行此操作。
更进一步,攻击者有可能创建不同的密钥对。如果该密钥对的公钥被其他方接受,则可以创建一个或两个不同的共享密钥。
例如 SSL / TLS 主要使用临时(临时)密钥;接受任何公共 ECDH 密钥。这意味着这种形式的 DH 不提供有关各方的身份验证。因此,除非使用其他身份验证措施,否则中间人 (MitM) 攻击是可能的。用于浏览器的 TLS 使用服务器证书/服务器签名。
但这部分给出了一个你(还没有)问过的问题的答案。
有时“密钥”一词被错误地替换为“私钥”,即使在有关加密的书籍中也是如此。这很令人困惑,因为显然不可能拥有共享的私钥:“共享”和“私有”是两个对立面。Diffie-Hellman 不计算共享私钥,它产生一个共享秘密,然后用于计算一个或多个会话密钥。
我很确定,ECDH 密钥是在一方的私钥和另一方的公钥之间生成的。
假设两方是鲍勃和爱丽丝,那么根据 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 解释了可能让您感到困惑的事情,密钥和私钥之间的区别。