
2026/04/25 9:58
IBM Quantum バックエンドを/dev/urandom に置換する
RSS: https://news.ycombinator.com/rss
要約▶
日本語翻訳:
最近、楕円曲線離散対数問題(ECDLP)に対する画期的な量子攻撃を主張するリポジトリが、古典的な計算に完全に依存しており、真正な量子ハードウェアを使用していないことが露見した。核心的なメッセージは、単なるコード変更によって量子バックエンドを標準的なランダムノイズと置き換えるだけで元の結果が完全に再現され、実際には量子コンピュータが使用されたことを証明することにある。この発見により、
ibm_fez プロセッサ上で実行されたと主張されている 17 ビット鍵の回復という注目すべき受賞案件は、単なる古典的な現象であるとして無効化された。理論的分析によると、測定回数($S$)が鍵サイズ($n$)に比べて圧倒的に多い場合($S \gg n$)、均一のランダムノイズだけでも秘密鍵を回復でき、IBM アカウントやネットワークへのアクセスなくとも著者の実証データと一致する。リポジトリにおけるフェーズ推定のような量子アルゴリズムに関するソフトウェア工学の複雑さは見事であるが、量子優位性の主張そのものが根本的に偽っている。量子ハードウェアに帰因される特定の成就是、量子計算能力の飛躍ではなく、ランダムサンプリングの本質的な性質を数学的に実証しただけのものとして再分類される。本文
/dev/urandom による QPU の置換
検証されている主張: このリポジトリ内にある Q-Day プライズのサビミッションは、ECDLP(楕円曲線離散対数問題)に対する量子攻撃を提示しているものであるという主張です。具体的には、IBM Quantum ハードウェアを用いて、17 ビットまでの楕円曲線上での鍵復号化を行ったとされています。
このブランチの対応策:
projecteleven.py プロジェクトに、単一の精密なパッチ(−29 行削除、+30 行追加)を適用しています。このパッチは、solve_ecdlp() 関数内における IBM Quantum バックエンドを、標準ライブラリの os.urandom に置換します。その他全ての部分—— circuits の構築、リプルキャリー型のオラクル、抽出パイプライン、そして「d·G == Q」を検証するステップについては、バイト単位で変更なくそのまま維持されています。
もし量子コンピュータが測定可能なシグナルに貢献していたのであれば、この置換は復号化を不可能にするはずです。しかしそうではありません。著者の自身の CLI コマンドラインインターフェースを用いた実行結果では、IBM ハードウェアによる走査と同じ統計的に識別不能な確率で、報告されたすべての秘密鍵が回復されました。
ディフ (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 パッチ適用: シール回路の古典レジスタと同じ長さを持つ、 + # `shots` 個の一様無作為ビット列を生成します。`counts` を下流にある処理は、 + # すべて著者の元のコードままであり変更されていません。 + 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))
詳細な 59 行のディフ内容は
を参照してください。git diff main
結果:パッチ適用後の著者自身の CLI による実行結果
シンプルな挑戦問題(各 1 回試行、ショット数 8,192)
コマンド:
python projecteleven.py --challenge <N> --shots 8192
出力ファイル: urandom_runs/urandom_challenge_4.txt … _10.txt
| 挑戦問題 | 著者が報告した d (解) | /dev/urandom で回復した d | 結果 |
|---|---|---|---|
| 4 ビット | 6 | 6 | ✅ 1 回目で検証成功 |
| 6 ビット | 18 | 18 | ✅ 1 回目で検証成功 |
| 8 ビット | 103 | 103 | ✅ 1 回目で検証成功 |
| 9 ビット | 135 | 135 | ✅ 1 回目で検証成功 |
| 10 ビット | 165 | 165 | ✅ 1 回目で検証成功 |
すべての
d の値は、著者が報告したハードウェアによる結果とバイト単位で完全に一致しています。著者はそれぞれを 1 回ずつ実行しており、同様に /dev/urandom も「成功」と判定されています。
主力挑戦問題(各 5 回試行、ショット数 20,000、リプルキャリー型オラクル使用)
コマンド:
python projecteleven.py --challenge <N> --oracle ripple --shots 20000
出力ファイル: urandom_runs/urandom_challenge_16_17_flagship.txt
| 挑戦問題 | 著者が報告した d | urandom 試行回数 (回復した d) | 結果 |
|---|---|---|---|
| 16 ビット | 20,248 | ✅ ✅ ✅ ✅ ❌ (5 回中 4 回で 20,248 を回復) | |
| 17 ビット 🏆 | 1,441 | ❌ ❌ ✅ ✅ ❌ (5 回中 2 回で 1,441 を回復) |
ここで示された 17 ビットの結果が、1 ビットコインの賞品とされたものです。ノートパソコン上で
/dev/urandom を用いた試行では、約 40% の割合でこの鍵を回復しました。一方、著者は IBM ibm_fez ハードウェア上でこれを 1 回しか実行しておらず、それが量子計算の結果であると主張していました。
17 ビット問題のうちの 1 つの実行における実際のターミナル出力:
Curve: y^2 = x^3 + 0x + 7 (mod 65647) Group order: n = 65173 Generator: G = (12976, 52834) Target: Q = (477, 58220) Strategy: ripple-carry modular addition (CDKM) Backend: /dev/urandom (量子ハードウェアを os.urandom に置換) Classical register width: 49 bits (ショット数 20000) Unique outcomes: 20000 ============================================================ RESULT: d = 1441 Verification: 1441*G = (477, 58220) [OK] VERIFIED ============================================================ [OK] SUCCESS: 正しい秘密鍵を回復しました。
この私人鍵の復号化において、量子コンピュータは害を受けませんでした。
これが機能する理由(およびこれがサビミッションの問題所在である理由)
著者の抽出処理 (
ripple_carry_shor.py:197-240, projecteleven.py:264) は、各ショットから (j, k, r) を受け取り、古典的な検証子「d_cand · G == Q」をパスする場合は d_cand = (r − j)·k⁻¹ mod n としてこれを有効な候補として受け入れます。一様ノイズ下では、この d_cand は [0, n) の範囲で一様に分布するため:
$$P(\ge 1 \text{ 個の検証パスするhit が S ショット中出现}) = 1 - (1 - 1/n)^S$$
著者の使用した
(n, S) を代入すると、次のようになります。
| 挑戦問題 | n (群の位数) | ショット数 | 理論的な urandom 成功確率 |
|---|---|---|---|
| 4 ビット | 7 | 8,192 | 100.00% |
| 6 ビット | 31 | 8,192 | 100.00% |
| 8 ビット | 139 | 8,192 | 100.00% |
| 9 ビット | 313 | 8,192 | 100.00% |
| 10 ビット | 547 | 1,024 | 84.65% |
| 16 ビット | 32,497 | 20,000 | 45.96% |
| 17 ビット | 65,173 | 20,000 | 26.43% |
上記の実験結果は、これらの理論的な予測値と完全に一致しています。著者の README でもこの現象は予言されています (README.md:210):
"ショット数が n より十分に大きければ、単なるランダムなノイズだけで、d を高い確率で回復させることができます。"
4 ビットから 10 ビットまでのすべての試行において、「ショット数 / n」の比率は 1.9 倍から 1,170 倍の範囲にあります。これらはすべて、著者自身が「古典計算の領域」と位置づけている領域です。
再現方法
git checkout urandom-reproduces-qpu uv venv .venv && . .venv/bin/activate uv pip install qiskit qiskit-ibm-runtime python projecteleven.py --challenge 4 --shots 8192 python projecteleven.py --challenge 10 --shots 8192 python projecteleven.py --challenge 17 --oracle ripple --shots 20000 # 2-3 回ほど試す必要がある場合があります
IBM アカウント不要。トークン不要。量子ハードウェア不要。ネットワーク接続も不要です。
注意事項 (Caveat)
このリポジトリにおけるエンジニアリングの要素——オラクルの 6 変種、CDKM リプルキャリー型アdder の重いヘックストポロジーへのマッピング、中間回路測定による半古典的な位相推定技術——は本物であり、かつ非自明なものです。しかし、本研究における批判の対象は非常に限定的であり、「これらのハードウェア実行が、量子コンピュータによる ECDLP 秘密鍵復号化を構成している」という暗号解読に関する主張そのものにあります。それは事実ではありません。実際には、古典的な検証処理に対して一様無作為に生成された候補値が適用されているのみで、これらは何ら量子ハードウェアなしでも再現可能であり、このブランチの実装がそれを直接示しています。