
GPU-beschleunigter Pollard's Kangaroo-Algorithmus zur Lösung des Elliptic Curve Discrete Logarithm Problem (ECDLP) auf secp256k1, mit Unterstützung für Vulkan-, Metal- und DX12-Backends.
GPU-beschleunigter Pollard's Kangaroo-Algorithmus zur Lösung des Problems des diskreten Logarithmus auf elliptischen Kurven (ECDLP) auf secp256k1.
--benchmark zum Testen der Hardware, --save-benchmarks zum Aufzeichnen der ErgebnisseDie meisten existierenden Kangaroo-Implementierungen unterstützen nur NVIDIA-GPUs über CUDA. Diese Implementierung nutzt WebGPU/wgpu, das plattformübergreifendes GPU-Computing über Vulkan, Metal und DX12 bereitstellt.
paru -S kangaroo
cargo install kangaroo
git clone https://github.com/oritwoen/kangaroo
cd kangaroo
cargo build --release
cargo build --release --features boha
kangaroo --pubkey <PUBKEY> --start <START> --range <BITS>
Entweder --target oder --pubkey ist erforderlich.
Datenanbieter verwenden (boha):
# Solve puzzle using boha data (auto: pubkey, start, range)
kangaroo --target boha:b1000/66
# Override range (search smaller subset)
kangaroo --target boha:b1000/66 --range 60
# List available puzzles
kangaroo --list-providers
Manuelle Parameter:
kangaroo \
--pubkey 03a2efa402fd5268400c77c20e574ba86409ededee7c4020e4b9f0edbee53de0d4 \
--start 8000000000 \
--range 40
Mit modularer Einschränkung (k ≡ 37 mod 60):
kangaroo \
--pubkey 03a2efa402fd5268400c77c20e574ba86409ededee7c4020e4b9f0edbee53de0d4 \
--start 8000000000 \
--range 40 \
--mod-step 3c \
--mod-start 25
Dies reduziert den Suchraum um etwa das 60-fache. Nützlich, wenn die partielle Schlüsselstruktur bekannt ist (z.B. Schlüssel generiert mit einem vorhersagbaren Schrittmuster).
Der Pollard's Kangaroo-Algorithmus löst das Problem des diskreten Logarithmus in O(√n) Zeit, wobei n der Suchbereich ist. Er funktioniert wie folgt:
Optimierung durch ausgezeichnete Punkte (DP): Anstatt alle besuchten Punkte zu speichern, speichern wir nur Punkte, deren x-Koordinate eine bestimmte Anzahl führender Nullbits aufweist. Dies reduziert den Speicherverbrauch drastisch und ermöglicht dennoch die Kollisionserkennung.
Erwartete Operationen: ~2^(range_bits/2)
Führen Sie kangaroo --benchmark aus, um Ihre Hardware zu testen, ohne Dateien zu berühren. Verwenden Sie kangaroo --benchmark --save-benchmarks, um BENCHMARKS.md zu aktualisieren.
| Anwendungsfall | Beispiel |
|---|---|
| Teilschlüssel dekodiert | Puzzle gibt ~240 Bits, müssen die restlichen ~16 finden |
| Schlüssel in bekanntem Bereich | Schlüssel liegt zwischen X und Y |
| Nahe-Lösung verifizieren | Kandidaten haben, ±N Bits darum herum suchen |
NICHT nützlich für:
use kangaroo::{KangarooSolver, GpuContext, GpuBackend, parse_pubkey, parse_hex_u256, verify_key};
fn main() -> anyhow::Result<()> {
let pubkey = parse_pubkey("03...")?;
let start = parse_hex_u256("8000000000")?;
let ctx = pollster::block_on(GpuContext::new(0, GpuBackend::Auto))?;
let mut solver = KangarooSolver::new(
ctx,
pubkey.clone(),
start,
40, // range_bits
12, // dp_bits
1024, // num_kangaroos
)?;
loop {
if let Some(key) = solver.step()? {
if verify_key(&key, &pubkey) {
println!("Found: {}", hex::encode(&key));
break;
}
}
}
Ok(())
}
Kangaroo unterstützt externe Datenanbieter für Puzzle-Quellen. Anbieter liefern pubkey, Schlüsselbereich und andere Puzzle-Metadaten.
boha stellt Krypto-Puzzle-Daten einschließlich Bitcoin Puzzle Transaction (b1000) bereit.
Build mit boha-Unterstützung:
cargo build --release --features boha
Verwendung:
# Solve specific puzzle
kangaroo --target boha:b1000/66
# List solvable puzzles (unsolved with known pubkey)
kangaroo --list-providers
Der Anbieter validiert Bereichsüberschreibungen - Sie können nicht außerhalb des Schlüsselbereichs des Puzzles suchen.
src/
├── main.rs # CLI-Einstiegspunkt
├── lib.rs # Bibliothekseinstieg + Args + run()
├── solver.rs # GPU-Löser-Koordination
├── cli.rs # CLI-Dienstprogramme (tracing, Fortschrittsbalken)
├── benchmark.rs # Integrierte Benchmark-Suite
├── modular.rs # Transformation modularer Einschränkungen
├── math.rs # 256-Bit-Arithmetik, DP-Maskenerzeugung
├── convert.rs # Limb/Byte-Konvertierungen für GPU↔CPU
├── provider/
│ ├── mod.rs # Anbietersystem-Schnittstelle
│ └── boha.rs # boha-Anbieter (feature-gated)
├── cpu/
│ ├── cpu_solver.rs # Reiner CPU-Löser (Testen/Vergleichen)
│ ├── dp_table.rs # Kollisionserkennung via ausgezeichneter Punkte
│ └── init.rs # Känguru-Initialisierung + Sprungtabellen
├── crypto/
│ └── mod.rs # k256/secp256k1-Wrapper
├── gpu/
│ ├── pipeline.rs # Compute-Pipeline-Einrichtung
│ └── buffers.rs # GPU-Pufferverwaltung
├── gpu_crypto/
│ ├── context.rs # GPU-Kontext + Backend-Auswahl
│ └── shaders/ # WGSL-Shader-Bibliothek
│ ├── field.wgsl # secp256k1-Feldarithmetik
│ └── curve.wgsl # Jacobi-Punktoperationen
└── shaders/
└── kangaroo_affine.wgsl # Haupt-Kangaroo-Compute-Shader
MIT-Lizenz - siehe LICENSE für Details.
| Argument | Standard | Beschreibung |
|---|
-t, --target | - | Ziel des Datenanbieters (z.B. boha:b1000/135) |
-p, --pubkey | - | Ziel-öffentlicher Schlüssel (komprimiert hex, 33 Bytes) |
-s, --start | 0 | Start des Suchbereichs (hex, ohne 0x-Präfix) |
-r, --range | 32 | Suchbereich in Bits (Schlüssel ist in [start, start + 2^range - 1]) |
-d, --dp-bits | auto | Bits für ausgezeichnete Punkte |
-k, --kangaroos | auto | Anzahl paralleler Kängurus |
--gpu | 0 | GPU-Geräteindex |
--backend | auto | GPU-Backend: auto, vulkan, dx12, metal, gl |
-o, --output | - | Ausgabedatei für das Ergebnis |
-q, --quiet | false | Minimale Ausgabe, nur gefundenen Schlüssel ausgeben |
--max-ops | 0 | Maximale Operationen (0 = unbegrenzt) |
--cpu | false | CPU-Löser anstelle von GPU verwenden |
--json | false | Benchmark-Ergebnisse im JSON-Format ausgeben |
--benchmark | false | Benchmark-Suite ausführen |
--save-benchmarks | false | Benchmark-Ergebnisse in BENCHMARKS.md speichern, wenn --benchmark verwendet wird |
--mod-step | 1 | Modularer Schritt M (hex): suche nur k ≡ R (mod M) |
--mod-start | 0 | Modularer Rest R (hex): 0 ≤ R < M |
--list-providers | false | Verfügbare Puzzles von Anbietern auflisten |