我尝试实现由Michel Abdalla,CélineChevalier,Mark Manulis和David Pointcheval发表的论文具有子组密钥按需计算的灵活组密钥交换中提出的GKE + P协议(在{ {3}}(在2010年)上。
协议所说的是:
假设我们有一个参与者参加一个 $ n $ 大小的循环 $ U =(U_1,U_2,.. .U_n)$
- 每个参与者 $ U_i $ 选择一个 $ x_i $ 并计算 $ y_i = g ^ x_i $ 并广播 $(U_i,x_i)$ 。
- 接收后,将计算以下内容:
- $ \ text {sid} _i =(U_1 | y_1,\ ldots,U_n | y_n)$
- $ k'_ {i-1} = y_ {i-1} ^ {x_i} $ 和 $ k'_ {i + 1} = y_ {i + 1} ^ {x_i} $
- $ z'_ {i,i-1} = H(k'_ {i-1},\ text {sid} _i)$ 和< span class =“ math-container”> $ z'_ {i + 1,i} = H(k'_ {i + 1},\ text {sid} _i)$
- $ z_i = XOR(z'_ {i-1},z'_ {i + 1})$
- $ \ sigma_i =符号(\ text {SIGN_KEY} _i,(U_i,z_i,sid_i))$
- 广播: $ U_i,z_i,sid_i $
-
组密钥计算:
如果 $ XOR(z_1,z_2,...,z_n)=== 0 $ && $ \ text {is_valid}(\ sigma_i)$ 然后
对于[i,i-n + 1]中的j:
$z'_{j,j+1} = XOR(z'_{j_j-1},z'_{j})$
endfor
fi
最后一个键为: $ k_i = H_g(z'_ {1,2},\ ldots,z'_ {n,1},sid_i)$ < / span>
还提到了P2P阶段:
- $ k'_ {i,j} = y_i ^ {x_i} $
- $ k'_ {i,j} = H p(k_ {i,j},U_i | y_i,U_j | y_j)。$
因此,当涉及在我的node.js XMPP客户端代码上进行实际开发时,一些问题已经解决:
- 我可以在每个客户端上使sid为动态生成的字符串吗?
- 存储每个 $ z'$ 以便进行良好遍历的最佳方法是什么?
- 建议使用libsodium库中的
crypto_scalarmult_base
函数代替正常的DH(提高功率)?