
Algoritmo de Pollard's Kangaroo acelerado por GPU para resolver el Problema del Logaritmo Discreto de Curva Elíptica (ECDLP) en secp256k1, compatible con backends Vulkan, Metal y DX12.
Algoritmo Pollard's Kangaroo acelerado por GPU para resolver el Problema del Logaritmo Discreto de Curva Elíptica (ECDLP) en secp256k1.
--benchmark para probar el hardware, --save-benchmarks para registrar resultadosLa mayoría de implementaciones existentes de Kangaroo (JeanLucPons/Kangaroo, RCKangaroo, etc.) solo soportan GPUs NVIDIA mediante CUDA. Esta implementación utiliza WebGPU/wgpu, lo que proporciona cómputo GPU multiplataforma a través de Vulkan, Metal y 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>
Se requiere --target o --pubkey.
Usando proveedor de datos (boha):
# Resolver acertijo usando datos de boha (automático: pubkey, start, range)
kangaroo --target boha:b1000/66
# Sobrescribir rango (buscar subconjunto más pequeño)
kangaroo --target boha:b1000/66 --range 60
# Listar acertijos disponibles
kangaroo --list-providers
Parámetros manuales:
kangaroo \
--pubkey 03a2efa402fd5268400c77c20e574ba86409ededee7c4020e4b9f0edbee53de0d4 \
--start 8000000000 \
--range 40
Con restricción modular (k ≡ 37 mod 60):
kangaroo \
--pubkey 03a2efa402fd5268400c77c20e574ba86409ededee7c4020e4b9f0edbee53de0d4 \
--start 8000000000 \
--range 40 \
--mod-step 3c \
--mod-start 25
Esto reduce el espacio de búsqueda en ~60×. Útil cuando se conoce una estructura parcial de la clave (por ejemplo, clave generada con un patrón de paso predecible).
El algoritmo Pollard's Kangaroo resuelve el problema del logaritmo discreto en tiempo O(√n) donde n es el rango de búsqueda. Funciona así:
Optimización de Puntos Distinguidos (DP): En lugar de almacenar todos los puntos visitados, solo guardamos aquellos cuya coordenada x tiene un número específico de bits cero iniciales. Esto reduce drásticamente el uso de memoria y permite la detección de colisiones.
Operaciones esperadas: ~2^(range_bits/2)
Ejecute kangaroo --benchmark para probar su hardware sin tocar archivos. Use kangaroo --benchmark --save-benchmarks para actualizar BENCHMARKS.md.
| Caso de uso | Ejemplo |
|---|---|
| Clave parcial descifrada | Acertijo da ~240 bits, necesita encontrar los ~16 restantes |
| Clave en rango conocido | Saber que la clave está entre X e Y |
| Verificar casi-solución | Tener un candidato, buscar ±N bits alrededor |
NO útil para:
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 admite proveedores de datos externos para fuentes de acertijos. Los proveedores suministran clave pública, rango de clave y otros metadatos del acertijo.
boha proporciona datos de acertijos criptográficos, incluida la transacción de acertijos de Bitcoin (b1000).
Compilar con soporte boha:
cargo build --release --features boha
Uso:
# Resolver acertijo específico
kangaroo --target boha:b1000/66
# Listar acertijos resolubles (no resueltos con clave pública conocida)
kangaroo --list-providers
El proveedor valida las sobrescrituras de rango: no se puede buscar fuera del rango de clave del acertijo.
src/
├── main.rs # Punto de entrada CLI
├── lib.rs # Entrada de biblioteca + Args + run()
├── solver.rs # Coordinación del solucionador GPU
├── cli.rs # Utilidades CLI (tracing, barra de progreso)
├── benchmark.rs # Suite de benchmarks integrada
├── modular.rs # Transformación de restricción modular
├── math.rs # Aritmética de 256 bits, generación de máscara DP
├── convert.rs # Conversiones limb/byte para GPU↔CPU
├── provider/
│ ├── mod.rs # Interfaz del sistema de proveedores
│ └── boha.rs # Proveedor boha (controlado por característica)
├── cpu/
│ ├── cpu_solver.rs # Solucionador puro de CPU (pruebas/comparación)
│ ├── dp_table.rs # Detección de colisiones de Puntos Distinguidos
│ └── init.rs # Inicialización de canguros + tablas de saltos
├── crypto/
│ └── mod.rs # Wrappers k256/secp256k1
├── gpu/
│ ├── pipeline.rs # Configuración del pipeline de cómputo
│ └── buffers.rs # Gestión de buffers GPU
├── gpu_crypto/
│ ├── context.rs # Contexto GPU + selección de backend
│ └── shaders/ # Biblioteca de shaders WGSL
│ ├── field.wgsl # Aritmética de campo secp256k1
│ └── curve.wgsl # Operaciones de puntos Jacobianos
└── shaders/
└── kangaroo_affine.wgsl # Shader de cómputo principal de Kangaroo
Licencia MIT - consulte LICENSE para más detalles.
| Argumento | Por defecto | Descripción |
|---|
-t, --target | - | Destino del proveedor de datos (ej. boha:b1000/135) |
-p, --pubkey | - | Clave pública objetivo (hex comprimido, 33 bytes) |
-s, --start | 0 | Inicio del rango de búsqueda (hex, sin prefijo 0x) |
-r, --range | 32 | Rango de búsqueda en bits (la clave está en [start, start + 2^range - 1]) |
-d, --dp-bits | auto | Bits de punto distinguido |
-k, --kangaroos | auto | Número de canguros paralelos |
--gpu | 0 | Índice del dispositivo GPU |
--backend | auto | Backend GPU: auto, vulkan, dx12, metal, gl |
-o, --output | - | Archivo de salida para el resultado |
-q, --quiet | false | Salida mínima, solo imprime la clave encontrada |
--max-ops | 0 | Operaciones máximas (0 = ilimitado) |
--cpu | false | Usar solucionador de CPU en lugar de GPU |
--json | false | Mostrar resultados de benchmark en formato JSON |
--benchmark | false | Ejecutar suite de benchmarks |
--save-benchmarks | false | Guardar resultados de benchmark en BENCHMARKS.md cuando se usa --benchmark |
--mod-step | 1 | Paso modular M (hex): buscar solo k ≡ R (mod M) |
--mod-start | 0 | Residuo modular R (hex): 0 ≤ R < M |
--list-providers | false | Listar acertijos disponibles de los proveedores |