Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions custodios/share_1.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1,1154158608323288594936253929681232028757683072610127008891346489512265091420456510835335677593107711407270510840267953909261679259130227245903389913616905783
1 change: 1 addition & 0 deletions custodios/share_2.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
2,5519447252953775118324894505171164576517472911425146130181664359371411033783274158695571113636803926511254522940129049168791222164131605237060532449408234239
1 change: 1 addition & 0 deletions custodios/share_3.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3,6231068273760849855184020927388404426009934216301751954476490150391894643690796943671856502874656856319757091497246166028932186147515302679187310102534271809
1 change: 1 addition & 0 deletions custodios/share_4.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
4,3289021670744512805513633196332951577235066987239944481775823862573715921143024865764191845306666500832778216511619304489684571209281319572283722872995018493
1 change: 1 addition & 0 deletions custodios/share_5.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
5,3558105104035373684295632111086199247462306524383029121474128955102418049537613977095136781594287415027614209374729322588170365349146299728923799051905531442
56 changes: 56 additions & 0 deletions poc/POC_Shamir_Secret_Sharing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# 🔐 PoC: Shamir Secret Sharing en Python

## 📘 Descripción

Este repositorio contiene una **Prueba de Concepto (PoC)** del algoritmo **Shamir Secret Sharing (SSS)** implementado en **Python 3.12+** sin dependencias externas.

Permite **dividir una clave secreta** en varias partes, de forma que solo un subconjunto mínimo de ellas pueda **reconstruir el secreto original**.

---

## ⚙️ Ejecución

```bash
python poc_sss.py
```

### 📦 Salida esperada

```
=== PoC SSS Básico (sin dependencias externas) ===

🔑 Clave maestra (hex): 8f2b76d3cfe4a...f91321c

🔹 Se generaron 5 partes en /custodios

🔒 Clave reconstruida (hex): 8f2b76d3cfe4a...f91321c

✅ Coinciden
```

---

## 🧩 Explicación técnica

- **Generación de clave:** `secrets.token_bytes(32)` → clave de 256 bits.
- **División:** polinomio aleatorio mod `2^521 - 1`.
- **Reconstrucción:** interpolación de Lagrange modular.
- **Archivos generados:** `/custodios/share_1.txt` a `/custodios/share_5.txt`.

---

## 🔒 Propósito

Demostrar cómo un **HSM o sistema distribuido** puede usar Shamir Secret Sharing para:

- Custodiar claves privadas sin punto único de fallo.
- Requerir quorum mínimo de custodios para recuperación.
- Evitar exposición de la clave completa en ningún nodo individual.

---

## 📄 Autor

**Grupo 1**

> Prueba de concepto desarrollada como parte del módulo de seguridad criptográfica.
58 changes: 58 additions & 0 deletions poc/poc_sss.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# poc/poc_sss.py
# PoC de Shamir Secret Sharing (compatibilidad Python 3.12+)


import secrets
from functools import reduce #opcional para pruebas
import os

def _eval_polynomial(coeffs, x, prime):
"""Evalúa un polinomio con coeficientes mod prime."""
return sum([coeff * pow(x, i, prime) for i, coeff in enumerate(coeffs)]) % prime

def generar_shares(secret_int, n=5, t=3, prime=2**521 - 1):
"""Genera n shares, donde se requieren t para reconstruir el secreto."""
coeffs = [secret_int] + [secrets.randbelow(prime) for _ in range(t - 1)]
shares = [(i, _eval_polynomial(coeffs, i, prime)) for i in range(1, n + 1)]
return shares

def recombinar_shares(shares, prime=2**521 - 1):
"""Reconstruye el secreto usando interpolación de Lagrange."""
def _lagrange_basis(j):
xj, yj = shares[j]
num = den = 1
for m in range(len(shares)):
if m != j:
xm, _ = shares[m]
num = (num * -xm) % prime
den = (den * (xj - xm)) % prime
return (yj * num * pow(den, -1, prime)) % prime
return sum(_lagrange_basis(j) for j in range(len(shares))) % prime

# Pruebas
def main():
print("=== PoC SSS Básico (sin dependencias externas) ===\n")

# Generar clave maestra (256 bits)
clave_bytes = secrets.token_bytes(32)
clave_int = int.from_bytes(clave_bytes, "big")
print(f" Clave maestra (hex): {clave_bytes.hex()}\n")

# Divide
shares = generar_shares(clave_int, n=5, t=3)
os.makedirs("custodios", exist_ok=True)
for i, (x, y) in enumerate(shares, 1):
with open(f"custodios/share_{i}.txt", "w") as f:
f.write(f"{x},{y}")
print("Se generaron 5 partes en /custodios\n")

# Usar 3 para recuperar
partes_para_usar = shares[:3]
clave_recuperada_int = recombinar_shares(partes_para_usar)
clave_recuperada_bytes = clave_recuperada_int.to_bytes(32, "big")

print(f" Clave reconstruida (hex): {clave_recuperada_bytes.hex()}\n")
print("Coinciden" if clave_bytes == clave_recuperada_bytes else "❌ Error: no coinciden")

if __name__ == "__main__":
main()