From 5c7aa55c115b05a21821a2e6f50eccbef79749ad Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 29 Oct 2025 11:39:20 -0500 Subject: [PATCH 1/2] Poc: con explicacion --- poc/poc_sss.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 poc/poc_sss.py diff --git a/poc/poc_sss.py b/poc/poc_sss.py new file mode 100644 index 0000000..61c0149 --- /dev/null +++ b/poc/poc_sss.py @@ -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() From 099eaf1bbb79bcfe34d4721bc99803cd09db5f14 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 29 Oct 2025 11:44:29 -0500 Subject: [PATCH 2/2] Agregar markdown ycustodios de prueba --- custodios/share_1.txt | 1 + custodios/share_2.txt | 1 + custodios/share_3.txt | 1 + custodios/share_4.txt | 1 + custodios/share_5.txt | 1 + poc/POC_Shamir_Secret_Sharing.md | 56 ++++++++++++++++++++++++++++++++ 6 files changed, 61 insertions(+) create mode 100644 custodios/share_1.txt create mode 100644 custodios/share_2.txt create mode 100644 custodios/share_3.txt create mode 100644 custodios/share_4.txt create mode 100644 custodios/share_5.txt create mode 100644 poc/POC_Shamir_Secret_Sharing.md diff --git a/custodios/share_1.txt b/custodios/share_1.txt new file mode 100644 index 0000000..cacf4b5 --- /dev/null +++ b/custodios/share_1.txt @@ -0,0 +1 @@ +1,1154158608323288594936253929681232028757683072610127008891346489512265091420456510835335677593107711407270510840267953909261679259130227245903389913616905783 \ No newline at end of file diff --git a/custodios/share_2.txt b/custodios/share_2.txt new file mode 100644 index 0000000..9d2a1cf --- /dev/null +++ b/custodios/share_2.txt @@ -0,0 +1 @@ +2,5519447252953775118324894505171164576517472911425146130181664359371411033783274158695571113636803926511254522940129049168791222164131605237060532449408234239 \ No newline at end of file diff --git a/custodios/share_3.txt b/custodios/share_3.txt new file mode 100644 index 0000000..f2d04aa --- /dev/null +++ b/custodios/share_3.txt @@ -0,0 +1 @@ +3,6231068273760849855184020927388404426009934216301751954476490150391894643690796943671856502874656856319757091497246166028932186147515302679187310102534271809 \ No newline at end of file diff --git a/custodios/share_4.txt b/custodios/share_4.txt new file mode 100644 index 0000000..434c3e2 --- /dev/null +++ b/custodios/share_4.txt @@ -0,0 +1 @@ +4,3289021670744512805513633196332951577235066987239944481775823862573715921143024865764191845306666500832778216511619304489684571209281319572283722872995018493 \ No newline at end of file diff --git a/custodios/share_5.txt b/custodios/share_5.txt new file mode 100644 index 0000000..72fcaaa --- /dev/null +++ b/custodios/share_5.txt @@ -0,0 +1 @@ +5,3558105104035373684295632111086199247462306524383029121474128955102418049537613977095136781594287415027614209374729322588170365349146299728923799051905531442 \ No newline at end of file diff --git a/poc/POC_Shamir_Secret_Sharing.md b/poc/POC_Shamir_Secret_Sharing.md new file mode 100644 index 0000000..1d6d06d --- /dev/null +++ b/poc/POC_Shamir_Secret_Sharing.md @@ -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.