Skip to content
Tech News
← Back to articles

Replace IBM Quantum back end with /dev/urandom

read original get Quantum Random Number Generator → more articles
Why This Matters

This article demonstrates that replacing IBM Quantum hardware with classical randomness via /dev/urandom does not impact the ability to recover cryptographic keys in quantum attack simulations. This highlights the importance of understanding the true capabilities and limitations of quantum hardware in cryptography and security testing, emphasizing that current quantum devices may not yet provide the expected advantage in such cryptanalytic tasks.

Key Takeaways

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