vuke
Research tool for analyzing and reproducing vulnerable Bitcoin key generation.
Features
- Modular architecture - pluggable sources and transforms
- Multiple input sources
- Numeric ranges (test weak seeds)
- Wordlists (brainwallet analysis)
- Timestamps (time-based PRNG exploitation)
- Stdin streaming (pipeline integration)
- Historical vulnerability transforms
- Direct (raw bytes as key)
- SHA256 (classic brainwallet)
- Double SHA256 (Bitcoin-style hashing)
- MD5 (legacy weak hashing)
- Milksad (MT19937 PRNG - CVE-2023-39910)
- Armory (legacy HD derivation)
- Key origin analysis - reverse detection of vulnerable generation methods
- Parallel processing via Rayon
- Address matching for scanning known targets
- File output for saving results
- Pure Rust implementation
Why This Project?
This tool is designed for security research - understanding how vulnerable keys were generated in the past helps improve modern wallet security.
Historical vulnerabilities this tool can reproduce:
| Vulnerability | Year | Impact |
|---|---|---|
| Brainwallets | 2011-2015 | SHA256(passphrase) easily cracked |
| Weak PRNGs | 2013-2023 | Predictable seeds (timestamps, PIDs) |
| Milksad | 2023 | libbitcoin bx used MT19937 with 32-bit seeds |
| Armory HD | 2012-2016 | Pre-BIP32 deterministic derivation |
Installation
Cargo
From source
Usage
Generate single key from passphrase
Output:
Passphrase: "correct horse battery staple"
Transform: sha256
Source: correct horse battery staple
---
Private Key (hex): c4bbcb1fbec99d65bf59d85c8cb62ee2db963f0fe106f483d9afa73bd4e39a8a
WIF (compressed): L3p8oAcQTtuokSCRHQ7i4MhjWc9zornvpJLfmg62sYpLRJF9woSu
---
P2PKH (compressed): 1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T
P2WPKH: bc1qfnpg7ceg02y64qrskgz0drwp3y6hma3q6wvnzr
Scan wordlist for known addresses
Test numeric range (weak seeds)
Test timestamp-based keys
Multiple transforms
Pipe from stdin
|
Save results to file
Benchmark transforms
Analyze private key origin
Check if a private key could have been generated by a vulnerable method:
Output:
Private Key: c4bbcb1fbec99d65bf59d85c8cb62ee2db963f0fe106f483d9afa73bd4e39a8a
Bit Length: 256
Hamming Weight: 144
---
Analysis:
✗ milksad: NOT_FOUND (checked 4294967296 seeds)
✗ direct: NOT_FOUND (no direct patterns detected)
? heuristic: UNKNOWN (entropy=5.00, hamming=144)
Fast mode (skip brute-force):
JSON output:
Specific analyzer:
Supported Transforms
| Transform | Description | Use Case |
|---|---|---|
direct |
Raw bytes padded to 32 bytes | Testing raw numeric seeds |
sha256 |
SHA256(input) | Classic brainwallets |
double_sha256 |
SHA256(SHA256(input)) | Bitcoin-style hashing |
md5 |
MD5(input) duplicated to 32 bytes | Legacy weak hashing |
milksad |
MT19937 PRNG with 32-bit seed | CVE-2023-39910 (libbitcoin) |
armory |
Armory HD derivation chain | Pre-BIP32 wallets |
Supported Analyzers
| Analyzer | Method | Use Case |
|---|---|---|
milksad |
Brute-force 2^32 seeds | Check if key is Milksad victim |
direct |
Pattern detection | Detect small seeds, ASCII strings |
heuristic |
Statistical analysis | Entropy, hamming weight anomalies |
Library Usage
use KeyDeriver;
use ;
Architecture
src/
├── main.rs # CLI entry point
├── lib.rs # Library exports
├── derive.rs # Private key → address derivation
├── matcher.rs # Address matching against targets
├── network.rs # Bitcoin network handling
├── benchmark.rs # Performance testing
├── analyze/
│ ├── mod.rs # Analyzer trait and types
│ ├── key_parser.rs # Parse hex/WIF/decimal keys
│ ├── milksad.rs # MT19937 brute-force
│ ├── direct.rs # Pattern detection
│ ├── heuristic.rs # Statistical analysis
│ └── output.rs # Plain text and JSON formatting
├── source/
│ ├── mod.rs # Source trait and types
│ ├── range.rs # Numeric range source
│ ├── wordlist.rs # File-based wordlist
│ ├── timestamps.rs # Date range → Unix timestamps
│ └── stdin.rs # Streaming from stdin
├── transform/
│ ├── mod.rs # Transform trait and types
│ ├── input.rs # Input value representation
│ ├── direct.rs # Raw bytes transform
│ ├── sha256.rs # SHA256 hashing
│ ├── double_sha256.rs # Double SHA256
│ ├── md5.rs # MD5 hashing
│ ├── milksad.rs # MT19937 PRNG (CVE-2023-39910)
│ └── armory.rs # Armory HD derivation
└── output/
├── mod.rs # Output trait
└── console.rs # Console output handler
Requirements
- Rust 1.70+
Disclaimer
This tool is for educational and security research purposes only. Do not use it to access wallets you do not own. The authors are not responsible for any misuse.
License
MIT License - see LICENSE for details.
References
- Milksad vulnerability - CVE-2023-39910
- Brainwallet attacks - Academic paper
- Armory documentation - Legacy HD wallet