IBM-Quantum-Backend durch /dev/urandom ersetzt
(github.com/yuvadm)- Selbst wenn nur das IBM-Quantum-Backend durch
os.urandomersetzt wird, lässt sich die Wiederherstellung des privaten Schlüssels reproduzieren, während Schaltungsaufbau, Orakel, Extraktions-Pipeline und der Prüferd·G == Qunverändert bleiben - Der Änderungsumfang beschränkt sich auf 59 geänderte Zeilen in
projecteleven.py: Backend-Ausführung und Ergebnissammlung werden entfernt und durch gleichverteilte Zufalls-Bitfolgen in der Breite des classical register ersetzt, dieshots-mal erzeugt und an die bestehende Weiterverarbeitung übergeben werden - Von 4 Bit bis 10 Bit stellte der
/dev/urandom-Lauf bytegenau identisched-Werte zu den gemeldeten Hardware-Ergebnissen wieder her; auch bei 16 Bit und 17 Bit war die Wiederherstellung erfolgreich, und zwar jeweils in 4 von 5 bzw. 2 von 5 Versuchen - Die Extraktionslogik übernimmt pro Shot nur dann das berechnete
d_cand = (r − j)·k⁻¹ mod n, wenn es den klassischen Verifizierer passiert; im Dokument wird die Erfolgsrate von/dev/urandommitP(≥1 verified hit in S shots) = 1 − (1 − 1/n)^Serklärt - Sechs Orakel, heavy-hex-Mapping und semiclassical phase estimation als nichttriviales Engineering bleiben erhalten, doch die Kritik des Dokuments ist auf die kryptanalytische Behauptung beschränkt und zeigt, dass sich das Hardware-Ergebnis nicht nur als Quanten-Wiederherstellung, sondern auch durch klassische Verifikation reproduzieren lässt
diff
- Die vollständige Änderung in
projecteleven.pyhat einen Umfang von −29 / +30 Zeilen: Initialisierung des IBM-Quantum-Service, Backend-Ausführung, Sampler-Aufruf und Einsammeln der Job-Ergebnisse werden entfernt und durch zufallsbasiertecounts-Erzeugung ersetzt - Der hinzugefügte Code liest die Länge des classical register aus, erzeugt
shotsStück gleichverteilte Zufalls-Bitfolgen mit derselben Bitbreite und übergibt diese perCounterunverändert an die bestehende Weiterverarbeitungnbits = qc.num_clbitsbpb = (nbits + 7) // 8mask = (1 << nbits) - 1- Pro Shot wird mittels
int.from_bytes(_os.urandom(bpb), "big") & maskein Wert erzeugt und dann in eine Binärzeichenkette mit der vorgegebenen Breite umgewandelt
- Die vollständigen 59 geänderten Zeilen sind unter
git diff maineinsehbar
Ergebnisse: CLI-Ausführung des Autors im gepatchten Zustand
- Mit demselben CLI-Befehl wird unverändert geprüft, ob die Wiederherstellung des privaten Schlüssels gelingt, nur dass statt Hardware ausschließlich von
/dev/urandomgelieferte Ergebnisse verwendet werden - Die im Dokument gezeigte Tabelle vergleicht direkt die vom Autor gemeldeten
d-Werte mit den durch/dev/urandomrekonstruiertend-Werten -
Kleine Challenges, jeweils 1 Versuch, 8.192 Shots
- Der Ausführungsbefehl lautet
python projecteleven.py --challenge <N> --shots 8192 - Die vollständigen Ausgaben reichen von
urandom_runs/urandom_challenge_4.txtbis_10.txt - Bei allen Einträgen von 4 Bit bis 10 Bit ist das durch
/dev/urandomwiederhergestelltedbytegenau identisch mit dem vom Autor gemeldeten Hardware-Ergebnis- 4-bit: 6 → 6, Verifikation im ersten Versuch erfolgreich
- 6-bit: 18 → 18, Verifikation im ersten Versuch erfolgreich
- 8-bit: 103 → 103, Verifikation im ersten Versuch erfolgreich
- 9-bit: 135 → 135, Verifikation im ersten Versuch erfolgreich
- 10-bit: 165 → 165, Verifikation im ersten Versuch erfolgreich
- Laut Dokument wurde jede Challenge einmal ausgeführt, und
/dev/urandomwurde ebenfalls je einmal ausgeführt; beide waren erfolgreich
- Der Ausführungsbefehl lautet
-
Repräsentative Challenges, jeweils 5 Versuche, 20.000 Shots, ripple-carry-Orakel
- Der Ausführungsbefehl lautet
python projecteleven.py --challenge <N> --oracle ripple --shots 20000 - Die vollständigen Ausgaben sind in
urandom_runs/urandom_challenge_16_17_flagship.txtzusammengefasst - Bei der 16-Bit-Challenge stellte
/dev/urandomdas vom Autor gemeldeted = 20,248in 4 von 5 Versuchen wieder her - Bei der 17-Bit-Challenge stellte
/dev/urandomdas vom Autor gemeldeted = 1,441in 2 von 5 Versuchen wieder her - Im Dokument steht, dass das 17-Bit-Ergebnis der Eintrag war, der 1 BTC erhalten habe, und dass
/dev/urandomdiesen auf einem Laptop in rund 40 % der Läufe wiederhergestellt habe - Im Dokument steht, der Autor habe diesen Eintrag einmal auf IBM
ibm_fezausgeführt und als Quanten-Ergebnis bezeichnet - Die Terminal-Ausgabe eines 17-Bit-Laufs ist ebenfalls vollständig enthalten
- Kurve:
y^2 = x^3 + 0x + 7 (mod 65647) - Gruppenordnung:
n = 65173 - Erzeuger:
G = (12976, 52834) - Zielpunkt:
Q = (477, 58220) - Strategie:
ripple-carry modular addition (CDKM) - Backend:
/dev/urandom - Breite des classical register:
49 bits - Bei
20000 shots:Unique outcomes: 20000 - Ergebnis:
d = 1441 - Verifikation:
1441*G = (477, 58220) [OK] VERIFIED,[OK] SUCCESS: Recovered correct secret key
- Kurve:
- Der Ausführungsbefehl lautet
Warum solche Ergebnisse entstehen
- Die Extraktionslogik nimmt gemäß
ripple_carry_shor.py:197-240undprojecteleven.py:264pro Shot(j, k, r)entgegen, berechnetd_cand = (r − j)·k⁻¹ mod nund übernimmt es nur dann, wenn der klassische Verifiziererd_cand · G == Qerfolgreich ist - Das Dokument nimmt an, dass
d_candunter gleichverteiltem Rauschen einer Gleichverteilung im Intervall[0, n)folgt, und gibt für die Wahrscheinlichkeit mindestens eines erfolgreichen Verifikations-Treffers inSShots die folgende Formel anP(≥1 verified hit in S shots) = 1 − (1 − 1/n)^S
- Setzt man die im Dokument angegebenen Werte
(n, S)in diese Formel ein, ergeben sich folgende theoretische Erfolgsraten für/dev/urandom- 4-bit:
n = 7,shots = 8,192,100.00% - 6-bit:
n = 31,shots = 8,192,100.00% - 8-bit:
n = 139,shots = 8,192,100.00% - 9-bit:
n = 313,shots = 8,192,100.00% - 10-bit:
n = 547,shots = 1,024,84.65% - 16-bit:
n = 32,497,shots = 20,000,45.96% - 17-bit:
n = 65,173,shots = 20,000,26.43%
- 4-bit:
- Im Dokument steht, dass die oben gemessenen empirischen Erfolgsraten von
/dev/urandommit diesen theoretischen Werten übereinstimmen - In derselben Codebasis ist laut
README.md:210bereits der folgende Satz enthalten"When shots >> n, random noise alone can recover d with high probability."
- Bei allen Läufen von 4 Bit bis 10 Bit liegt das Verhältnis
shots / nzwischen 1,9× und 1.170×; laut Dokument fällt der gesamte Bereich damit in Bedingungen, die der Autor selbst bereits als klassisches Regime bezeichnet habe
Reproduktionsmethode
- Mit den folgenden Schritten lassen sich die Ergebnisse im selben Branch und derselben Umgebung reproduzieren
git checkout urandom-reproduces-qpuuv venv .venv && . .venv/bin/activateuv pip install qiskit qiskit-ibm-runtime
- Beispielhafte Ausführungen
python projecteleven.py --challenge 4 --shots 8192python projecteleven.py --challenge 10 --shots 8192python projecteleven.py --challenge 17 --oracle ripple --shots 20000 # may need 2-3 tries
- Im Dokument steht, dass IBM-Konto, Token, Quanten-Hardware und Netzwerk sämtlich nicht erforderlich sind
Hinweise und Umfang
- Die Implementierung des Repositoriums selbst wird als echt und nichttriviales Engineering bewertet
- Es sind sechs Orakel-Varianten enthalten
- Ein CDKM ripple-carry-Addierer wird auf eine heavy-hex-Topologie gemappt
- Verwendet wird semiclassical phase estimation einschließlich mid-circuit measurement
- Der Umfang der Kritik ist auf die kryptanalytische Behauptung beschränkt
- Das Fazit des Dokuments lautet, dass diese Hardware-Ausführung keine ECDLP-Schlüsselwiederherstellung durch einen Quantencomputer darstellt, sondern eine klassische Verifikation gleichverteiliger Zufallskandidaten; wie dieser Branch zeige, lasse sich das auch ohne Quanten-Hardware unverändert reproduzieren
1 Kommentare
Hacker-News-Kommentare
Deshalb kann er nach außen hin zwar das „richtige Ergebnis“ liefern, aber aus völlig falschen Gründen. Genau deswegen sind kleine Ganzzahlfaktorisierungen oder kleine ECDLP-Beispiele als Benchmark für Fortschritte im Quantencomputing ungeeignet.
Ich habe project11 davor gewarnt, dass genau das passieren würde. Am Ende, so dachte ich, würden sie Bitcoin an die Person vergeben, die am besten verschleiert, dass der Quantencomputer nichts beigetragen hat, und ich hielt es für gut möglich, dass sich auch der Einreicher selbst getäuscht hat. Offenbar wurde das nicht ernst genommen.
[1]: https://sigbovik.org/2025/proceedings.pdf#page=146
/dev/urandomersetzt und der Key wurde trotzdem wiederhergestellt.In der Selbstbeschreibung geht es um Enterprise-Software, Full-Stack-Architektur, Cloud Native, Solution Architecture und Sales Engineering, und die Commit-Historie sieht so aus, als wäre das fast komplett vibe coded: https://github.com/GiancarloLelli/quantum
Einen 17-Bit-ECC-Key wiederherzustellen ist per Brute Force auf heutigen klassischen Rechnern überhaupt nicht schwer
Perfekt
Vielleicht sehe ich etwas anderes, aber das ist doch ganz eindeutig das
tvon quan(tumslop)Das ist wirklich Kunst
Schon ziemlich eklig
Es gibt auch ein weiteres kürzlich veröffentlichtes dequantized Resultat: https://arxiv.org/abs/2604.21908
Wenn der Quantencomputer zentral gewesen wäre, hätte der Austausch gegen einen RNG entweder kein korrektes Ergebnis liefern dürfen oder zumindest langsamer konvergieren müssen. Da das Ergebnis aber exakt gleich bleibt, lag die eigentliche Logik vollständig auf der klassischen Seite und der QC hat nur zusätzliches Rauschen eingebracht
Wenn sich das Ergebnis statistisch nicht von Raten unterscheiden lässt, dann hat man am Ende nur eine komplizierte Rube-Goldberg-Maschine gebaut
Betrüger können alte gescheiterte Coins wieder hervorholen oder neue erschaffen, dann Bestände aufkaufen oder ausgeben und ML-DSA hinzufügen, um sie als quantensicher zu vermarkten, damit ihren Shitcoin hochpumpen und anschließend abladen.
Irgendwann werden auch weniger informierte Privatanleger das merken, aber ehrlich gesagt weiß ich nicht einmal, bei wem das momentan überhaupt zieht
Selbst Google konnte nicht beweisen, dass der eigene Quantencomputer ordentlich funktioniert, und die Algorithmen werden so extrem abgeschwächt, dass am Ende so etwas wie 17 Bit herauskommt
https://blog.google/innovation-and-ai/technology/research/quantum-echoes-willow-verifiable-quantum-advantage/
Überall wird dann absurd viel Geld in mysteriöse 10-Milliarden-Dollar-Zufallszahlengeneratoren gepumpt werden