
Algorithme du kangourou de Pollard accéléré par GPU pour résoudre le problème du logarithme discret sur courbe elliptique (ECDLP) sur secp256k1, prenant en charge les backends Vulkan, Metal et DX12.
Algorithme de Kangourou de Pollard accéléré par GPU pour résoudre le problème du logarithme discret sur courbe elliptique (ECDLP) sur secp256k1.
--benchmark pour tester le matériel, --save-benchmarks pour enregistrer les résultatsLa plupart des implémentations existantes de Kangourou (JeanLucPons/Kangaroo, RCKangaroo, etc.) ne supportent que les GPU NVIDIA via CUDA. Cette implémentation utilise WebGPU/wgpu qui permet le calcul GPU multiplateforme via Vulkan, Metal et 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>
Soit --target soit --pubkey est requis.
Utilisation d'un fournisseur de données (boha) :
# Résoudre une énigme avec les données boha (auto : pubkey, start, range)
kangaroo --target boha:b1000/66
# Surcharger la plage (rechercher un sous-ensemble plus petit)
kangaroo --target boha:b1000/66 --range 60
# Lister les énigmes disponibles
kangaroo --list-providers
Paramètres manuels :
kangaroo \
--pubkey 03a2efa402fd5268400c77c20e574ba86409ededee7c4020e4b9f0edbee53de0d4 \
--start 8000000000 \
--range 40
Avec contrainte modulaire (k ≡ 37 mod 60) :
kangaroo \
--pubkey 03a2efa402fd5268400c77c20e574ba86409ededee7c4020e4b9f0edbee53de0d4 \
--start 8000000000 \
--range 40 \
--mod-step 3c \
--mod-start 25
Cela réduit l'espace de recherche d'environ 60×. Utile lorsque la structure partielle de la clé est connue (par exemple, clé générée avec un motif de pas prévisible).
L'algorithme de Kangourou de Pollard résout le problème du logarithme discret en temps O(√n) où n est la plage de recherche. Il fonctionne ainsi :
Optimisation des points distingués (DP) : au lieu de stocker tous les points visités, on ne stocke que ceux dont la coordonnée x possède un nombre spécifique de bits de tête nuls. Cela réduit considérablement l'utilisation mémoire tout en permettant la détection des collisions.
Opérations attendues : ~2^(range_bits/2)
Exécutez kangaroo --benchmark pour tester votre matériel sans toucher aux fichiers. Utilisez kangaroo --benchmark --save-benchmarks pour mettre à jour BENCHMARKS.md.
| Cas d'utilisation | Exemple |
|---|---|
| Clé partielle décodée | L'énigme donne ~240 bits, il faut trouver les ~16 restants |
| Clé dans une plage connue | On sait que la clé est entre X et Y |
| Vérification d'une quasi-solution | On a un candidat, on cherche ±N bits autour |
PAS utile pour :
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 prend en charge des fournisseurs de données externes pour les sources d'énigmes. Les fournisseurs fournissent la clé publique, la plage de clés et d'autres métadonnées d'énigme.
boha fournit des données d'énigmes cryptographiques, y compris les transactions de l'énigme Bitcoin (b1000).
Construire avec le support boha :
cargo build --release --features boha
Utilisation :
# Résoudre une énigme spécifique
kangaroo --target boha:b1000/66
# Lister les énigmes résolubles (non résolues avec clé publique connue)
kangaroo --list-providers
Le fournisseur valide les surcharges de plage – vous ne pouvez pas chercher en dehors de la plage de clés de l'énigme.
src/
├── main.rs # Point d'entrée CLI
├── lib.rs # Point d'entrée de la bibliothèque + Args + run()
├── solver.rs # Coordination du solveur GPU
├── cli.rs # Utilitaires CLI (tracing, barre de progression)
├── benchmark.rs # Suite de benchmarks intégrée
├── modular.rs # Transformation de contrainte modulaire
├── math.rs # Arithmétique 256 bits, génération de masque DP
├── convert.rs # Conversions entre limbs/octets pour GPU↔CPU
├── provider/
│ ├── mod.rs # Interface du système de fournisseurs
│ └── boha.rs # Fournisseur boha (conditionnel à la fonctionnalité)
├── cpu/
│ ├── cpu_solver.rs # Solveur CPU pur (test/comparaison)
│ ├── dp_table.rs # Détection de collision par points distingués
│ └── init.rs # Initialisation des kangourous + tables de sauts
├── crypto/
│ └── mod.rs # Wrappers k256/secp256k1
├── gpu/
│ ├── pipeline.rs # Configuration du pipeline de calcul
│ └── buffers.rs # Gestion des buffers GPU
├── gpu_crypto/
│ ├── context.rs # Contexte GPU + sélection du backend
│ └── shaders/ # Bibliothèque de shaders WGSL
│ ├── field.wgsl # Arithmétique de corps secp256k1
│ └── curve.wgsl # Opérations sur points jacobiens
└── shaders/
└── kangaroo_affine.wgsl # Shader de calcul principal Kangourou
Licence MIT – voir LICENSE pour les détails.
| Argument | Défaut | Description |
|---|
-t, --target | - | Cible du fournisseur de données (ex. boha:b1000/135) |
-p, --pubkey | - | Clé publique cible (hexadécimale compressée, 33 octets) |
-s, --start | 0 | Début de la plage de recherche (hexadécimal, sans préfixe 0x) |
-r, --range | 32 | Taille de la plage de recherche en bits (la clé est dans [start, start + 2^range - 1]) |
-d, --dp-bits | auto | Bits de point distingué |
-k, --kangaroos | auto | Nombre de kangourous parallèles |
--gpu | 0 | Index du périphérique GPU |
--backend | auto | Backend GPU : auto, vulkan, dx12, metal, gl |
-o, --output | - | Fichier de sortie pour le résultat |
-q, --quiet | false | Sortie minimale, affiche seulement la clé trouvée |
--max-ops | 0 | Nombre maximal d'opérations (0 = illimité) |
--cpu | false | Utiliser le solveur CPU au lieu du GPU |
--json | false | Afficher les résultats des benchmarks au format JSON |
--benchmark | false | Exécuter la suite de benchmarks |
--save-benchmarks | false | Enregistrer les résultats des benchmarks dans BENCHMARKS.md lorsque --benchmark est utilisé |
--mod-step | 1 | Pas modulaire M (hexadécimal) : chercher seulement k ≡ R (mod M) |
--mod-start | 0 | Résidu modulaire R (hexadécimal) : 0 ≤ R < M |
--list-providers | false | Lister les énigmes disponibles auprès des fournisseurs |