有谁知道如何与两个以上的参与者进行Diffie-Hellman或ECDH密钥交换?

我知道如何在两个参与者之间进行密钥交换,但是我需要能够拥有一个密钥3个或更多方之间的协议。

#1 楼

标准Diffie-Hellman密钥交换算法(或算法家族)在具有生成器$ g $的循环组中工作,并且依赖于

$$ {y_A} ^ {x_B} =(g ^ { x_A})^ {x_B} =(g ^ {x_B})^ {x_A} = {y_B} ^ {x_A},$$

其中$ y_A $和$ y_B $是公开传输的,而$ x_A $和$ x_B $保留为私有。

通过三个参与者,我们仍然有

$$((g ^ {x_A})^ {x_B})^ {x_C} =((g ^ {x_A})^ {x_C})^ {x_B} =((g ^ {x_B})^ {x_A})^ {x_C} =((g ^ {x_B})^ { x_C})^ {x_A} =((g ^ {x_C})^ {x_B})^ {x_A} =((g ^ {x_C})^ {x_A})^ {x_B}。 $$

由于每个方都希望将自己的密钥设为私有,因此每个求幂运算必须在不同的位置进行,这意味着某些方必须将其第二步结果发送给其他方。 />
一种可能的协议如下:


A,B,C各自生成其私钥$ x_A $,$ x_B $,$ x_C $。
A,B,C分别计算$ y_A = g ^ {x_A} $,$ y_B = g ^ {x_B} $,$ y_C = g ^ {x_C} $。
A向B发送$ y_A $ ,B向C发送$ y_B $,C向A发送$ y_C $。
A计算$ z_ {CA} = {y_C} ^ {x_A} $,B计算$ z_ {AB} = {y_A} ^ {x_B} $,C计算$ z_ {BC} = {y_B} ^ {x_C} $。
A向B发送$ z_ {CA} $,B向C发送$ z_ {AB} $,C发送$ z_ {BC} $到A。
A计算$ k_ {BCA} = {z_ {BC}} ^ {x_A} $,B计算$ k_ {CAB} = {z_ {CA}} ^ {x_B } $,C计算出$ k_ {ABC} = {z_ {AB}} ^ {x_C} $。

上述相等意味着三个当事方现在知道一个共同的秘密$ k_ {ABC} = k_ {CAB} = k_ {BCA} $。

这显然可以推广到三个以上的团体,但这需要每位参与者的每个附加参与者的组指数加法更多(即总共$ n ^ 2 $个乘幂。

所有这些在所有组中都有效,在椭圆曲线组中也是如此(在这里通常写为点乘法而不是乘幂)。

在实践中,与某个“集线器”节点交换密钥可能更容易,该节点然后会创建一个公共密钥并将其发送给每个参与者,就像丹尼斯在其答案中提出的那样。

评论


$ \ begingroup $
如果有4个聚会怎么办?就像A向B发送yA,B向C发送yB,C向D发送yC,D向A发送yD,D向B发送yD,C向A发送yc一样?
$ \ endgroup $
–circusonfireee
18年4月6日在1:39

$ \ begingroup $
@circusonfireee看起来太复杂了。每个人只需要在每个“发送”步骤中向他的“正确”邻居发送一个号码(在我的示例中的步骤3和5,您将有一个计算步骤,又有四个发送方的发送步骤)。
$ \ endgroup $
–PaŭloEbermann
18年4月6日在21:29

$ \ begingroup $
是否有一些使用openssl库的示例实现? wiki.openssl.org/index.php/Elliptic_Curve_Diffie_Hellman我了解,借助密钥协议过程,我们可以根据私钥和公钥创建共享秘密字节。但是在n个参与方的情况下,我们如何将该共享密钥“转换”为新的公共密钥以计算新的共享密钥?谢谢
$ \ endgroup $
– Guillaume Cisco
19年11月14日在9:23

$ \ begingroup $
我刚刚在这里创建了一个可用地址:github.com/pyca/cryptography/issues/5064
$ \ endgroup $
– Guillaume Cisco
19年11月18日在9:10

#2 楼

关于Diffie-Hellman,真正的好处是从网络角度来看它是多么的轻巧:双方互相发送一条消息;

如果您可以忍受较重的内容,可以看看@Paŭlo的描述;对于$ n $的参与者,它需要$ n-1 $的消息回合(在每个回合中,参与者广播他们使用在上一回合中收到的消息计算出的消息)。实际上,还有另一种方法实际上在一般情况下效率更高(任何$ n $进行2轮消息传递),也更加通用(可以扩展到任何密钥交换协议,而不仅仅是Diffie-Hellman): />

一个参与者($ P_1 $)与所有其他参与者进行密钥交换,从而导致密钥$ K_2 $,$ K_3 $ ... $ K_n $在$ P_1 $和
$ P_1 $生成一个随机密钥$ K $,并用$ K_2 $,$ K_3 $ ... $ K_n $对称加密。 br /> $ P_1 $广播那些$ n-1 $对称加密的$ K $版本。 $ P_2 $,$ P_3 $ ... $ P_n $各自解密并获得$ K $。

它仍需要进行两次消息传递。


存在一种协议,用于在一次消息传递中进行三方Diffie-Hellman密钥交换。它由Joux于2000年首次描述。它使用配对。假设您有两个组$ G_1 $和$ G_2 $的主订单$ p $,使得计算Diffie-Hellman都是这两个难题(即,您可以在$ G_1 $或$中进行Diffie-Hellman密钥交换) G_2 $,它是安全的),因此存在双线性映射:
\ begin {eqnarray *}
e:G_1 \ times G_1&\ longrightarrow&G_2 \ cr
(P ,Q)&\ longmapsto&e(P,Q)
\ end {eqnarray *}
使得:


如果$ e(P,Q)= 1 $,然后$ P = 1 $或$ Q = 1 $或两者(配对不会退化);
对于来自$ G_1 $的所有$ P $和$ Q $,以及所有整数$ a $和$ b $,$ e(P ^ a,Q ^ b)= e(P,Q)^ {ab} $(配对是双线性的。

请注意,这些属性表示配对是对称的($ e(P,Q)= e(Q,P)$)。
我们称$ g $ a $ G_1 $的生成器($ G_1 $的任何非中立元素都可以,因为订单$ G_1 $是质数:$ G_1 $是循环的。)如果您有这样的对象,则三方Diffie-Hellman在一个消息传递回合中是这样的:


$ A $选择一个随机的$ a $取模$ p $,并广播$ g ^ a $。类似地,$ B $和$ C $分别选择随机$ b $和$ c $并广播$ g ^ b $和$ g ^ c $。
共享密钥为$ K = e(g ^ b ,g ^ c)^ a $,$ A $可以计算。由于配对具有双线性,这也等于$ B $可以计算的$ e(g ^ a,g ^ c)^ b $和$ e(g ^ a,g ^ b)^ c $,$ C $可以计算。

对于具有可计算配对的Diffie-Hellman而言足够的组并不多;但是可以使用嵌入度较低的超奇异椭圆曲线,Weil或Tate配对以及变形图。 Ben Lynn的博士学位论文很好地介绍了椭圆曲线上的配对。用他的术语来说,“ A型”和“ B型”曲线适用于如上所述的三方DH。

配对数学有点复杂(比基本的椭圆曲线数学高一个级别,已经比原始Diffie-Hellman中使用的模块化算术高一个级别)。他们需要使用比椭圆曲线通常要大得多的字段进行计算(我们需要以512位素数而不是160位素数为模的整数,并且某些计算使用2度扩展字段,因此为1024位字段元素)。另外,如果需要密钥确认,则只有一轮消息传递的优势就消失了(这实际上取决于整个协议)。因此,在实践中不经常使用带有配对的三方DH。对于某些涉及三种代理的更高级协议,配对是一个很好的工具,特别是基于身份的加密和一些用于电子投票或数字现金的协议。 ($ n \ geq 4 $),在一个消息回合中,将需要一个$(n-1)$线性“配对”;我不知道有任何已知的候选人能够获得足够的安全性同时仍然可以轻松计算。

评论


$ \ begingroup $
自从您回答以来,在为上一段所需的多线性图建议候选者方面取得了一些进展。见eprint.iacr.org/2012/610
$ \ endgroup $
–名堂
13年7月19日在18:11

$ \ begingroup $
为什么“足够用于具有可计算配对的Diffie-Hellman的组不是大军”不是大军的意思。
$ \ endgroup $
–咏叹调
13年8月23日在9:28

$ \ begingroup $
@aria-通过军团,他的意思是“很多”
$ \ endgroup $
– Erik Aronesty
18年8月27日在14:46

#3 楼

我想到的最简单的方法:

只要$ A $与$ B $和$ C $交换了密钥,$ A $就可以随机生成一个密码并将其传达给两个$ B $和$ C $。