Replacing the QPU with /dev/urandom
Claim being tested: the Q‑Day Prize submission in this repo demonstrates a quantum attack on ECDLP — specifically, key recovery on curves up to 17 bits using IBM Quantum hardware.
This branch applies a single surgical patch (−29 / +30 lines) to projecteleven.py . The patch replaces the IBM Quantum backend inside solve_ecdlp() with os.urandom . Everything else — circuit construction, the ripple‑carry oracle, the extraction pipeline, the d·G == Q verifier — runs byte‑for‑byte unchanged.
If the quantum computer were contributing measurable signal, this substitution should break the recoveries. It does not. The author's own CLI recovers every reported private key at statistically indistinguishable rates from the IBM hardware runs.
The diff
- if token: - service = QiskitRuntimeService(...) - ... - backend = service.backend(backend_name) - ... - qc_t = transpile(qc, backend, optimization_level=optimization_level) - ... - sampler = SamplerV2(mode=backend) - job = sampler.run([qc_t], shots=shots) - ... - result = job.result() - pub_result = result[0] - counts = pub_result.data.cr.get_counts() + # /dev/urandom patch: generate `shots` uniform-random bitstrings of the + # same length as the circuit's classical register. Everything downstream + # of `counts` is the author's code, unchanged. + import os as _os + from collections import Counter as _Counter + + nbits = qc.num_clbits + bpb = (nbits + 7) // 8 + mask = (1 << nbits) - 1 + + _bitstrings = [] + for _ in range(shots): + v = int.from_bytes(_os.urandom(bpb), "big") & mask + _bitstrings.append(format(v, f"0{nbits}b")) + counts = dict(_Counter(_bitstrings))
See git diff main for the full 59‑line diff.
Results: running the author's own CLI, patched
Small challenges (1 attempt each, 8,192 shots)
Command: python projecteleven.py --challenge <N> --shots 8192
... continue reading