
गूगल के क्वांटम क्रिप्टैनालिसिस ZK प्रमाण को मात देने के लिए प्रूफ-ऑफ-कॉन्सेप्ट कोड
यह रिपॉज़िटरी Trail of Bits ब्लॉग पोस्ट के लिए संसाधन प्रदान करती है, जिसमें विस्तार से बताया गया है कि कैसे हमने गूगल के उस ज़ीरो-नॉलेज प्रूफ को हराया, जिसमें दावा किया गया था कि उनके पास एलिप्टिक कर्व क्रिप्टैनालिसिस के लिए उच्च-क्षमता वाला क्वांटम सर्किट है। इसमें हमारा जाली प्रूफ, सत्यापन हेतु निर्देश, और क्वांटम सर्किट उत्पन्न करने के लिए कोड शामिल है, जो अनपैच किए गए zkVM सिम्युलेटर कोड में मौजूद कमज़ोरियों का फ़ायदा उठाता है।
पूरा प्रूफ बाइनरी यहाँ उपलब्ध है, और गूगल के प्रूफ़ों की तुलना हमारे प्रूफ़ से करने वाले परिणाम नीचे दिए गए हैं।
| संसाधन प्रकार | गूगल का Low-Gate | गूगल का Low-Qubit | हमारा प्रूफ |
|---|---|---|---|
| कुल ऑपरेशन | 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 प्रूफ बाइट्स: 0x0e78f4db0000000000000000000000000000000000000000000000000000000000000000008cd56e10c2fe24795cff1e1d1f40d3a324528d315674da45d26afb376e8670000000000000000000000000000000000000000000000000000000000000000024ac7f8dd6b1de6279bcce54e8840d8eb20d522bf27dedd776046f6590f33add217db465201c63724e6b460641985543d2b79c3c54daeea688581676a786aafc1dba8604a361acdd9809e268b6d8bc73943a713bb0ed0d96221f73d26def6ea4041d05b077523d9351a48b2ecd984c686b6473df69d20a24296d0a1cba3cdbe92eb13a7cc0ecd92f27f7bf23f9ac859d4293e17216dcbd85d1c7f60a52f65a9d02faef077336acd39e845d534200b575b029d6e3f0afb4f90815557233eab70b0fe88919834dd9beb90d47241f1490dc202e0dce44e4894982b07073c8d4426513732d79e9af9913b254aa29471e1a98fa1b43a1886afb5dbd36988153217aa2
सत्यापन कुंजी: 0x00ca4af6cb15dbd83ec3eaab3a0664023828d90a98e650d2d340712f5f3eb0d4
गूगल ने Zenodo डेटासेट में अपने ZK प्रूफ़ों को सत्यापित करने के लिए स्क्रिप्ट्स प्रदान की हैं। हमारा हमला संस्करण 1 को लक्षित करता है, और संस्करण 2 में पैच शामिल हैं। डिपेंडेंसी स्थापित करने के निर्देश docs/getting_started.md में दिए गए हैं। पर्यावरण के लिए Rust, Go, और वैकल्पिक रूप से Docker की आवश्यकता है। सत्यापन हेतु कमांड run_proofs.sh के अंत में दिए गए हैं। गूगल के प्रूफ आर्टिफैक्ट proofs/ निर्देशिका में हैं, और हमारा प्रूफ आर्टिफैक्ट 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
अंतिम कमांड का आउटपुट निम्नलिखित है।
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 बाइनरी प्रदान करने के लिए --elf proofs/zkp_ecc-program का उपयोग कर सकते हैं। यदि आप इस फ़्लैग को पूरी तरह छोड़ देते हैं, तो वेरिफ़ायर program/ में स्रोत कोड से गेस्ट प्रोग्राम बाइनरी को पुनः बनाने के लिए Docker कंटेनर का उपयोग करता है।
gen_secp256k1_tob.py चलाने पर ec_secp256k1_add_into.kmx नामक 142MB की kickmix स्क्रिप्ट उत्पन्न होती है। 0-Toffoli प्रूफ प्राप्त करने के लिए, Zenodo रिपॉज़िटरी में prover/prove.rs को पैच करने हेतु prove.rs.diff का उपयोग करें। यह 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 घंटे लगे।