trailofbits/quantum-zk-proof-poc

GitHub: trailofbits/quantum-zk-proof-poc

该仓库展示了如何通过伪造证明突破 Google 的量子零知识证明,揭示 zkVM 模拟器的安全漏洞。

Stars: 0 | Forks: 0

# Google量子密码分析零知识证明的PoC突破 本仓库包含[Trail of Bits博客文章](https://blog.trailofbits.com/2026/04/17/we-beat-googles-zero-knowledge-proof-of-quantum-cryptanalysis/)所需的资源,详细介绍了我们如何击败Google关于其高效量子电路对椭圆曲线密码分析所提出的零知识证明。内容包括伪造的证明、验证说明以及利用未修补的zkVM模拟器代码漏洞生成量子电路的代码。 完整的证明二进制文件[在此](proof_trailofbits.bin),以下是Google的证明与我们的证明结果的对比。 | 资源类型 | Google 低门数 | Google 低量子比特 | 我们的证明 | | :---- | ----- | ----- | ----- | | 总操作数 | 17,000,000 | 17,000,000 | 8,300,000 | | 量子比特数 | 1,425 | 1,175 | 1,164 | | Toffoli计数 | 2,100,000 | 2,700,000 | 0 | 证明摘要如下。 **电路SHA-256哈希值:** `0x7efe1f62bb14a978322ab9ed41d670fc0fe0f211331032615c910df5a540e999` **Groth16证明字节:** `0x0e78f4db000000000000000000000000000000000000000000000000000000000008cd56e10c2fe24795cff1e1d1f40d3a324528d315674da45d26afb376e8670000000000000000000000000000000000000000000000000000000000000000024ac7f8dd6b1de6279bcce54e8840d8eb20d522bf27dedd776046f6590f33add217db465201c63724e6b460641985543d2b79c3c54daeea688581676a786aafc1dba8604a361acdd9809e268b6d8bc73943a713bb0ed0d96221f73d26def6ea4041d05b077523d9351a48b2ecd984c686b6473df69d20a24296d0a1cba3cdbe92eb13a7cc0ecd92f27f7bf23f9ac859d4293e17216dcbd85d1c7f60a52f65a9d02faef077336acd39e845d534200b575b029d6e3f0afb4f90815557233eab70b0fe88919834dd9beb90d47241f1490dc202e0dce44e4894982b07073c8d4426513732d79e9af9913b254aa29471e1a98fa1b43a1886afb5dbd36988153217aa2` **验证密钥:** `0x00ca4af6cb15dbd83ec3eaab3a0664023828d90a98e650d2d340712f5f3eb0d4` ## 验证步骤 Google在[Zenodo数据集](https://zenodo.org/records/19196956)中提供了用于验证其ZK证明的脚本。我们的攻击针对版本1,版本2包含补丁。安装依赖的说明位于 `docs/getting_started.md`。环境需要Rust、Go,以及可选的Docker。验证命令在 `run_proofs.sh` 文件末尾提供。Google的证明工件位于 `proofs/` 目录,我们的证明工件位于[proof_trailofbits.bin](proof_trailofbits.bin)。 ``` # 验证 Google 的 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 # 验证我们的 proof cargo run --release -p verifier -- \ --vkey proofs/vkey.bin --proof proof_trailofbits.bin ``` 最后一条命令的输出包含以下内容。 ``` 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 ``` 验证命令会使用验证密钥检查ZK证明,该密钥是zkVM客户程序的可加密简洁表示。或者,可以使用 `--elf proofs/zkp_ecc-program` 向验证器提供客户程序ELF二进制文件。如果完全省略该标志,验证器会使用Docker容器从 `program/` 中的源代码重建客户程序二进制文件。 ## 攻击步骤 运行 `gen_secp256k1_tob.py` 会生成一个142MB的kickmix脚本,名为 `ec_secp256k1_add_into.kmx`。要实现0-Toffoli证明,请使用 `prove.rs.diff` 修改 `prover/prove.rs`(位于Zenodo仓库中)。这会修改在zkVM外部运行的不受信任代码,以操纵kickmix电路的序列化。 证明生成说明位于Zenodo仓库中。我们按照 `docs/sp1_cluster_deployment_guide.md` 中的说明,在一台配备4块NVIDIA H100 GPU的云机器上运行了以下命令以生成证明。 ``` ./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 & ``` 伪造的证明生成耗时约4小时。
标签:Groth16, Proof of Concept, SHA-256, Toffoli计数, Trail of Bits, ZK-SNARK, zkVM, 低量子比特, 低门数电路, 区块链安全, 可视化界面, 威胁模拟, 密码学攻击, 日志审计, 椭圆曲线密码学, 模拟器漏洞, 电路伪造, 请求拦截, 谷歌量子项目, 资源优化, 量子优势, 量子密码分析, 量子电路生成, 量子计算, 零知识证明