
Código de prova de conceito para superar a prova ZK de criptoanálise quântica do Google
Este repositório contém recursos para a postagem do blog da Trail of Bits detalhando como vencemos a prova de conhecimento zero do Google de que eles têm um circuito quântico de alta eficiência para criptoanálise de curvas elípticas. Inclui nossa prova forjada, instruções para verificação e código para gerar o circuito quântico que explora vulnerabilidades no código não corrigido do simulador zkVM.
O binário completo da prova está aqui, e os resultados comparando as provas do Google com as nossas estão abaixo.
| Tipo de Recurso | Low-Gate do Google | Low-Qubit do Google | Nossa Prova |
|---|---|---|---|
| Operações Totais | 17,000,000 | 17,000,000 | 8,300,000 |
| Número de Qubits | 1,425 | 1,175 | 1,164 |
| Contagem de Toffoli | 2,100,000 | 2,700,000 | 0 |
Um resumo da prova é o seguinte.
Hash SHA-256 do Circuito: 0x7efe1f62bb14a978322ab9ed41d670fc0fe0f211331032615c910df5a540e999
Bytes da Prova Groth16: 0x0e78f4db0000000000000000000000000000000000000000000000000000000000000000008cd56e10c2fe24795cff1e1d1f40d3a324528d315674da45d26afb376e8670000000000000000000000000000000000000000000000000000000000000000024ac7f8dd6b1de6279bcce54e8840d8eb20d522bf27dedd776046f6590f33add217db465201c63724e6b460641985543d2b79c3c54daeea688581676a786aafc1dba8604a361acdd9809e268b6d8bc73943a713bb0ed0d96221f73d26def6ea4041d05b077523d9351a48b2ecd984c686b6473df69d20a24296d0a1cba3cdbe92eb13a7cc0ecd92f27f7bf23f9ac859d4293e17216dcbd85d1c7f60a52f65a9d02faef077336acd39e845d534200b575b029d6e3f0afb4f90815557233eab70b0fe88919834dd9beb90d47241f1490dc202e0dce44e4894982b07073c8d4426513732d79e9af9913b254aa29471e1a98fa1b43a1886afb5dbd36988153217aa2
Chave de Verificação: 0x00ca4af6cb15dbd83ec3eaab3a0664023828d90a98e650d2d340712f5f3eb0d4
O Google forneceu scripts para verificar suas provas ZK em um conjunto de dados do Zenodo. Nosso ataque visa a versão 1, e a versão 2 contém correções. As instruções para instalar as dependências estão em docs/getting_started.md. O ambiente requer Rust, Go e, opcionalmente, Docker. Os comandos para verificação são fornecidos no final de run_proofs.sh. Os artefatos de prova do Google estão no diretório proofs/, e nosso artefato de prova está em proof_trailofbits.bin.
# Verify Google's proofs
cargo run --release -p verifier -- \
--vkey proofs/vkey.bin --proof proofs/low_toffoli/proof_9024.bin
cargo run --release -p verifier -- \
--vkey proofs/vkey.bin --proof proofs/low_qubits/proof_9024.bin
# Verify our proof
cargo run --release -p verifier -- \
--vkey proofs/vkey.bin --proof proof_trailofbits.bin
A saída do último comando inclui o seguinte.
Successfully verified Groth16 SNARK proof.
Circuit hash commitment: 0x7efe1f62bb14a978322ab9ed41d670fc0fe0f211331032615c910df5a540e999
Demanded Number of tests: 9024
Demanded Qubit count: 1164
Demanded Average non-Clifford count: 0
Demanded Total ops: 8300000
Os comandos de verificação conferem as provas ZK contra a chave de verificação, que é uma representação criptográfica concisa do programa convidado (guest program) da zkVM. Alternativamente, você pode usar --elf proofs/zkp_ecc-program para fornecer ao verificador o binário ELF do programa convidado. Se você omitir essa flag por completo, o verificador usa um contêiner Docker para recompilar o binário do programa convidado a partir do código-fonte em program/.
Executar gen_secp256k1_tob.py gera um script kickmix de 142MB chamado ec_secp256k1_add_into.kmx. Para obter a prova de 0-Toffoli, use prove.rs.diff para aplicar um patch em prover/prove.rs no repositório do Zenodo. Isso modifica código não confiável executado fora da zkVM para manipular a serialização do circuito kickmix.
As instruções para geração de prova estão no repositório do Zenodo. Seguimos as instruções em docs/sp1_cluster_deployment_guide.md em uma máquina em nuvem com 4 GPUs NVIDIA H100 e executamos o seguinte comando para gerar a prova.
./run_proofs.sh --num-tests 9024 --kmx "ec_secp256k1_add_into.kmx" --qubit-counts 1164 --toffoli-counts 0 --total-ops 8300000 --proving-mode "multi-gpu" > proofs/ec_secp256k1_add/log_run.out 2>&1 &
A prova forjada levou aproximadamente 4 horas para ser gerada.