Я пытаюсь реализовать протокол GKE + P, представленный на бумаге. Гибкий обмен групповыми ключами с вычислением ключей подгруппы по требованию . Авторы: Мишель Абдалла, Селин Шевалье, Марк Манулис и Дэвид Пойнтчевал (представлен в * 1003). * AfricaCrypt в 2010 г.) на nodejs.
Что говорит протокол:
Предположим, у нас есть участники в $ 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 «_ {я + 1} = у- {я + 1} ^ {x_i} $
- $ z '_ {i, i-1} = H (k' _ {i-1}, \ text {sid} _i) $ и $ z '_ {i + 1, i} = H (k' _ {i + 1}, \ text {sid} _i) $
- $ z_i = XOR (z '_ {i-1}, z' _ {i + 1}) $
- $ \ sigma_i = Sign (\ text {SIGN_KEY} _i, (U_i, z_i, sid_i)) $
- Трансляция: $ U_i, z_i, sid_i $
Вычисление ключа группы :
if $ XOR (z_1, z_2, ..., z_n) === 0 $ && $ \ text { is_valid} (\ sigma_i) $ затем
для j в [i, i-n + 1]:
<span class="math-container">$z'_{j,j+1} = XOR(z'_{j_j-1},z'_{j})$</span>
ENDFOR
ц
И окончательный ключ будет: $ k_i = H_g (z '_ {1,2}, \ ldots, z' _ {n, 1}, sid_i) $
Также упоминается стадия P2P:
- $ k '_ {i, j} = y_i ^ {x_i} $
- $ k '_ {i, j} = H p (k_ {i, j}, U_i | y_i, U_j | y_j). $
Таким образом, когда дело дошло до разработки его по-настоящему на моем клиентском XMPP-коде node.js, были заданы некоторые вопросы:
- Могу ли я сделать sid динамически генерируемой строкой для каждого клиента?
- Каков наилучший способ хранения каждого $ z '$ для обеспечения хорошего прохождения?
- Вместо нормального DH (повышение мощности) рекомендуется использовать функцию
crypto_scalarmult_base
из библиотеки libsodium?