我对ECDH(椭圆曲线Diffie-Hellman)有一个基本问题。
整个想法是,双方交换自己的公钥并到达同一私钥。但是,您可以轻松截取这两个键。输入另一个公共密钥很简单。
因此,主要问题是生成您自己的公共密钥。这是否意味着重新生成给定的公共密钥不是一件容易的事,即在输入另一个公共密钥之前不可能恢复用于生成给定公共密钥的原始参数。 密钥并到达相同的私钥?
答案 0 :(得分:3)
ECDH不仅仅依赖于公钥;这些只是需要发送的唯一组件。相反,它取决于双方生成的两个公共/私有密钥对。 Diffie-Hellman密钥协商(DH)的窍门是,a在给定私钥和另一方的公钥的情况下计算共享秘密。 并且仅当使用正确的私钥和公钥时,双方的共享机密相同。
密钥对生成过程中,一对的公钥和私钥是链接的; DH公钥是根据曲线的基点和私钥计算得出的。密钥之间的此特定绑定是计算同一共享密钥所必需的。为了使此计算成功,还需要两个密钥使用相同的域参数。换句话说,公钥必须在同一条曲线上。
第三方/对手当然可以复制任何一方的公钥。但是,这将无济于事,因为它无法访问任何附带的私钥。因此,除了关键协议中涉及的各方之外,没有其他方能够计算出相同的共享机密;您需要使用其中一个私钥。
更进一步,对手可能 创建不同密钥对。 如果另一方接受该密钥对的公钥,则可以创建一个或两个不同共享密钥。 > 例如,
SSL / TLS主要使用临时(临时)密钥;接受任何公共ECDH密钥。这意味着,DH的这种形式不提供所涉各方的认证。因此,除非使用其他身份验证措施,否则可能发生中间人(MitM)攻击。浏览器中使用的TLS为此使用服务器证书/服务器签名。
但这部分是针对您尚未提出的问题的答案。
有时,即使在有关加密的书籍中,“秘密密钥”一词也被错误地替换为“私人密钥”。这非常令人困惑,因为拥有共享私钥显然是不可能的:“ shared”和“ private”是两个对立的地方。 Diffie-Hellman不计算共享私钥,而是生成共享秘密,然后将其用于计算一个或多个会话密钥。
答案 1 :(得分:2)
ECDH密钥交换不是用于创建私钥,而是用于计算共享密钥。这是由每一方首先创建自己的EC公钥/私钥对,然后使用他们自己的EC公钥和对方的EC公钥来执行ECDH计算,从而导致双方计算相同的值。
第一步是为每个用户生成EC公钥/私钥对。 Supose Alice和Bob分别生成一个密钥对。在此示例中,爱丽丝的EC私钥为x
,而她的EC公钥为xC
,鲍勃的EC公钥为y
,而他的EC公钥为yC
。然后将它们用于执行ECDH密钥派生。
接下来,爱丽丝使用她的EC私钥和鲍勃的EC公钥来计算x * yC
== xyC
。同样,Bob使用他的EC私钥和Alice的EC公钥来计算y * xC
== xyC
。然后xyC
是ECDH算法创建的共享密钥。
答案 2 :(得分:0)
我非常确定,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解释了可能使您感到困惑的秘密密钥和私有密钥之间的区别。