
Codice proof-of-concept per superare la prova ZK di Google sulla crittanalisi quantistica.
Questa repository contiene le risorse per il post sul blog di Trail of Bits che descrive come abbiamo superato la prova a conoscenza zero di Google di possedere un circuito quantistico ad alta efficienza per la crittanalisi delle curve ellittiche. Include la nostra prova contraffatta, le istruzioni per la verifica e il codice per generare il circuito quantistico che sfrutta le vulnerabilità nel codice del simulatore zkVM non aggiornato.
Il binario completo della prova si trova qui, e i risultati che confrontano le prove di Google con le nostre sono riportati di seguito.
| Tipo di risorsa | Low-Gate di Google | Low-Qubit di Google | La nostra prova |
|---|---|---|---|
| Operazioni totali | 17.000.000 | 17.000.000 | 8.300.000 |
| Numero di qubit | 1.425 | 1.175 | 1.164 |
| Conteggio Toffoli | 2.100.000 | 2.700.000 | 0 |
Un riepilogo della prova è il seguente.
Hash SHA-256 del circuito: 0x7efe1f62bb14a978322ab9ed41d670fc0fe0f211331032615c910df5a540e999
Byte della prova Groth16: 0x0e78f4db0000000000000000000000000000000000000000000000000000000000000000008cd56e10c2fe24795cff1e1d1f40d3a324528d315674da45d26afb376e8670000000000000000000000000000000000000000000000000000000000000000024ac7f8dd6b1de6279bcce54e8840d8eb20d522bf27dedd776046f6590f33add217db465201c63724e6b460641985543d2b79c3c54daeea688581676a786aafc1dba8604a361acdd9809e268b6d8bc73943a713bb0ed0d96221f73d26def6ea4041d05b077523d9351a48b2ecd984c686b6473df69d20a24296d0a1cba3cdbe92eb13a7cc0ecd92f27f7bf23f9ac859d4293e17216dcbd85d1c7f60a52f65a9d02faef077336acd39e845d534200b575b029d6e3f0afb4f90815557233eab70b0fe88919834dd9beb90d47241f1490dc202e0dce44e4894982b07073c8d4426513732d79e9af9913b254aa29471e1a98fa1b43a1886afb5dbd36988153217aa2
Chiave di verifica: 0x00ca4af6cb15dbd83ec3eaab3a0664023828d90a98e650d2d340712f5f3eb0d4
Google ha fornito script per verificare le proprie prove ZK in un dataset Zenodo. Il nostro attacco ha come bersaglio la versione 1, mentre la versione 2 contiene le patch. Le istruzioni per installare le dipendenze sono in docs/getting_started.md. L'ambiente richiede Rust, Go e, opzionalmente, Docker. I comandi per la verifica sono forniti alla fine di run_proofs.sh. Gli artefatti delle prove di Google sono nella directory proofs/, e il nostro artefatto di prova è in proof_trailofbits.bin.
# Verifica delle prove di Google
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
# Verifica della nostra prova
cargo run --release -p verifier -- \
--vkey proofs/vkey.bin --proof proof_trailofbits.bin
L'output dell'ultimo comando include quanto segue.
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
I comandi di verifica controllano le prove ZK rispetto alla chiave di verifica, che è una rappresentazione crittografica concisa del programma guest della zkVM. In alternativa, puoi usare --elf proofs/zkp_ecc-program per fornire al verificatore il binario ELF del programma guest. Se ometti del tutto questo flag, il verificatore usa un container Docker per ricostruire il binario del programma guest dal codice sorgente in program/.
Eseguire gen_secp256k1_tob.py genera uno script kickmix da 142MB chiamato ec_secp256k1_add_into.kmx. Per ottenere la prova con 0 Toffoli, usa prove.rs.diff per applicare la patch a prover/prove.rs nella repository Zenodo. Questa modifica il codice non fidato che viene eseguito all'esterno della zkVM per manipolare la serializzazione del circuito kickmix.
Le istruzioni per la generazione della prova sono nella repository Zenodo. Abbiamo seguito le istruzioni in docs/sp1_cluster_deployment_guide.md su una macchina cloud con 4 GPU NVIDIA H100 ed eseguito il seguente comando per generare la 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 &
La generazione della prova contraffatta ha richiesto circa 4 ore.