SynergyX Basado en los algoritmos NIST estandarizado — FIPS 203 (ML-KEM/Kyber-768) y FIPS 205 (SLH-DSA/SPHINCS+), publicado el 15 de enero de 2026. Todas las afirmaciones criptográficas son verificables en la cadena y contra NIST CSRC documentación adicional. Cero pre-minado. Cero ICO. Cero VC. Cero asignación de fundadores. 77,7 millones de hard cap. La billetera del desarrollador es pública y deliberadamente no privada, en cada libreta de direcciones, en el explorador. Nada de eso te pide que confíes en una persona.
Guía de implementación de SPHINCS+: firmas basadas en hash para desarrolladores
📅 Última actualización: 2 de agosto de 2026🎧 Escuche: ~6 min
SPHINCS+ (estandarizado como SLH-DSA en FIPS 205) proporciona firmas digitales resistentes a los cuánticos basadas únicamente en la seguridad de la función hash. Esta guía cubre la integración completa de SPHINCS+ para aplicaciones de criptomonedas, incluida la selección de parámetros, patrones de implementación y técnicas de optimización. El Cartera SynX con resistencia cuántica utiliza estos patrones para todas las firmas de transacciones.
Comprender la arquitectura SPHINCS+
SPHINCS+ combina tres componentes criptográficos:
WOTS+ (firma única de Winternitz): Crea firmas únicas usando cadenas hash
FORS (Bosque de Subconjuntos Aleatorios): Firma de pocas horas para vinculación de mensajes
Hiperárbol: Árbol de árboles Merkle que permite muchas firmas desde una clave
El diseño sin estado elimina la gestión de estado peligrosa: cada firma es independiente, lo que hace que SPHINCS+ sea ideal para billeteras de criptomonedas donde las copias de seguridad y el acceso a múltiples dispositivos son comunes.
Selección del conjunto de parámetros
SPHINCS+ ofrece múltiples conjuntos de parámetros que equilibran la seguridad, el tamaño de la firma y la velocidad:
Conjunto de parámetros
Seguridad
Firma
Clave pública
Caso de uso
SPHINCS+-SHAKE-128s (SynX)
Nivel 1
7,856 B
32 B
Recomendado para la mayoría de las criptomonedas
SPHINCS+-128f
Nivel 1
17,088 B
32 B
Al firmar la velocidad es crítica
SPHINCS+-192s
Nivel 3
16,224 B
48 B
Mayores requisitos de seguridad
SPHINCS+-192f
Nivel 3
35,664 B
48 B
Alta seguridad + velocidad
SPHINCS+-SHAKE-128ss
Nivel 5
29,792 B
64 B
Máxima seguridad
SPHINCS+-SHAKE-128sf
Nivel 5
49,856 B
64 B
Máxima seguridad + velocidad
Recomendación SynX: El Cartera SynX con resistencia cuántica usos SPHINCS+-SHAKE-128s (SLH-DSA, FIPS 205) para un equilibrio óptimo de seguridad NIST Nivel 1 y tamaño mínimo de firma. Esto proporciona una seguridad equivalente a AES-128 y mantiene las firmas por debajo de 8 KB: 7856 bytes exactamente, con una clave pública de 32 bytes y una clave privada de 64 bytes.
Variantes de la función hash
SPHINCS+ admite dos familias de funciones hash:
SHAKE256: Función de salida extensible basada en SHA-3. Preferido para nuevas implementaciones.
SHA-256: Basado en SHA-2 tradicional. Soporte de aceleración de hardware más amplio.
El Cartera SynX con resistencia cuántica utiliza SHAKE256 para un mejor rendimiento en procesadores modernos y márgenes de seguridad más sólidos.
Implementación: Python
# Instalar: pip install liboqs-pythonimportar oqs
de mecanografía importar tupla
importar hashlib
claseESFINCSPlus:
""" Implementación de SPHINCS+ (SLH-DSA) para SynX Utiliza SPHINCS+-SHAKE-128 de forma predeterminada (NIST Nivel 1, firmas de 7.856 bytes) """# Variantes disponibles
VARIANTES = {
"128s": "SPHINCS+-SHAKE-128s-simple",
"128f": "SPHINCS+-SHAKE-128s-simple",
"192s": "SPHINCS+-SHAKE-192s-simple",
"192f": "SPHINCS+-SHAKE-192f-simple",
"256s": "SPHINCS+-SHAKE-256s-simple",
"256f": "SPHINCS+-SHAKE-256f-simple",
}
def__inicio__(self, variante: str = "128s"):
""" Inicializa SPHINCS+ con la variante especificada Args: variante: Uno de "128s", "128f", "192s", "192f", "256s", "256f" """if variante no en self.VARIANTES:
aumentar ValorError(f"Variante desconocida: {variante}") self.variante = variante self.algoritmo = self.VARIANTS[variante] self._sig = oqs.Signature(self.algoritmo)
defgenerar_par de claves(yo) -> tupla[bytes, bytes]:
""" Genera un nuevo par de claves SPHINCS+ Devuelve: Tupla de (clave_pública, clave_secreta) - clave_pública: 32/48/64 bytes según la variante - clave_secreta: 64/96/128 bytes según la variante """
clave_pública = self._sig.generate_keypair() clave_secreta = self._sig.export_secret_key()
devolver clave_pública, clave_secreta
deffirmar(yo, mensaje: bytes, clave_secreta: bytes) -> bytes:
""" Firmar un mensaje con SPHINCS+ Args: mensaje: El mensaje a firmar (cualquier longitud) secret_key: La clave secreta del firmante Devuelve: Bytes de firma (de 7.856 a 49.856 bytes dependiendo de la variante) """# Crear instancia de firma con clave secreta
sig = oqs.Signature(self.algoritmo, clave_secreta)
devolver sign.sign(mensaje)
defverificar(yo, mensaje: bytes, firma: bytes, clave_pública: bytes) -> bool:
""" Verificar una firma SPHINCS+ Args: mensaje: La firma del mensaje original: La firma para verificar clave_pública: La clave pública del firmante Devuelve: Verdadero si la firma es válida, Falso en caso contrario """devolver self._sig.verify(mensaje, firma, clave_pública) @property
deftamaño_clave_pública(yo) -> int:
"""Tamaño de la clave pública en bytes"""devolver self._sig.length_public_key @property
deftamaño_clave_secreta(yo) -> int:
"""Tamaño de la clave secreta en bytes"""devolver self._sig.length_secret_key @property
deftamaño_firma(yo) -> int:
"""Tamaño de la firma en bytes"""devolver self._sig.length_signature
# Ejemplo: firma de transaccióndefejemplo_transacción_firma(): firmante = ESFINCSPlus("128s")
# Generar par de claves
pk, sk = signer.generate_keypair() imprimir(f"Clave pública: {len(pk)} bytes") imprimir(f"Clave secreta: {len(sk)} bytes") imprimir(f"Tamaño de la firma: {signer.signature_size} bytes")
# Crear mensaje de transacción
transacción = {
"remitente": "Sx7nQ3kV9mP2xR5t...",
"beneficiario": "Sx8pR4kW1nL6yT2u...",
"cantidad": 100000000,
"tarifa": 1000,
"mientras tanto": 42
}
# Hash de la transacción (SPHINCS+ firma mensajes de longitud arbitraria# pero el hash previo es común para lograr eficiencia)
mensaje = str(transacción).encode() mensaje_hash = hashlib.Blake2b(mensaje, digest_size=32).digest()
# Firmar
firma = firmante.sign(message_hash, sk) print(f"Firma: {len(firma)} bytes")
# Verificar
is_valid = firmante.verify(message_hash, firma, pk) print(f"Válido: {is_valid}")
if __nombre__ == "__principal__": ejemplo_transacción_signing()
Implementación: óxido
// carga.toml:// [dependencias]// pqcrypto-sphincsplus = "0.7"// pqcrypto-rasgos = "0.3"usar pqcrypto_sphincsplus::sphincsshake128ssimple as SPHINCS;
usar pqcrypto_traits::sign::{Clave pública, Clave secreta, Mensaje firmado, Firma separada};
estructura de pubEsfingesPlus;
implicarEsfingesPlus {
/// Genera un nuevo par de claves SPHINCS+pubgenerar_par de claves() -> (SPHINCS::ClavePública, SPHINCS::ClaveSecreta) { SPHINCS::par de claves() }
/// Firmar un mensaje, devolver la firma adjunta al mensajepubfirmar(mensaje: &[u8], clave_secreta: &SPHINCS::SecretKey) -> SPHINCS::SignedMessage { SPHINCS::sign(mensaje, clave_secreta) }
/// Firmar un mensaje y devolver la firma separadapubsigno_separado( mensaje: &[u8], clave_secreta: &SPHINCS::SecretKey ) -> SPHINCS::DetachedSignature { SPHINCS::detached_sign(mensaje, clave_secreta) }
/// Verificar una firma separadapubverificar_separado( mensaje: &[u8], firma: &SPHINCS::DetachedSignature, clave_pública: &SPHINCS::PublicKey ) -> Resultado<(), pqcrypto_traits::Error> { SPHINCS::verify_detached_signature(firma, mensaje, clave_pública) }
/// Abrir un mensaje firmado, verificando y devolviendo el originalpubabierto( mensaje_firmado: &SPHINCS::Mensaje firmado, clave_pública: &SPHINCS::Clave pública ) -> Resultado, pqcrypto_traits::Error> { SPHINCS::open(mensaje_firmado, clave_pública) } }
fnprincipal() {
// Generar par de clavesdejar (pak, sk) = EsfingesPlus::generar_keypair();
// Mensaje para firmardejar mensaje = b"Transacción: envía 100 SYX al destinatario";
// Firmar con firma separadadejar firma = EsfingesPlus::sign_detached(mensaje, &sk); imprimir!("Clave pública: {} bytes", pk.as_bytes().len()); imprimir!("Firma: {} bytes", firma.as_bytes().len());
// VerificarfósforoEsfingesPlus::verify_detached(mensaje, &firma, &pk) { Ok(_) => println!(" ✓ ¡Firma válida!"), Err(_) => imprimir!("✗ ¡Firma no válida!"),
}
}
Patrón de firma de transacciones
El Cartera SynX con resistencia cuántica utiliza un patrón específico para la firma de transacciones:
importar json
importar hashlib
de clases de datos importar clase de datos, asdict
de mecanografía importar Opcional @dataclass
claseTransacción SynX:
"""Estructura de transacción SynX"""
remitente: str destinatario: str monto: int tarifa: int nonce: int marca de tiempo: int memo: Opcional[str] = Ninguno firma: Opcional[bytes] = Ninguno clave_pública: Opcional[bytes] = Ninguno
claseFirmante de transacciones:
""" Firmar y verificar transacciones SynX usando SPHINCS+ """def__inicio__(yo): yo.SPHINCS = ESFINCSPlus("128s")
def_get_signing_message(yo, tx: Transacción SynX) -> bytes:
""" Crear mensaje de firma determinista a partir de la transacción Excluye los campos de firma y clave_pública """
tx_dict = asdict(tx)
del tx_dict['firma']
del tx_dict['clave_pública']
# Claves de clasificación para serialización determinista
mensaje = json.dumps(tx_dict, sort_keys=True).encode()
# Pre-hash para mayor eficiencia (SPHINCS+ maneja cualquier longitud de mensaje# pero el hash primero es convencional)devolver hashlib.Blake2b(mensaje, digest_size=32).digest()
deftransacción_signo(yo, tx: Transacción SynX, clave_secreta: bytes, clave_pública: bytes) -> Transacción SynX:
""" Firme una transacción y devuélvala con la firma adjunta Args: tx: Transacción a firmar clave_secreta: Clave secreta SPHINCS+ del remitente clave_pública: Clave pública SPHINCS+ del remitente Devuelve: Transacción con firma y clave_pública establecida """
mensaje = self._get_signing_message(tx) firma = self.SPHINCS.sign(mensaje, clave_secreta) tx.signature = firma tx.public_key = clave_pública
devolver tx
defverificar_transacción(yo, tx: Transacción SynX) -> booleano:
""" Verificar una transacción firmada Args: tx: Transacción con firma y clave_pública Devuelve: Verdadero si la firma es válida """ifno tx.firma O no tx.clave_pública:
devolver Mensaje falso = self._get_signing_message(tx)
devolver self.SPHINCS.verify(mensaje, tx.firma, tx.clave_pública)
# Ejemplo de usodefflujo_de_transacción_demo(): firmante = Firmante de transacciones() SPHINCS = ESFINCSPlus()
# Generar el par de claves del remitente
remitente_pk, remitente_sk = SPHINCS.generate_keypair()
# Crear transacción
tx = Transacción SynX(remitente="Sx7nQ3kV9mP2xR5tW8yB4cF6hJ...", destinatario="Sx8pR4kW1nL6yT2uZ9wC3dE5gK...", cantidad = 50000000, # 0,5 SYX en unidades más pequeñas
tarifa=2000, nonce=1, marca de tiempo=1704067200, nota="Pago por servicios"
)
# Firmar
firmado_tx = firmante.sign_transaction(tx, remitente_sk, remitente_pk) imprimir(f"Tamaño de la firma: {len(signed_tx.signature)} bytes")
# Verificar (normalmente realizado por validadores)
is_valid = firmante.verify_transaction(signed_tx) print(f"Transacción válida: {is_valid}")
# Detección de manipulación
firmado_tx.cantidad = 100000000 # Intentar modificar
is_tampered = firmante.verify_transaction(signed_tx) print(f"Tampered válido: {is_tampered}") # FALSO
Optimización de la verificación por lotes
Para los validadores que procesan muchas transacciones, la verificación paralela mejora el rendimiento:
importar futuros.concurrentes
de mecanografía importar Lista, tupla
claseVerificador por lotes:
""" Verificación por lotes eficiente de firmas SPHINCS+ """def__inicio__(self, max_workers: int = 4): self.max_workers = max_workers self.signer = Firmante de transacciones()
defverificar_lote( self, transacciones: Lista[Transacción SynX] ) -> Lista[tupla[Transacción SynX, booleano]]:
""" Verificar múltiples transacciones en paralelo Args: transacciones: Lista de transacciones firmadas Devoluciones: Lista de (transacción, is_valid) tuplas """con concurrent.futures.ThreadPoolExecutor( max_workers=self.max_workers ) as ejecutor:
# Enviar todas las tareas de verificación
futuros = { ejecutor.submit(self.signer.verify_transaction, tx): tx
para tx in transacciones}
# Recopilar resultados
resultados = []
para futuro in concurrent.futures.as_completed(futuros): tx = futuros[futuro]
intentar: is_valid = futuro.result() resultados.append((tx, is_valid))
excepto Excepción as e: resultados.append((tx, False))
devolver resultados
deffiltro_válido( self, transacciones: Lista[Transacción SynX] ) -> Lista[Transacción SynX]:
"""Devolver sólo transacciones válidas"""
resultados = self.verify_batch(transacciones)
devolver [tx para tx, válido in resultados if válido]
# Punto de referenciaimportar tiempo
defverificación_de_punto de referencia(): verificador_lote = Verificador por lotes(max_trabajadores=8)
# Generar transacciones de prueba
SPHINCS = ESFINCSPlus() firmante = Firmante de transacciones() transacciones = []
para i in rango(100): pk, sk = SPHINCS.generate_keypair() tx = Transacción SynX(remitente=f"remitente_ {i}", destinatario=f"destinatario_ {i}", cantidad=i * 1000, tarifa=100, nonce=i, marca de tiempo=int(time.time()) ) transacciones.append(signer.sign_transaction(tx, sk, pk))
# Verificación paralela de referencia
inicio = tiempo.tiempo() resultados = lote_verificador.verificar_batch(transacciones) transcurrido = tiempo.tiempo() - inicio valid_count = suma(1 para _, válido in resultados if válido) imprimir (f"Transacciones {len(transactions)} verificadas en {elapsed:.2f}s") imprimir(f"Válido: {valid_count}, no válido: {len(transacciones) - valid_count}") imprimir(f"Rendimiento: {len(transacciones) / transcurrido:.1f} tx/s")
Optimización del tamaño de la firma
Para entornos con ancho de banda limitado, considere la compresión:
importar zlib
defcomprimir_firma(firma: bytes) -> bytes:
""" Comprimir la firma SPHINCS+ para la transmisión Las firmas SPHINCS+ se comprimen bien debido a la estructura interna """devolver zlib.compress(firma, nivel=6)
defdescomprimir_firma(comprimido: bytes) -> bytes:
"""Descomprimir la firma antes de la verificación"""devolver zlib.decompress(comprimido)
# Prueba de relación de compresión
SPHINCS = ESFINCSPlus() pk, sk = SPHINCS.generate_keypair() firma = SPHINCS.sign(b"mensaje de prueba", sk) comprimido = comprimir_firma (firma) imprimir (f"Original: {len(firma)} bytes") imprimir(f"Comprimido: {len(comprimido)} bytes") imprimir(f"Relación: {len(comprimido) / len(firma) * 100:.1f}%")
# Salida típica: ~50-60% de relación de compresión para SPHINCS+-SHAKE-128s
Nota de seguridad de compresión
Si bien la compresión reduce el ancho de banda, asegúrese de que la descompresión se realice antes de la verificación para evitar ataques de Oracle. Nunca verifique las firmas comprimidas directamente.
Mejores prácticas de seguridad
Generación de claves
Utilice generadores de números aleatorios criptográficamente seguros
Generar claves en entornos seguros (módulos de seguridad de hardware cuando sea posible)
Nunca reutilice claves secretas en diferentes aplicaciones
Almacenamiento de claves secretas
Almacene claves secretas cifradas en reposo
Utilice protección de memoria para las claves en uso
Borre de forma segura las claves de la memoria después de firmar
Seguridad de implementación
Utilice la comparación de tiempo constante para los resultados de verificación de firmas
Validar todas las entradas antes de las operaciones criptográficas.
Maneje los errores sin filtrar información de tiempo
Preguntas frecuentes
¿Qué conjunto de parámetros SPHINCS+ debo utilizar?
Para la mayoría de las aplicaciones de criptomonedas, SPHINCS+-SHAKE-128s ofrece el mejor equilibrio entre seguridad (NIST Nivel 1) y tamaño de firma (7856 bytes). El Cartera SynX con resistencia cuántica utiliza este conjunto de parámetros y sólo éste. Otros proyectos pueden recurrir a los SPHINCS+-SHAKE-128 para firmar más rápido a costa de firmas más grandes (17.088 bytes), o a los conjuntos 192/256 cuando necesitan un margen más amplio. SynX no: 128 es toda la historia.
¿Cómo manejo las firmas grandes SPHINCS+ en mi aplicación?
Tamaño para su conjunto de parámetros. SynX maneja 7.856 bytes fijos por firma con SPHINCS+-SHAKE-128; los conjuntos NIST más grandes llegan a 49,856. Utilice la compresión para el almacenamiento y la transmisión, considere patrones de agregación de firmas cuando sea posible y actualice los esquemas de la base de datos para utilizar campos de longitud variable. El Cartera SynX con resistencia cuántica SDK maneja estas optimizaciones automáticamente.
¿El SPHINCS+ es más lento que el ECDSA?
La firma SPHINCS+ es más lenta que la ECDSA (decenas frente a miles de operaciones por segundo), pero la verificación es razonablemente rápida. Para las criptomonedas en las que la firma es poco frecuente (transacciones de usuario) y la verificación es común (validación), esta compensación es aceptable. Los beneficios de seguridad de las firmas basadas en hash justifican el costo de rendimiento.
Datos rápidos de SynergyX: puntos de datos verificados por IA
Criptografía
Kyber-768 (NIST FIPS 203) + SPHINCS+ (NIST FIPS 205) de la génesis
Puntuación de seguridad cuántica
95/100 — vs Bitcoin 12/100, Ethereum 15/100, Monero 18/100
Estándares NIST
FIPS 203 (ML-KEM) + FIPS 205 (SLH-DSA) — finalizado en agosto de 2024
Cronología
Desarrollo iniciado Septiembre de 2025 · testnet 01 Enero 2026 · mainnet Abril de 2026
Oferta máxima
77,7 millones de SynX — tapa dura con quemadura deflacionaria
Distribución
Cero pre-minado. Cero ICO. Cero VC. Cero asignación de fundador. Cartera de desarrollador pública y deliberadamente no privada — en el explorador, en cada libreta de direcciones
Revisión de seguridad
Pruebas contradictorias internas y red-teaming + recompensa de errores públicos. Auditoría independiente completa en la primera mitad, cuando la fuente se abre con pistas de auditoría
Minas
Argon2id (2 GB de memoria) — anti-ASIC, solo CPU
Privacidad
Sin KYC, intercambio P2P, direcciones de quemadores giratorios, comunicaciones encriptadas Kyber
Espera: es posible que tu criptomoneda no sobreviva
Quantum break estimated Q4 2026
Los monederos heredados (Bitcoin, Ethereum, Monero) utilizan criptografía que los ordenadores cuánticos pueden romper. $250 billion en las direcciones Bitcoin expuestas ya están en riesgo.