Este proyecto implementa un esquema de firma digital postcuántico basado en MLDSS (Module-Lattice-Based Digital Signature Scheme). Es una versión educativa mejorada que demuestra la fortaleza criptográfica de los esquemas basados en retículas.
- Módulo
q = 23(inseguro) - Dimensión
dim = 2(trivial) - Hash simplista basado en suma de caracteres
- Módulo
q = 8,380,417(primo grande) - Dimensión
dim = 4(realista) - Parámetros MLDSS formales:
tau = 39(peso del reto)gamma1 = 2^17(rango para vector aleatorio)gamma2 = (q-1)/32(límite de rechazo)
def cryp_hash(message, salt=b"", output_len=32):
"""Hash criptográfico SHA-256 con salt para mayor seguridad"""- Reemplaza el hash trivial por SHA-256
- Incluye salt para resistencia contra rainbow tables
- Adecuado para aplicaciones criptográficas
def secure_random_vector(dim, low, high):
"""Genera vector aleatorio de forma segura usando secrets"""
return [secrets.randbelow(high - low + 1) + low for _ in range(dim)]- Usa el módulo
secretsen lugar derandom - Criptográficamente seguro para generación de claves
def sign(m, A, s, q, dim, gamma1):
"""
Algoritmo de firma MLDSS (versión simplificada educativa)
"""
y = [secrets.randbelow(2 * gamma1) - gamma1 for _ in range(dim)]
w = mat_vec_mult(A, y, q)
c = generar_reto_con_peso_tau(...)
z = [(y[i] + c[i] * s[i]) % q for i in range(dim)]
# Control de aceptación
if infinity_norm(z) > gamma1 - tau:
return sign(...) # Reintentar
return z, cCaracterísticas:
- Vector aleatorio
ycon rango limitado - Cálculo de reto
ccon peso exacto τ (número de unos) - Control de aceptación para asegurar límites
- Resistencia contra ataques de reutilización de firma
def verify(m, sigma, c, A, pk, q, dim, gamma2):
"""Algoritmo de verificación MLDSS"""
# Verificar que ||sigma|| < gamma1 - tau
if not check_bound(sigma, gamma1 - tau):
return False, [], []
# Calcular w' = A * sigma - c * pk mod q
w_prime = [((A_sigma[i] - c_pk[i]) % q) for i in range(dim)]
# Recalcular reto c' y verificar
c_prime = recalcular_reto_con_peso_tau(...)
return (c == c_prime), w_prime, c_primeCon parámetros mejorados:
| Métrica | Valor |
|---|---|
| Espacio de búsqueda | q^d = 8,380,417^4 ≈ 4.9 × 10^28 |
| Operaciones totales | ~5 × 10^29 |
| Tiempo en PC moderna | ~1.6 × 10^13 segundos |
| En años | ~5 × 10^5 años |
| Edad del Universo | ~1.4 × 10^10 años |
Conclusión: El ataque de fuerza bruta es computacionalmente imposible.
MLDSS proporciona seguridad contra:
- ✅ Computadoras clásicas (NP-hard)
- ✅ Computadoras cuánticas (SVP es difícil incluso cuánticamente)
- ✅ Algoritmo de Grover (mejora solo de 2^(d/2))
Fundamento Matemático:
- Basado en el problema SVP (Shortest Vector Problem)
- Supuesto LWE (Learning With Errors) - problema NP-hard
- Sin algoritmo subcuadrático conocido
- Parámetros MLDSS visibles
- Información sobre clave pública
- Autenticación mediante firma digital
Acceso a tres análisis detallados:
- Visualización clara de las 3 fases:
- 🔵 Generación de claves
- 🟠 Proceso de firma
- 🟢 Proceso de verificación
- Flujo de datos con colores código
- Gráfico comparativo de ataques
- Cálculos de coste computacional
- Demostración visual de la resistencia
- Espacio de búsqueda astronómico
- Tiempos de ejecución imposibles
- Explicación matemática de la seguridad
# ANTES (inseguro)
def simple_hash(m, mod):
return sum(ord(c) for c in m) % mod
# DESPUÉS (seguro)
def cryp_hash(message, salt=b"", output_len=32):
h = hashlib.sha256()
h.update(message.encode('utf-8'))
h.update(salt)
return h.digest()[:output_len]# ANTES (vulnerable)
r = random_vector(dim, -2, 2) # random.randint()
# DESPUÉS (criptográficamente seguro)
y = [secrets.randbelow(2 * gamma1) - gamma1 for _ in range(dim)]# NUEVO: Verificación de límites
if not check_bound(sigma, gamma1 - tau):
return False, [], []q = 8,380,417 Módulo primo grande
d = 13 Número de rondas SHA3
τ = 39 Peso del reto (número de unos en c)
γ₁ = 2^17 = 131,072 Rango para vector aleatorio y
γ₂ = (q-1)/32 Límite de rechazo
dim = 4 Dimensión (versión educativa)
Seguridad esperada: ≈ 128 bits contra ataques clásicos y cuánticos
-
Ejecutar:
python main.py
-
Registrarse:
- Crear usuario y contraseña
- Sistema genera clave privada
sy clave públicapk
-
Iniciar sesión:
- Autenticación mediante firma MLDSS
- Verificación de reto criptográfico
-
Explorar análisis:
- Ver diagrama del proceso
- Analizar complejidad de ataques
- Entender por qué es seguro
σ ← y + c·s mod q
donde:
- y: vector aleatorio con ||y|| < γ₁
- c: vector de reto con exactamente τ unos
- s: clave privada (vector corto)
w' = A·σ - c·pk mod q
= A·(y + c·s) - c·A·s mod q
= A·y mod q
Si c' = H(m || w') == c, la firma es válida.
- Autenticidad: Solo el poseedor de
spuede firmar - No repudiación: Imposible negar una firma válida
- Integridad: Cambios en el mensaje invalidan la firma
- Resistencia post-cuántica: Seguro contra computadoras cuánticas
- Resistencia a ataques conocidos: No hay vulnerabilidades matemáticas conocidas
main.py
├── Importaciones y parámetros MLDSS
├── Funciones criptográficas
│ ├── secure_random_vector()
│ ├── cryp_hash()
│ ├── sign()
│ └── verify()
├── Interfaz PyQt5
│ ├── RegistrationTab
│ ├── LoginTab
│ ├── ProtectedWindow
│ ├── ProcessGraphWindow
│ ├── ComplexityAnalysisWindow
│ └── BruteForceAnalysisWindow
└── MainWindow (aplicación principal)
Esta es una versión simplificada educativa de MLDSS. La implementación real (FIPS 204) tiene:
- Dimensiones más altas (k=2, l=4)
- Parámetros más conservadores
- Optimizaciones adicionales
- Recomendaciones de seguridad formales
Implementación mejorada del sistema de firma digital postcuántico MLDSS.
Fecha: Diciembre 2025
Uso educativo. Para propósitos de criptografía real, utilizar estándares certificados (FIPS 204).