主权项 |
1.一种可鉴权的Ad Hoc组密钥协商协议,其特征在于组密钥协商协议为:首先,每个成员选择一个随机数r<sub>i</sub>,b<sub>i</sub>∈[1,q-1]和一个密钥x<sub>i</sub>;然后发布公钥y<sub>i</sub>和参数c<sub>i</sub>、τ<sub>i</sub>;这样每个成员M<sub>i</sub>就可以计算为c=H<sub>2</sub>(∏c<sub>i</sub>,∏τ<sub>i</sub>)其中i∈[1,N];N: Ad hoc组的成员数目,M<sub>i</sub>:第i个组成员i∈{1~N},M<sub>h</sub>:组控制成员,<l,v>:树中的第l层的第v个节点,p,q:2个大素数,且q|p-1,g: 确定域GF(q)上的生成元g,且GF(q)的阶数是q,H(): Hash函数;1)、密钥协商初始化阶段如下:第一步:每个组成员M<sub>i</sub>随机选择r<sub>i</sub>∈[1,q-1]并计算自己的盲钥和签名,然后通过安全信道传播到组控制节点和在树中与自己同一个父节点的其他成员;第二步:收到每个成员的消息后,组控制节点验证签名正确与否,验证正确后组控制点随机选择一个有限域GF(q)上的多项式<maths num="0001"><math><mrow><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mo>=</mo><mrow><mo>(</mo><munderover><mi>&Sigma;</mi><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>t</mi></munderover><msub><mi>a</mi><mrow><mi>j</mi><mo>-</mo><mn>1</mn></mrow></msub><msup><mi>x</mi><mrow><mi>j</mi><mo>-</mo><mn>1</mn></mrow></msup><mo>)</mo></mrow><mi>mod</mi><mi>q</mi></mrow></math></maths>和秘密值h∈[1,q-1],随后为每个成员M<sub>i</sub>计算f(i)并广播<maths num="0002"><math><mrow><msub><mi>M</mi><mi>h</mi></msub><mo>&RightArrow;</mo><msub><mi>M</mi><mrow><mi>i</mi><mo>&Element;</mo><mi>N</mi></mrow></msub><mo>:</mo><mo>{</mo><msup><mi>g</mi><mrow><mi>hf</mi><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow></mrow></msup><mo>,</mo><msup><mi>g</mi><msub><mi>hr</mi><mi>i</mi></msub></msup><mo>}</mo><mo>,</mo></mrow></math></maths><l,v>表示节点在树中的位置,每个节点都拥有一个密钥K<sub><l,v></sub>,和对应的盲钥BK<sub><l,v></sub>=f(K<sub><l,v></sub>);这里的函数f()是大素数的模指运算比如:f(k)=g<sup>k</sup>mod p;假设叶子节点<2,i>对应于实际的组成员为M<sub>i</sub>,则M<sub>i</sub>的会话密钥就是K<sub><2,i></sub>;第一层节点<1,i>的孩子:即<2,j>到<2,j+n>可以计算出第i个子组的密钥片断:第三步:第i个子组的第一个成员<1,i>计算并发布盲钥,这样<1>使得同组的其他成员可以检查自己的密钥是否等于盲钥;<2>当每个中间节点<1,v>的盲钥都发布后,所有Ad hoc组成员就像GDH协议那样计算出根节点K<sub><0,0></sub>的组共享密钥;第四步:第1层节点像GDH协议一样计算根密钥;第五步:第1层最后一个节点如下操作:<maths num="0003"><math><mrow><msub><mi>M</mi><mi>v</mi></msub><mo>&RightArrow;</mo><msub><mi>M</mi><mi>i</mi></msub><mo>:</mo><mo>{</mo><msup><mi>g</mi><mrow><msub><mi>k</mi><mrow><mn>1</mn><mo>,</mo><mi>i</mi></mrow></msub><mo>*</mo><msub><mi>k</mi><mrow><mi>i</mi><mo>,</mo><mn>2</mn></mrow></msub><mo>&CenterDot;</mo><mo>&CenterDot;</mo><mo>&CenterDot;</mo><msub><mi>k</mi><mrow><mn>1</mn><mo>,</mo><mi>i</mi></mrow></msub><mo>/</mo><msub><mi>k</mi><mrow><mi>i</mi><mo>,</mo><mi>i</mi></mrow></msub></mrow></msup><mo>}</mo><mo>&ForAll;</mo><mi>i</mi><mo>&Element;</mo><mo>[</mo><mn>1</mn><mo>,</mo><mi>v</mi><mo>-</mo><mn>1</mn><mo>]</mo><mo>,</mo></mrow></math></maths>每个成员在计算根密钥前验证签名是否正确,如果不正确则停止密钥协商,如果正确,则所有成员最后计算出的的根密钥为:<maths num="0004"><math><mrow><msub><mi>K</mi><mrow><mo>&lt;</mo><mn>0,0</mn><mo>></mo></mrow></msub><mo>=</mo><msup><mi>g</mi><mrow><msub><mi>K</mi><mrow><mi>s</mi><mn>1</mn></mrow></msub><msub><mi>K</mi><mrow><mi>s</mi><mn>2</mn></mrow></msub><mo>&CenterDot;</mo><mo>&CenterDot;</mo><mo>&CenterDot;</mo><msub><mi>K</mi><mi>sl</mi></msub></mrow></msup><mi>mod</mi><mi>p</mi><mo>=</mo><msup><mi>g</mi><msup><mi>g</mi><mrow><mi>h</mi><mo>[</mo><mi>i</mi><mo>+</mo><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mrow><mo>(</mo><msub><mi>r</mi><mi>i</mi></msub><mo>+</mo><msub><mi>cx</mi><mi>i</mi></msub><mo>)</mo></mrow><mo>+</mo><mi>f</mi><mrow><mo>(</mo><mn>0</mn><mo>)</mo></mrow><mo>]</mo></mrow></msup></msup><mi>mod</mi><mi>p</mi></mrow></math></maths>利用这个根密钥,再经过变换就使得Ad hoc组进行多播通信;2)、加入和合并协议:第一步:新成员M<sub>n+1</sub>请求加入Ad hoc组通信M<sub>n+1</sub>→M<sub>h</sub>:{join,BK<sub>n+1</sub>};当组控制节点收到消息后,回复一个确认信息:{g<sup>hrn+1</sup>,g<sup>hf(i)ri</sup>}。第二步:新成员发送盲钥到同一个父节点即自己子组的其他成员:M<sub>n+1</sub>→M<sub>i∈[v,v+n]</sub>:{BK<sub>n+1</sub>};第三步:同子组的其他成员M<sub>n</sub>重新随机选择密钥<img file="A2007100459220003C3.GIF" wi="43" he="52" />并将新的盲钥传送给M<sub>n+1</sub>:M<sub>i∈[v,v+n]</sub> → M<sub>n+1</sub>:{BK<sub>i</sub>};随后,最后一个子组里面的所有成员计算出更新的过的子密钥了<maths num="0005"><math><mrow><msub><mover><mi>K</mi><mo>^</mo></mover><mrow><mi>s</mi><mo>-</mo><mi>last</mi></mrow></msub><mo>=</mo><msup><mi>g</mi><mrow><mi>h</mi><mo>[</mo><mn>1</mn><mo>+</mo><msub><mi>&Sigma;</mi><mrow><mi>i</mi><mo>&Element;</mo><mo>[</mo><mi>v</mi><mo>,</mo><mi>v</mi><mo>+</mo><mi>n</mi><mo>]</mo></mrow></msub><mrow><mo>(</mo><msub><mi>r</mi><mi>i</mi></msub><mo>+</mo><mi>f</mi><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><msub><mi>L</mi><mi>i</mi></msub><mo>+</mo><msub><mi>cx</mi><mi>i</mi></msub><mo>)</mo></mrow><mo>+</mo><msub><mi>hr</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>+</mo><mi>hf</mi><mrow><mo>(</mo><mi>n</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow><msub><mi>L</mi><mi>i</mi></msub><mo>+</mo><msub><mi>cx</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>]</mo></mrow></msup><mo>;</mo></mrow></math></maths>第四步:最后一个组的第一个成员公布子组密钥,其他子组的成员像IKA阶段中的Round last一样从新计算密钥并验证签名的正确性:<maths num="0006"><math><mrow><msub><mi>M</mi><mrow><mi>last</mi><mo>-</mo><mi>sub</mi></mrow></msub><mo>&RightArrow;</mo><msub><mi>M</mi><mrow><mi>j</mi><mo>&NotElement;</mo><mi>last</mi><mo>-</mo><mi>sub</mi></mrow></msub><mo>:</mo><mo>{</mo><msup><mi>g</mi><mrow><msub><mi>k</mi><mrow><mi>s</mi><mn>1</mn></mrow></msub><mo>*</mo><msub><mi>k</mi><mrow><mi>s</mi><mn>2</mn></mrow></msub><mo>&CenterDot;</mo><mo>&CenterDot;</mo><mo>&CenterDot;</mo><msub><mover><mi>k</mi><mo>^</mo></mover><mi>i</mi></msub><mo>/</mo><msub><mi>k</mi><mi>i</mi></msub></mrow></msup><mo>}</mo><mo>&ForAll;</mo><mi>j</mi><mo>&Element;</mo><mo>[</mo><mn>1</mn><mo>,</mo><mi>i</mi><mo>]</mo><mo>.</mo></mrow></math></maths>最后,根节点的新密钥就可以被所有节点从新计算出来<maths num="0007"><math><mrow><msub><mover><mi>K</mi><mo>^</mo></mover><mrow><mo>&lt;</mo><mn>0,0</mn><mo>></mo></mrow></msub><mo>=</mo><msup><mi>g</mi><msup><mi>g</mi><mrow><mi>h</mi><mo>[</mo><mi>i</mi><mo>+</mo><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></munderover><mrow><mo>(</mo><msub><mi>r</mi><mi>i</mi></msub><mo>+</mo><msub><mi>cx</mi><mi>i</mi></msub><mo>)</mo></mrow><mo>+</mo><mi>f</mi><mrow><mo>(</mo><mn>0</mn><mo>)</mo></mrow><mo>]</mo></mrow></msup></msup><mi>mod</mi><mi>p</mi><mo>;</mo></mrow></math></maths>3)、离开和分裂协议:第一步:M<sub>h</sub>通知所有的节点第i个节点离开,需要进行组密钥更新:M<sub>h</sub>→M<sub>i</sub>:{i-leave}j∈[1,i];第二步:在有成员离开的那个子组里的第一个节点从新随机选择<img file="A2007100459220003C7.GIF" wi="22" he="51" />并将盲密钥传送给同子组的其他成员:<maths num="0008"><math><mrow><msub><mi>M</mi><mrow><mi>i</mi><mn>1</mn></mrow></msub><mo>&RightArrow;</mo><msub><mi>M</mi><mi>ij</mi></msub><mo>:</mo><mo>{</mo><mi>B</mi><msub><mover><mi>K</mi><mo>^</mo></mover><mrow><mi>i</mi><mn>1</mn></mrow></msub><mo>}</mo><mo>&ForAll;</mo><mi>j</mi><mo>&Element;</mo><mo>[</mo><mn>1</mn><mo>,</mo><mi>i</mi><mo>]</mo><mo>;</mo></mrow></math></maths>第三步:这样其他所有的成员就可以像前面的IKA协议那样从新计算密钥了。 |