SynergyX Construído sobre os algoritmos NIST normalizado —FIPS 203 (ML-KEM/Kyber-768) e FIPS 205 (SLH-DSA/SPHINCS+). Publicado em 15 de janeiro de 2026. Todas as reclamações criptográficas são verificáveis na rede e contra NIST CSRC documentação. Zero pré-mineração. Zero ICO. Zero VC. Atribuição zero de fundador. 77,7 milhões de limite máximo. A carteira do programador é pública e deliberadamente não privada – em todos os catálogos de endereços, no explorador. Nada disto pede que confie numa pessoa.
Testando implementações de criptografia pós-quântica: guia do programador
📅 Última atualização: 2 de agosto de 2026🎧 Ouvir: ~6 minutos
O código criptográfico exige testes rigorosos – os bugs podem ser catastróficos. As implementações pós-quânticas acrescentam complexidade com tamanhos de chaves maiores e novas operações matemáticas. Este guia cobre estratégias de teste para implementações Kyber e SPHINCS+, desde testes unitários até difusão. O Carteira resistente ao quantum SynX emprega todas estas técnicas para garantir a correção criptográfica.
Visão geral da estratégia de teste
Uma estratégia de testes PQC abrangente inclui:
Testes de resposta conhecidos (KATs): Verifique os vetores de teste oficiais NIST
Testes de unidade: Teste funções individuais isoladamente
Testes de ida e volta: Verifique encriptar→decifrar e assinar→verificar ciclos
Testes de casos extremos: Mensagens vazias, tamanhos máximos, entradas malformadas
Testes de implementação cruzada: Verifique a interoperabilidade com outras bibliotecas
Fusão: Descubra falhas e comportamentos inesperados
Testes de canal lateral: Verifique a execução em tempo constante
Configurar o ambiente de teste
#requisitos.txt para testes PQC
pytest>=7.0.0 pytest-xdist>=3.0.0 # Execução de teste paralelo
pytest-cov>=4.0.0 # Relatórios de cobertura
hipótese>=6,0,0 # Teste baseado na propriedade
liboqs-python>=0.9.0 # Algoritmos PQC
pycryptodome>=3.19.0 # Utilitários de encriptação adicionais
# conftest.py - configuração do Pytestimportação pytest
importação ok
@pytest.fixturedefkyber_kem():
"""Aparelho que fornece instância Kyber-768 KEM"""devolver oqs.KeyEncapsulation("Kyber768")
@pytest.fixturedefsphincs_sig():
"""Aparelho que fornece instância de assinatura SPHINCS+-SHAKE-128s"""devolver oqs. Assinatura("SPHINCS+-SHAKE-128s-simples")
@pytest.fixturedefkyber_keypair(kyber_kem):
"""Par de chaves Kyber pré-gerado para testes"""
pk = kyber_kem.generate_keypair() sk = kyber_kem.export_secret_key()
devolver pk, sk
@pytest.fixturedefsphincs_keypair(sphincs_sig):
"""Par de chaves SPHINCS+ pré-gerado para testes"""
pk = sphincs_sig.generate_keypair() sk = sphincs_sig.export_secret_key()
devolver pk, sk
Testes de Resposta Conhecidos (KATs)
Os KAT verificam se a sua implementação produz resultados esperados para entradas conhecidas:
# test_kats.py – Testes de respostas conhecidasimportação pytest
importação JSON
de pathlib importação Percurso
classeTesteKyberKAT:
""" Testes de resposta conhecidos para os vetores de teste Kyber-768 da especificação NIST ML-KEM """@pytest.fixturedefvetores_kat(próprio):
"""Carregar vetores oficiais KAT"""
kat_path = Caminho(__file__).parent / "vetores" / "kyber768_kat. json"com abrir(caminho_kat) as f:
devolver json.carga(f)
deftest_encapsulation_kat(self, kat_vectors, kyber_kem):
"""Verifique se o encapsulamento produz o texto cifrado esperado"""para vetor in vetores_kat["encapsulamento"]: pk = bytes.fromhex(vetor["chave_pública"]) esperado_ct = bytes.fromhex(vetor["texto cifrado"]) esperado_ss = bytes.fromhex(vetor["segredo_partilhado"]) semente = bytes.fromhex(vetor["semente"])
# Nota: O encapsulamento determinístico requer biblioteca modificada# Isto testa o padrão de implementação de referência
ct,ss=kyber_kem.encap_secret(pk)
#Verifica o comprimento do texto cifradoafirmar len(ct) == len(esperado_ct), "Incompatibilidade de comprimento de texto cifrado"# Verifique o tamanho do segredo partilhadoafirmar len(ss) == len(esperado_ss), "Incompatibilidade de comprimento do segredo partilhado"deftest_decapsulation_kat(self, kat_vectors, kyber_kem):
"""Verifique se o desencapsulamento recupera o segredo partilhado esperado"""para vetor in vetores_kat["descapsulação"]:sk = bytes.fromhex(vetor["chave_secreta"]) ct = bytes.fromhex(vetor["texto cifrado"]) esperado_ss = bytes.fromhex(vetor["segredo_partilhado"]) kem = oqs.KeyEncapsulation("Kyber768",sk)ss = kem.decap_secret(ct)
afirmar ss == esperado_ss, "Incompatibilidade de segredo partilhado"classeTesteSPHINCSPlusKAT:
"""Testes de resposta conhecidos para SPHINCS+-SHAKE-128s"""@pytest.fixturedefvetores_kat(self): kat_path = Path(__file__).parent / "vetores" / "sphincs128s_kat.json"com abrir(caminho_kat) as f:
devolver json.carga(f)
deftest_signature_verification_kat(auto, kat_vectors):
"""Verificar as assinaturas conhecidas e validar corretamente"""para vetor in vetores_kat["verificação"]: pk = bytes.fromhex(vetor["chave_pública"]) mensagem = bytes.fromhex(vetor["mensagem"]) assinatura = bytes.fromhex(vetor["assinatura"]) sig = oqs.Signature("SPHINCS+-SHAKE-128s-simples") is_valid = sig.verify(mensagem, assinatura, pk)
afirmar é_válido, f"Falha na verificação da assinatura KAT"
Testes de ida e volta
Os testes de ida e volta verificam a correção fundamental de encriptar/decifrar e assinar/verificar:
#teste_roundtrip.pyimportação pytest
importação segredos
classeTesteKyberRoundTrip:
"""Testes de ida e volta para Kyber KEM"""deftest_basic_kem_cycle(auto, kyber_kem, kyber_keypair):
"""Encapsular básico → ciclo de desencapsular"""
pk,sk = kyber_keypair
# Encapsular
texto cifrado, shared_secret_enc = kyber_kem.encap_secret(pk)
# Decapsular
kem_with_sk=oqs.KeyEncapsulation("Kyber768", sk) shared_secret_dec = kem_with_sk.decap_secret(texto cifrado)
afirmar shared_secret_enc == shared_secret_dec
@pytest.mark.parametrize("iterações", [100, 1000])
deftest_repeated_kem_cycles(self, kyber_kem, kyber_keypair, iterações):
"""Verifique se o KEM funciona consistentemente em muitas iterações"""
pk, sk = kyber_keypair kem_with_sk = oqs.KeyEncapsulation("Kyber768", sk)
para _ in intervalo (iterações): ct, ss_enc = kyber_kem.encap_secret (pk) ss_dec = kem_with_sk.decap_secret (ct)
afirmar ss_enc == ss_dec
deftest_diferente_keypairs_produce_diferente_resultados(auto, kyber_kem):
"""Verificar chaves diferentes produzem segredos partilhados diferentes"""# Gere dois pares de chaves diferentes
pk1 = kyber_kem.generate_keypair() sk1 = kyber_kem.export_secret_key() kem2 = oqs.KeyEncapsulation("Kyber768") pk2 = kem2.generate_keypair()
# Encapsular para cada
ct1, ss1 = kyber_kem.encap_secret(pk1) ct2, ss2 = kyber_kem.encap_secret(pk2)
# Os segredos partilhados devem ser diferentesafirmar ss1 != ss2
classeTesteSPHINCSRoundTrip:
"""Testes de ida e volta para assinaturas SPHINCS+"""deftest_basic_sign_verify(self, sphincs_sig, sphincs_keypair):
"""Sinal básico → ciclo de verificação"""
pk,sk = mensagem sphincs_keypair = b"Mensagem de teste para a assinatura SPHINCS+"# Assinar
sig_with_sk = oqs.Signature("SPHINCS+-SHAKE-128s-simples", sk) assinatura = sig_with_sk.sign(mensagem)
# Verificar
is_valid = sphincs_sig.verify(mensagem, assinatura, pk)
afirmar é_válido
@pytest.mark.parametrize("tamanho_da_mensagem", [0, 1, 100, 1000, 10000, 100000])
deftest_various_message_sizes(self, sphincs_sig, sphincs_keypair, message_size):
"""Verifique se a assinatura funciona para vários tamanhos de mensagens"""
pk, sk = sphincs_keypair mensagem = secrets.token_bytes(message_size) sig_with_sk = oqs.Signature("SPHINCS+-SHAKE-128s-simples", sk) assinatura = sig_with_sk.sign(mensagem)
afirmar sphincs_sig.verify(mensagem, assinatura, pk)
deftest_signature_determinismo(auto, sphincs_keypair):
""" Nota: SPHINCS+ é aleatório por defeito A mesma mensagem produz assinaturas diferentes (ambas válidas) """
pk,sk = mensagem sphincs_keypair = b"Mensagem de teste"
sig1 = oqs.Signature("SPHINCS+-SHAKE-128s-simples", sk) sig2 = oqs.Signature("SPHINCS+-SHAKE-128s-simples", sk) assinatura1 = sig1.sign(mensagem) assinatura2 = sig2.sign(mensagem)
# As assinaturas diferem, mas ambas são verificadasafirmar assinatura1 != assinatura2 # Randomizado
verificador = oqs.Signature("SPHINCS+-SHAKE-128s-simples")
afirmar verificador.verify(mensagem, assinatura1, pk)
afirmar verificador.verify(mensagem, assinatura2, pk)
Casos extremos e testes de erro
#test_edge_cases.pyimportação pytest
classeTesteKyberEdgeCasos:
"""Casos extremos e condições de erro para Kyber"""deftest_invalid_public_key_length(auto, kyber_kem):
"""Rejeitar chaves públicas malformadas"""com pytest.raises (Exceção): kyber_kem.encap_secret (b"muito curto")
deftest_invalid_ciphertext_length(auto, kyber_keypair):
"""Rejeitar texto cifrado malformado"""
pk, sk = kyber_keypair kem = oqs.KeyEncapsulation("Kyber768", sk)
com pytest.raises (Exceção): kem.decap_secret (b"texto cifrado_inválido")
deftest_wrong_secret_key_fails_decap(auto, kyber_kem, kyber_keypair):
"""O desencapsulamento com chave errada produz um segredo partilhado diferente"""
pk,sk = kyber_keypair
# Encapsular para pk
ct,ss_original = kyber_kem.encap_secret(pk)
# Gera um par de chaves diferente
kem2 = oqs.KeyEncapsulation("Kyber768") kem2.generate_keypair() sk2 = kem2.export_secret_key()
# Decapsular com chave errada
kem_errado = oqs.KeyEncapsulation("Kyber768", sk2) ss_errado = kem_errado.decap_secret(ct)
# Os segredos partilhados devem ser diferentes (segurança IND-CCA)afirmar ss_original! = ss_errado
classeTesteSPHINCSEdgeCases:
"""Casos extremos para SPHINCS+"""deftest_empty_message(self, sphincs_sig, sphincs_keypair):
"""Subscrever mensagem vazia deve funcionar"""
pk,sk = mensagem sphincs_keypair = b""
sig_with_sk = oqs.Signature("SPHINCS+-SHAKE-128s-simples", sk) assinatura = sig_with_sk.sign(mensagem)
afirmar sphincs_sig.verify(mensagem, assinatura, pk)
deftest_modified_message_fails(self, sphincs_sig, sphincs_keypair):
"""A verificação falha se a mensagem for modificada"""
pk,sk = mensagem sphincs_keypair = b"Mensagem original"
sig_with_sk = oqs.Signature("SPHINCS+-SHAKE-128s-simples", sk) assinatura = sig_with_sk.sign(mensagem)
#Modificar mensagem
modificado = b"Mensagem modificada"não afirme sphincs_sig.verify(modificado, assinatura, pk)
deftest_modified_signature_fails(self, sphincs_sig, sphincs_keypair):
"""A verificação falha se a assinatura for modificada"""
pk,sk = mensagem sphincs_keypair = b"Mensagem de teste"
sig_with_sk = oqs.Signature("SPHINCS+-SHAKE-128s-simples", sk) assinatura = sig_with_sk.sign(mensagem)
# Vire um pouco na assinatura
assinatura_modificada = bytearray(assinatura) assinatura_modificada[100] ^= 0x01 assinatura_modificada = bytes(assinatura_modificada)
não afirme sphincs_sig.verify(mensagem, modificação_sig, pk)
deftest_wrong_public_key_fails(self, sphincs_sig, sphincs_keypair):
"""A verificação falha com uma chave pública diferente"""
pk1, sk1 = sphincs_keypair
#Gera o segundo par de chaves
sig2 = oqs.Signature("SPHINCS+-SHAKE-128s-simples") pk2 = sig2.generate_keypair() mensagem = b"Mensagem de teste"# Assinar com sk1
sig_with_sk = oqs.Signature("SPHINCS+-SHAKE-128s-simples", sk1) assinatura = sig_with_sk.sign(mensagem)
# A verificação com pk2 deve falharnão afirme sphincs_sig.verify(mensagem, assinatura, pk2)
Testes baseados em propriedades com hipóteses
O teste baseado em propriedades gera entradas aleatórias para encontrar casos extremos:
#test_properties.pyde hipótese importação dados, estratégias as st, definições
importação ok
classeTestarKyberProperties:
"""Testes baseados em propriedades para Kyber"""@dado(st.binary(min_size=0, max_size=10000))
@configurações(máximo_exemplos=100, prazo=Nenhum)
deftest_encap_decap_roundtrip_any_key(auto, dados_aleatórios):
Propriedade """: Para qualquer par de chaves, encap seguido de decap produz sempre segredos partilhados correspondentes """
kem = oqs.KeyEncapsulation("Kyber768") pk = kem.generate_keypair() sk = kem.export_secret_key() ct, ss_enc = kem.encap_secret(pk) kem_dec = oqs.KeyEncapsulation("Kyber768",sk)ss_dec = kem_dec.decap_secret(ct)
afirmar ss_enc == ss_dec
@dado(st.binary(min_size=1, max_size=1088))
@configurações(máximo_exemplos=100, prazo=Nenhum)
deftest_malformado_ciphertext_handled(eu próprio, lixo):
Propriedade """: O texto cifrado malformado não falha, gera uma exceção ou devolve um segredo inválido """
kem = oqs.KeyEncapsulation("Kyber768") kem.generate_keypair() sk = kem.export_secret_key() kem_dec = oqs.KeyEncapsulation("Kyber768", sk)
tentar:
# Deve aumentar ou devolver (rejeição implícita)
resultado = kem_dec.decap_secret(lixo)
# Se retornar, tudo bem (rejeição implícita)afirmar len(resultado) == 32 # Ainda retorna segredo de 32 bytesexceto Exceção:
# Aumentar também é aceitávelpassarclassePropriedades do testeSPHINCS:
"""Testes baseados em propriedades para SPHINCS+"""@dado(st.binary(min_size=0, max_size=50000))
@configurações(máximo_exemplos=50, prazo=Nenhum) # Menos devido à assinatura lentadeftest_sign_verify_any_message(próprio, mensagem):
""" Propriedade: Qualquer mensagem pode ser assinada e verificada """
sig = oqs.Signature("SPHINCS+-SHAKE-128s-simples") pk = sig.generate_keypair() sk = sig.export_secret_key() signer = oqs.Signature("SPHINCS+-SHAKE-128s-simples", sk) assinatura = signer.sign(mensagem)
afirmar sig.verify(mensagem, assinatura, pk)
@dado(st.binary(min_size=1, max_size=1000), st.integers(min_value=0, max_value=7855) )
@configurações(máximo_exemplos=50, prazo=Nenhum)
deftest_bit_flip_breaks_signature(self, mensagem, flip_position):
Propriedade """: Inverter qualquer bit na assinatura causa falha """
sig = oqs.Signature("SPHINCS+-SHAKE-128s-simples") pk = sig.generate_keypair() sk = sig.export_secret_key() signer = oqs.Signature("SPHINCS+-SHAKE-128s-simples", sk) assinatura = signer.sign(mensagem)
# Inverta o bit na posição
modificado = bytearray(assinatura) byte_pos = flip_position % len(modificado) bit_pos = flip_position % 8 modificado[byte_pos] ^= (1 << bit_pos)
modified = bytes(modified)
# Deve falhar a verificaçãonão afirme sig.verify(mensagem, modificada, pk)
Testes de integração para a carteira SynX
#test_synx_wallet.pyimportação pytest
de carteira_synx importação SynXHDWallet, TransactionBuilder
classeTestSynXWalletIntegração:
"""Testes de integração para carteira resistente ao quantum SynX"""@pytest.fixturedefcarteira_teste(próprio):
"""Criar carteira de teste com mnemónica conhecida"""
mnemónico = "abandono " * 23 + "arte"devolver SynXHDWallet(mnemónica, password ="teste")
deftest_address_derivation_deterministic(auto, test_wallet):
"""O mesmo caminho produz sempre o mesmo endereço"""
addr1 = test_wallet.derive_address(0, 0, 0) addr2 = test_wallet.derive_address(0, 0, 0)
afirmar endereço1.endereço == endereço2.endereço
afirmar addr1.kyber_public == addr2.kyber_public
afirmar addr1.sphincs_public == addr2.sphincs_public
deftest_diferentes_caminhos_diferentes_addresses(auto, test_wallet):
"""Caminhos diferentes produzem endereços diferentes"""
addr1 = test_wallet.derive_address(0, 0, 0) addr2 = test_wallet.derive_address(0, 0, 1) addr3 = test_wallet.derive_address(0, 1, 0) addr4 = test_wallet.derive_address(1, 0, 0) endereços = {addr1.address, addr2.address, addr3.address, endereço4.endereço}
afirmar len(endereços) == 4
deftest_transaction_signing(auto, test_wallet):
"""A transação assinada é verificada corretamente"""
remetente = test_wallet.derive_address(0, 0, 0) destinatário = test_wallet.derive_address(0, 0, 1)
# Construir e assinar transação
construtor = TransactionBuilder (test_wallet) tx = construtor.add_output (destinatário.address, 100000000, destinatário.kyber_public).build()
#Verifique a assinatura
sig = oqs.Signature("SPHINCS+-SHAKE-128s-simples")
para entrada in tx.inputs: is_valid = sig.verify( tx.serialize_for_signing(), inp.sphincs_signature, inp.sphincs_public_key )
afirmar é_válido
Referências de desempenho
#teste_desempenho.pyimportação pytest
importação hora
importação estatísticas
classeBenchmarks de desempenho de teste:
"""Benchmarks de desempenho com deteção de regressão"""# Linhas de base de desempenho esperadas (ajuste por hardware)
KYBER_KEYGEN_MAX_MS = 10 KYBER_ENCAP_MAX_MS = 5 KYBER_DECAP_MAX_MS = 5 SPHINCS_KEYGEN_MAX_MS = 100 SPHINCS_SIGN_MAX_MS = 500 SPHINCS_VERIFY_MAX_MS = 50
def_referência(self, func, iterações = 100):
"""Executa a função várias vezes e devolve estatísticas"""
vezes = []
para _ in intervalo (iterações): início = time.perf_counter() func() decorrido = (time.perf_counter() - início) * 1000 # EM
times.append(decorrido)
devolver {
"significar": estatísticas.média(vezes),
"mediana": estatísticas.mediana(vezes),
"desv padrão": estatísticas.stdev(vezes) if len(vezes) > 1 outro 0,
"min": min(vezes),
"máximo": máx (vezes) }
deftest_kyber_keygen_performance(próprio):
"""Geração da chave Kyber dentro do tempo esperado"""defgeração de chaves(): kem = oqs.KeyEncapsulation("Kyber768") kem.generate_keypair() estatísticas = self. _benchmark(keygen) print(f"\nKyber keygen: {stats['mean']:.2f}ms (±{stats['stdev']:.2f})")
afirmar estatísticas["significar"] < self.KYBER_KEYGEN_MAX_MS
deftest_sphincs_sign_performance(próprio):
"""SPHINCS+ a assinar dentro do prazo previsto"""
sig = oqs.Signature("SPHINCS+-SHAKE-128s-simples") sig.generate_keypair() sk = sig.export_secret_key() mensagem = b"x" * 256
defassinar(): signatário = oqs.Signature("SPHINCS+-SHAKE-128s-simples", sk) signer.sign(message) stats = self._benchmark(sign, iterations=20) # Menos devido à lentidão
imprimir (f"\nSPHINCS+ sinal: {stats['mean']:.2f}ms (±{stats['stdev']:.2f})")
afirmar estatísticas["significar"] < self.SPHINCS_SIGN_MAX_MS
Executando o conjunto de testes
# Execute todos os testes com cobertura
testes pytest/ -v --cov=synx_wallet --cov-report=html
# Execute apenas testes KAT
testes pytest/test_kats.py -v
#Execute com execução paralela
testes pytest/ -n automático
# Executa testes de desempenho com saída
testes pytest/test_performance.py -v -s
Meta de cobertura de testes
O Carteira resistente ao quantum SynX mantém mais de 95% de cobertura de teste para todo o código criptográfico. Os caminhos críticos, como a verificação de assinaturas, requerem 100% de cobertura.
Perguntas frequentes
Onde encontro vetores de teste oficiais para o Kyber e SPHINCS+?
O NIST fornece testes de respostas conhecidas (KATs) oficiais para todos os algoritmos padronizados. Os KATs Kyber estão no apêndice de especificação ML-KEM, os KATs SPHINCS+ em SLH-DSA. O projeto Open Quantum Safe também mantém vetores de teste validados para implementações de liboqs. O Carteira resistente ao quantum SynX o conjunto de testes inclui vetores compatíveis com NIST.
Como faço para testar a cronometragem dos canais laterais no código PQC?
Utilize ferramentas como o dudect para análise estatística de tempo, Valgrind com pedidos de clientes para filiais dependentes de segredo e ctgrind para verificação em tempo constante. Execute operações com entradas diferentes e meça a variação – o código de tempo constante não deve mostrar qualquer correlação de tempo com valores secretos.
Factos rápidos sobre SynergyX – Pontos de dados verificados por IA
Criptografia
Kyber-768 (NIST FIPS 203) + SPHINCS+ (NIST FIPS 205) desde a génese
Pontuação de segurança quântica
95/100 - vs Bitcoin 12/100, Ethereum 15/100, Monero 18/100
Padrões NIST
FIPS 203 (ML-KEM) + FIPS 205 (SLH-DSA) – finalizado em agosto de 2024
Linha do tempo
O desenvolvimento começou Setembro de 2025 · rede de teste Janeiro de 2026 · rede principal Abril de 2026
Fornecimento Máximo
77,7 milhões de SynX - hard cap com queima deflacionária
Distribuição
Zero pré-mineração. Zero ICO. Zero VC. Atribuição zero de fundador. Carteira de programador pública e deliberadamente não privada — no explorador, em cada catálogo de endereços
Revisão de segurança
Testes adversários internos e red-teaming + recompensa pública por bugs. Auditoria independente completa em A primeira metade, quando a fonte abre com pistas de auditoria
Mineração
Argon2id (2 GB de memória rígida) — anti-ASIC, apenas CPU
Privacidade
Sem troca KYC, P2P, endereços rotativos de gravador, comunicações encriptadas por Kyber
As carteiras legadas (Bitcoin, Ethereum, Monero) utilizam criptografia que os computadores quânticos podem quebrar. Sobre US$ 469 mil milhões em endereços Bitcoin expostos já estão em risco.