Introdução

Implementar o sistema de compartilhamento de segredos de Shamir (veja a descrição na Wikipedia).

A idéia é resumida a seguir.

Para distribuir um segredo para n participantes, com quórum q + 1 (ou seja, q + 1 pessoas conseguem abrir o segredo, mas menos que q + 1 pessoas nada podem fazer):

Para abrir o segredo:

É necessário fazer mais que a implementação simples. Pode-se escolher entre

Mais detalhes

Na discussão que segue, "x (mod p)" é "o resto da divisão de x por p".

Distribuição

  1. Faça a0 ter o valor do segredo a ser guardado.
  2. Escolha t − 1 números menores que p: a1, …, at − 1, de forma que a(x) = a0 + a1x + x2x2 + ⋯ + at − 1xt − 1  (modp)
  3. Para cada participante i, com 1 ≤ i ≤ w, calcule a(i) e entregue a ele o par (i, a(i)).

Combinando de volta o segredo

Par obter o segredo com k chaves, usamos interpolação de lagrange:

  1. l(x) = l1(x) + l2(x) + ⋯ + ln(x)  
  2. onde: lj(x) = yj1 ≤ x ≤ t; k ≠ j(x − xk)/(xj − xk)

Como só queremos o polinômio no zero, p(0), simplificamos para

  1. l(0) = yj[l1(0) + l2(0) + ⋯ + ln(0)]
  2. lj(0) = ∏1 ≤ x ≤ t; k ≠ j(xk)/(xk − xj)

SUGESTÃO:

Depois,