
Algoritmo di Pollard's Kangaroo accelerato via GPU per risolvere il problema del logaritmo discreto su curve ellittiche (ECDLP) su secp256k1, con supporto per backend Vulkan, Metal e DX12.
Algoritmo di Pollard's Kangaroo accelerato via GPU per risolvere il problema del logaritmo discreto su curve ellittiche (ECDLP) su secp256k1.
--benchmark per testare l'hardware, --save-benchmarks per registrare i risultatiLa maggior parte delle implementazioni Kangaroo esistenti (JeanLucPons/Kangaroo, RCKangaroo, ecc.) supporta solo GPU NVIDIA tramite CUDA. Questa implementazione utilizza WebGPU/wgpu che fornisce calcolo GPU multipiattaforma attraverso Vulkan, Metal e DX12.
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>
È richiesto --target o --pubkey.
Utilizzo del provider di dati (boha):
# Risolve un puzzle usando i dati boha (automatico: pubkey, start, range)
kangaroo --target boha:b1000/66
# Sovrascrive l'intervallo (cerca in un sottoinsieme più piccolo)
kangaroo --target boha:b1000/66 --range 60
# Elenca i puzzle disponibili
kangaroo --list-providers
Parametri manuali:
kangaroo \
--pubkey 03a2efa402fd5268400c77c20e574ba86409ededee7c4020e4b9f0edbee53de0d4 \
--start 8000000000 \
--range 40
Con vincolo modulare (k ≡ 37 mod 60):
kangaroo \
--pubkey 03a2efa402fd5268400c77c20e574ba86409ededee7c4020e4b9f0edbee53de0d4 \
--start 8000000000 \
--range 40 \
--mod-step 3c \
--mod-start 25
Questo riduce lo spazio di ricerca di circa 60×. Utile quando si conosce una struttura parziale della chiave (es. chiave generata con uno schema di passo prevedibile).
L'algoritmo di Pollard's Kangaroo risolve il problema del logaritmo discreto in tempo O(√n) dove n è l'intervallo di ricerca. Funziona così:
Ottimizzazione dei Punti Distinti (DP): Invece di memorizzare tutti i punti visitati, memorizziamo solo i punti la cui coordinata x ha un numero specifico di bit zero iniziali. Questo riduce drasticamente l'uso della memoria pur consentendo il rilevamento delle collisioni.
Operazioni attese: ~2^(range_bits/2)
Esegui kangaroo --benchmark per testare il tuo hardware senza toccare file. Usa kangaroo --benchmark --save-benchmarks per aggiornare BENCHMARKS.md.
| Caso d'Uso | Esempio |
|---|---|
| Chiave parziale decodificata | Il puzzle fornisce ~240 bit, serve trovare i restanti ~16 |
| Chiave in un intervallo noto | Si sa che la chiave è tra X e Y |
| Verifica di una soluzione quasi corretta | Si ha un candidato, si cerca ±N bit attorno ad esso |
NON utile per:
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!("Trovata: {}", hex::encode(&key));
break;
}
}
}
Ok(())
}
Kangaroo supporta provider di dati esterni per sorgenti di puzzle. I provider forniscono pubkey, intervallo della chiave e altri metadati del puzzle.
boha fornisce dati di puzzle crittografici, inclusa la transazione del puzzle Bitcoin (b1000).
Costruisci con supporto boha:
cargo build --release --features boha
Utilizzo:
# Risolve un puzzle specifico
kangaroo --target boha:b1000/66
# Elenca i puzzle risolvibili (non risolti con pubkey nota)
kangaroo --list-providers
Il provider convalida le sovrascritture dell'intervallo: non puoi cercare al di fuori dell'intervallo della chiave del puzzle.
src/
├── main.rs # Punto d'ingresso CLI
├── lib.rs # Punto d'ingresso libreria + Args + run()
├── solver.rs # Coordinamento del risolutore GPU
├── cli.rs # Utility CLI (tracing, barra di avanzamento)
├── benchmark.rs # Suite di benchmark integrata
├── modular.rs # Trasformazione dei vincoli modulari
├── math.rs # Aritmetica a 256 bit, generazione maschera DP
├── convert.rs # Conversioni limb/byte per GPU↔CPU
├── provider/
│ ├── mod.rs # Interfaccia del sistema provider
│ └── boha.rs # Provider boha (funzionalità opzionale)
├── cpu/
│ ├── cpu_solver.rs # Risolutore puramente CPU (test/confronto)
│ ├── dp_table.rs # Rilevamento collisioni con Punti Distinti
│ └── init.rs # Inizializzazione canguri + tabelle di salto
├── crypto/
│ └── mod.rs # Wrapper k256/secp256k1
├── gpu/
│ ├── pipeline.rs # Configurazione pipeline di calcolo
│ └── buffers.rs # Gestione buffer GPU
├── gpu_crypto/
│ ├── context.rs # Contesto GPU + selezione backend
│ └── shaders/ # Libreria shader WGSL
│ ├── field.wgsl # Aritmetica di campo secp256k1
│ └── curve.wgsl # Operazioni su punti Jacobiani
└── shaders/
└── kangaroo_affine.wgsl # Shader di calcolo principale Kangaroo
Licenza MIT - consultare LICENSE per i dettagli.
| Argomento | Predefinito | Descrizione |
|---|
-t, --target | - | Obiettivo del provider di dati (es. boha:b1000/135) |
-p, --pubkey | - | Chiave pubblica di destinazione (hex compresso, 33 byte) |
-s, --start | 0 | Inizio dell'intervallo di ricerca (hex, senza prefisso 0x) |
-r, --range | 32 | Ampiezza dell'intervallo di ricerca in bit (la chiave è in [start, start + 2^range - 1]) |
-d, --dp-bits | auto | Bit del punto distinto |
-k, --kangaroos | auto | Numero di canguri paralleli |
--gpu | 0 | Indice del dispositivo GPU |
--backend | auto | Backend GPU: auto, vulkan, dx12, metal, gl |
-o, --output | - | File di output per il risultato |
-q, --quiet | false | Output minimo, stampa solo la chiave trovata |
--max-ops | 0 | Numero massimo di operazioni (0 = illimitato) |
--cpu | false | Usa il risolutore CPU invece della GPU |
--json | false | Output dei risultati del benchmark in formato JSON |
--benchmark | false | Esegue la suite di benchmark |
--save-benchmarks | false | Salva i risultati del benchmark in BENCHMARKS.md quando si usa --benchmark |
--mod-step | 1 | Passo modulare M (hex): cerca solo k ≡ R (mod M) |
--mod-start | 0 | Residuo modulare R (hex): 0 ≤ R < M |
--list-providers | false | Elenca i puzzle disponibili dai provider |