Esquema de cifrado compartido de Shamir

El Esquema de Cifrado Compartido de Shamir(Shamir's Secret Sharing) es un algoritmo criptográfico creado por Adi Shamir, uno de los creadores del popular algoritmo RSA. El algoritmo es del tipo secreto compartido, donde cada participante es dueño de una única parte que se obtiene al dividir el secreto. 

Lo interesante está en la reconstrucción, puesto que se requiere un número mínimo $k$ de participantes, también llamado umbral, para obtener el secreto. 

Modelo matemático

Se requiere dividir el secreto $S$ (e.g una clave compartida para acceder a una caja fuerte) en $n$ partes $S_1, S_2, ... , S_n$ de tal manera que $S$ puede ser reconstruida por cualquier combinación de $\textbf{k}\leq n$ o más partes, sin embargo si tenemos menos de $k$ partes, $S$ es completamente indeterminado. 
Este esquema es llamado un $(k,n)$ esquema de umbral, además si $k=n$ requerimos todas las partes para la reconstrucción del secreto. 

La idea esencial de Adi Shamir se basa en la interpolación polinómica de Lagrange, que teniendo $k$ puntos en $\mathbb{R}^2$ de la forma $(x,y)$ podemos definir un polinomio en una variable $L(x)$ de grado $k-1$

Supongamos que queremos trabajar con el esquema umbral $(k,n)$ para compartir un secreto $S$ (sin perdida de generalidad consideramos a $S$ un número-código ASCII) siendo $k<n$. La elección de los valores de $k$ y $n$, tal que $k<n$ determina la fortaleza del sistema.

Algoritmo para cifrar - $(k,n)$ esquema de umbral 
  1. Elegimos de forma aleatoria(cuasi en realidad) $k-1$ enteros positivos $a_1, ... , a_{k-1}$ con $a_0 = S$ y $a_i < S$.
  2. Construimos el polinomio $L(x) = a_0  + a_1x + a_2x^2 + ... + a_{k-1}x^{k-1} $
  3. Calculamos $n$ puntos cualesquiera a partir de $L(x)$, por ejemplo $(1,L(1)),(2,L(2)), .... , (n,L(n)) $ 
  4. Repartirmos cada uno de estos puntos a cada participante, que será dueño de una única parte del secreto. 
Algoritmo para descifrar - $(k,n)$ esquema de umbral 
  1. Se tiene cualquier subconjunto de $k$ puntos.
  2. Buscamos los coeficientes del polinomio $L(x)$ usando la interpolación polinómica de Lagrange.
  3. Luego evaluamos el polinomio en 0, esto es $L(0) = a_0 = S$.
  4. Mostramos el secreto $S$.

Comentarios

Entradas populares de este blog

Teoría de la información > Entropía y Criptografía

Linear Q-Learning - Doble Péndulo Invertido