
أداة بحث لدراسة توليد المفاتيح المشفرة الضعيفة (brainwallet, PRNG, milksad, LCG, xorshift)
أداة بحث لتحليل وإعادة إنتاج توليد مفاتيح البيتكوين الضعيفة.
هذه الأداة مصممة لـ البحث الأمني - فهم كيفية توليد المفاتيح الضعيفة في الماضي يساعد في تحسين أمان المحافظ الحديثة.
الثغرات التاريخية التي يمكن لهذه الأداة إعادة إنتاجها:
cargo install vuke
### من المصدر```bash
git clone https://github.com/oritwoen/vuke
cd vuke
cargo build --release
vuke single "correct horse battery staple" --transform sha256
المخرجات:```
Passphrase: "correct horse battery staple"
Transform: sha256
Source: correct horse battery staple
---
Private Key (hex): c4bbcb1fbec99d65bf59d85c8cb62ee2db963f0fe106f483d9afa73bd4e39a8a
WIF (compressed): L3p8oAcQTtuokSCRHQ7i4MhjWc9zornvpJLfmg62sYpLRJF9woSu
---
P2PKH (compressed): 1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T
P2WPKH: bc1qfnpg7ceg02y64qrskgz0drwp3y6hma3q6wvnzr
vuke scan --transform=sha256 --targets known_addresses.txt wordlist --file passwords.txt
### مزودو البيانات
بدلاً من مسارات الملفات، استخدم مراجع المزوّد لتحميل الهدف الديناميكي:```bash
# Scan all unsolved b1000 puzzles
vuke scan --transform=milksad --targets boha:b1000:unsolved range --start 1 --end 1000000
# Scan specific collection with filter
vuke scan --transform=sha256 --targets boha:b1000:with-pubkey wordlist --file words.txt
# Available filters: all, unsolved, solved, with-pubkey
vuke scan --targets boha:hash_collision:unsolved wordlist --file words.txt
Provider syntax: provider:collection:filter or provider:collection:id
المجموعات المتاحة (موفر boha):
b1000 - لغز Bitcoin 1000 (256 لغزاً، 1-256 بت)gsmg - لغز GSMGbitaps - لغز Bitapshash_collision - ألغاز تصادم التجزئةzden - ألغاز Zdenbitimage - ألغاز Bitimagevuke generate --transform=milksad range --start 1 --end 1000000
### اختبار المفاتيح القائمة على LCG```bash
# Generate keys using glibc rand() (default big-endian)
vuke generate --transform=lcg:glibc range --start 1 --end 1000000
# Use MINSTD variant with big-endian byte order
vuke generate --transform=lcg:minstd:be range --start 1 --end 1000
# Test all LCG variants at once
vuke generate --transform=lcg range --start 1 --end 100
vuke generate --transform=xorshift range --start 1 --end 1000000
vuke generate --transform=xorshift:64 range --start 1 --end 1000 vuke generate --transform=xorshift:128 range --start 1 --end 1000 vuke generate --transform=xorshift:128plus range --start 1 --end 1000 vuke generate --transform=xorshift:xoroshiro range --start 1 --end 1000
### اختبار المفاتيح المستندة إلى الطابع الزمني```bash
vuke scan --transform=sha256 --targets addresses.txt timestamps --start 2015-01-01 --end 2015-01-31
vuke generate --transform=bitimage files --file image.jpg
vuke generate --transform=bitimage files --dir ./images/
vuke generate --transform=bitimage --bitimage-path "m/44'/0'/0'/0/0" --bitimage-passphrase "secret" files --file photo.png
vuke generate --transform=bitimage --bitimage-derive-count 10 files --dir ./data/
vuke scan --transform=bitimage --bitimage-passphrase-wordlist passphrases.txt --targets addresses.txt files --dir ./images/
### تحويلات متعددة```bash
vuke scan --transform=sha256 --transform=double_sha256 --transform=md5 --targets addresses.txt wordlist --file words.txt
cat passwords.txt | vuke generate --transform=sha256 stdin
### حفظ النتائج إلى ملف```bash
vuke generate --output results.csv range --start 1 --end 1000000
vuke generate --output results.txt --verbose range --start 1 --end 1000
vuke scan --output hits.txt --targets addresses.txt wordlist --file passwords.txt
قم بتخزين النتائج بتنسيق Parquet للتحليل على نطاق TB (يتطلب ميزة storage):```bash
cargo build --release --features storage
vuke generate --storage ./results --transform milksad range --start 1 --end 1000000
vuke generate --storage ./results --chunk-records 500000 --chunk-bytes 50M range --start 1 --end 10000000
vuke generate --storage ./results --compression zstd --compression-level 9 range --start 1 --end 1000000
vuke generate --storage ./results --compression none range --start 1 --end 1000000
### الاستعلام عن النتائج المخزنة (SQL)
استعلام عن ملفات Parquet المخزنة باستخدام SQL (يتطلب ميزة `storage-query`):```bash
# Build with query support
cargo build --release --features storage-query
# Count results by transform
vuke query ./results "SELECT transform, COUNT(*) FROM results GROUP BY transform"
# Find matches
vuke query ./results "SELECT * FROM results WHERE matched_target IS NOT NULL LIMIT 10"
# Export to JSON
vuke query ./results --format json "SELECT source, wif_compressed FROM results LIMIT 100"
# Export to CSV
vuke query ./results --format csv "SELECT address_p2pkh_compressed, wif_compressed FROM results" > export.csv
# Show schema
vuke query ./results --schema
صيغ الإخراج: table (افتراضي), json, csv
رفع نتائج Parquet إلى تخزين متوافق مع S3 (يتطلب ميزة storage-cloud):```bash
cargo build --release --features storage-cloud
export AWS_ACCESS_KEY_ID=your_key export AWS_SECRET_ACCESS_KEY=your_secret
vuke generate --storage ./results --cloud-upload --cloud-bucket my-bucket
--transform milksad range --start 1 --end 1000000
vuke generate --storage ./results --cloud-upload
--cloud-endpoint https://account.r2.cloudflarestorage.com
--cloud-bucket my-r2-bucket
--transform milksad range --start 1 --end 1000000
vuke generate --storage ./results --cloud-upload
--cloud-endpoint http://localhost:9000
--cloud-bucket vuke-results
--transform milksad range --start 1 --end 1000000
vuke generate --storage ./results --cloud-upload --cloud-bucket my-bucket
--cloud-delete-local
--transform milksad range --start 1 --end 1000000
vuke generate --storage ./results --cloud-upload --cloud-bucket my-bucket
--cloud-fail-fast
--transform milksad range --start 1 --end 1000000
ميزات التحميل إلى السحابة:
- تحميل متعدد الأجزاء بطريقة التدفق (فعال من حيث الذاكرة للملفات الكبيرة)
- إعادة المحاولة التلقائي مع التراجع الأسي (5 محاولات، من 100ms إلى 30s)
- تحميلات متزامنة مع قابلية ضبط التوازي
- يحذف الملفات المحلية التي تم تحميلها بنجاح فقط
### تسجيل كتالوج Iceberg
سجل ملفات Parquet المرفوعة في كتالوج Apache Iceberg للاستعلام باستخدام SQL (يتطلب ميزة `storage-iceberg`):```bash
# Build with Iceberg support
cargo build --release --features storage-iceberg
# Set credentials
export CLOUD_ACCESS_KEY_ID=your_key
export CLOUD_SECRET_ACCESS_KEY=your_secret
# Generate, upload, and register in Iceberg catalog
vuke generate --storage ./results --cloud-upload --cloud-bucket my-bucket \
--iceberg-catalog http://localhost:8181 \
--transform milksad range --start 1 --end 1000000
# With custom namespace and table name
vuke generate --storage ./results --cloud-upload --cloud-bucket my-bucket \
--iceberg-catalog http://localhost:8181 \
--iceberg-namespace my_namespace \
--iceberg-table my_results \
--transform milksad range --start 1 --end 1000000
# Using environment variables
export ICEBERG_CATALOG=http://localhost:8181
export ICEBERG_NAMESPACE=vuke
export ICEBERG_TABLE=results
vuke generate --storage ./results --cloud-upload --cloud-bucket my-bucket \
--transform milksad range --start 1 --end 1000000
Iceberg catalog features:
transform (هوية) و timestamp (يوم)vuke bench --transform milksad
### تحليل أصل المفتاح الخاص
تحقق مما إذا كان المفتاح الخاص قد تم إنشاؤه بطريقة ضعيفة:```bash
vuke analyze c4bbcb1fbec99d65bf59d85c8cb62ee2db963f0fe106f483d9afa73bd4e39a8a
Analysis: ✗ milksad: NOT_FOUND (checked 4294967296 seeds) ✗ direct: NOT_FOUND (no direct patterns detected) ? heuristic: UNKNOWN (entropy=5.00, hamming=144)
الوضع السريع (تخطي القوة العمياء):```bash
vuke analyze --fast L3p8oAcQTtuokSCRHQ7i4MhjWc9zornvpJLfmg62sYpLRJF9woSu
مخرجات JSON:```bash vuke analyze --fast --json c4bbcb1f...
محلل محدد:```bash
vuke analyze --analyzer milksad c4bbcb1f...
تحقق مما إذا كان المفتاح قد تم إنشاؤه باستخدام Linear Congruential Generator:```bash
vuke analyze --analyzer lcg
vuke analyze --analyzer lcg:glibc:le
vuke analyze --analyzer lcg:glibc --mask 5 0x15
### تحليل المفاتيح المقنعة (ألغاز من نوع BTC1000)
تستخدم بعض ألغاز البيتكوين مخطط إخفاء حيث:
1. يتم إنشاء مفتاح كامل 256-بت (مثل من MT19937)
2. يتم إخفاء المفتاح إلى N بت مع فرض أعلى بت على 1
الصيغة: `masked_key = (full_key & (2^N - 1)) | 2^(N-1)````bash
# Analyze 5-bit puzzle key 0x15
vuke analyze 0x15 --mask 5 --analyzer milksad
Analysis: ✓ milksad: CONFIRMED (seed=1610000002, full_key=7ed2...5055, masked=0x15, mask_bits=5, formula=(key & 0x1f) | 0x10)
## البدء السريع
* استبدل متغيرات البيئة بالقيم من `terraform.tfvars` أو قدم قيمًا خاصة بك. قم بتشغيل بنية Terraform التحتية:
* انسخ المستودع
* شغّل `build-multicloud-ids.sh````bash
# Analyze 10-bit puzzle key
vuke analyze 0x202 --mask 10 --analyzer milksad
عند تحليل المفاتيح المقنعة، فإن تطابق بت صغير واحد له معدلات إيجابية كاذبة عالية. يقوم المرشح المتتالي بالتحقق من المرشحين مقابل عدة مفاتيح ألغاز معروفة:```bash
vuke analyze 0x16 --analyzer milksad --cascade "5:0x16,10:0x273,15:0x7a85"
المخرجات:```
Private Key: 0000000000000000000000000000000000000000000000000000000000000016
Bit Length: 5
Hamming Weight: 3
---
Analysis:
✓ milksad: CONFIRMED (seed=100 (0x00000064))
P5: target=0x16, full_key=08961c8b18dbd0ab4337434767df7b69572fad6c4f00c186b03f43d88af70a26
P10: target=0x273, full_key=5e413501b4371e2862271f1f3550bc2f4236b6abe29ec9350e166bd322c3e673
P15: target=0x7a85, full_key=f133ff22f0aac1de185139938f664d10e4ac2de46be7d29f3c458e353a1efa85)
تنسيق التسلسل هو bits:target,bits:target,... حيث:
bits هو عرض القناع (1-64)target هو سداسي عشري (مع بادئة 0x) أو عشريتحليل الاحتمالات:
استخدم مزوّدي البيانات لتهيئة تحليل الألغاز تلقائيًا:```bash
vuke analyze 0x15 --puzzle boha:b1000:5
vuke analyze 0x15 --cascade boha:b1000:5:3 --analyzer milksad
vuke analyze 0x01 --verify boha:b1000
vuke analyze 0x01 --verify boha:b1000 --json
العلامة `--puzzle`:
- تحميل سياق اللغز من المزوّد
- تعيين `--mask` تلقائيًا من puzzle.key.bits
- عرض العنوان المتوقع للتحقق
العلامة `--cascade` مع المزوّد:
- التنسيق: `boha:collection:puzzle_id:neighbor_count`
- بناء سلسلة متتالية من N ألغاز محلولة قبل الهدف
- الافتراضي: 5 جيران إذا لم يتم تحديد العدد
### محلل MT19937-64 (بذور 64 بت)
لاختبار فرضيات البذور 64 بت، يتطلب محلل `mt64` **مرشح** السلسلة المتتالية (مساحة البذور 64 بت غير قابلة للبحث الاستنفادي):```bash
# MT19937-64 cascade search - REQUIRES cascade filter
vuke analyze 0x15 --analyzer mt64 --cascade "5:0x15,10:0x202,20:0xd2c55,30:0x3d94cd64"
يُظهر التقدم معدل البحث ونتائج مرشح التتالي:``` ⠋ Searched: 1200000 seeds | Rate: 850K/s | Elapsed: 1.4s | Cascade hits: 73
### Xorshift analyzer (64-bit seeds)
تتطلب Xorshift PRNGs (المستخدمة في محركات V8/SpiderMonkey JavaScript) أيضًا cascade filter بسبب مساحة البذور 64-bit:```bash
# Test all xorshift variants
vuke analyze 0x15 --analyzer xorshift --cascade "5:0x15,10:0x202,20:0xd2c55"
# Test specific variant
vuke analyze 0x15 --analyzer xorshift:64 --cascade "5:0x15,10:0x202,20:0xd2c55"
vuke analyze 0x15 --analyzer xorshift:128plus --cascade "5:0x15,10:0x202,20:0xd2c55"
المتغيرات المدعومة:
xorshift:64 - xorshift كلاسيكي بحالة 64 بتxorshift:128 - xorshift بحالة 128 بت (البذرة تُهيأ كـ (seed, 0))xorshift:128plus - Xorshift128+ (المستخدم في V8/SpiderMonkey Math.random())xorshift:xoroshiro - Xoroshiro128** (النوع الحديث)يحتوي MultiBit HD Beta 7 (2014-2016) على خلل حيث تم تمرير بذرة BIP39 ذات الـ 64 بايت
مباشرة إلى مُنشئ DeterministicSeed الخاص بـ BitcoinJ كعشوائية (المتوقع 16-32 بايت).
أنشأ هذا مفاتيح غير متوافقة لا يمكن استعادتها باستخدام أدوات BIP39 القياسية.```bash
vuke analyze --analyzer multibit-hd --mnemonic "word1 word2 ... word12"
vuke analyze --analyzer multibit-hd --mnemonic "word1 word2 ..." --passphrase "my passphrase"
vuke analyze --analyzer multibit-hd --mnemonic-file candidates.txt
توليد مفاتيح معطوبة من عبارة تذكيرية معروفة:```bash
vuke single "skin join dog sponsor camera puppy ritual diagram arrow poverty boy elbow" --transform=multibit
الإخراج (المفتاح الأول عند m/0'/0/0):``` P2PKH (compressed): 1LQ8XnNKqC7Vu7atH5k4X8qVCc9ug2q7WE
يتطابق هذا مع العنوان المعيب من [مشكلة MultiBit HD #445](https://github.com/Multibit-Legacy/multibit-hd/issues/445).
العنوان الصحيح وفقًا لـ BIP39 سيكون `12QxtuyEM8KBG3ngNRe2CZE28hFw3b1KMJ`.
### مفاتيح Electrum قبل إصدار BIP39 (2011-2014)
كانت محافظ Electrum قبل اعتماد BIP39 تستخدم مخطط اشتقاق مخصص:
- بذور ست عشرية 128 بت ممتدة عبر 100,000 تكرار SHA256
- اشتقاق المفاتيح الفرعية كـ `(master + sequence) mod n`
- مفاتيح عامة غير مضغوطة للعناوين
توليد مفاتيح من بذرة Electrum قديمة:```bash
# Generate receiving chain addresses (first 20 keys)
vuke single "acb740e454c3134901d7c8f16497cc1c" --transform electrum
# Generate change chain addresses
vuke single "acb740e454c3134901d7c8f16497cc1c" --transform electrum:change
المخرجات (عنوان الاستلام 0):``` P2PKH (uncompressed): 1FJEEB8ihPMbzs2SkLmr37dHyRFzakqUmo
### محلل سلسلة SHA256
اكتشاف المفاتيح المولدة باستخدام سلاسل SHA256 الحتمية (key[n] = SHA256(key[n-1]) أو SHA256(seed || n)):```bash
# Check with iterated chain (default): key[n] = SHA256(key[n-1])
vuke analyze <KEY> --analyzer sha256_chain --chain-depth 20
# Check indexed variant: key[n] = SHA256(seed || n as bytes)
vuke analyze <KEY> --analyzer sha256_chain:indexed --chain-depth 20
# With masking for puzzle analysis
vuke analyze 0x15 --mask 5 --analyzer sha256_chain --chain-depth 10
# With cascade filter for reduced false positives
vuke analyze 0x15 --analyzer sha256_chain --cascade "5:0x15,10:0x202" --chain-depth 10
المتغيرات المدعومة:
sha256_chain أو sha256_chain:iterated - الاشتقاق المتسلسل: key[n] = SHA256(key[n-1])sha256_chain:indexed أو sha256_chain:indexed:be - مفهرس: SHA256(seed || n) بترتيب البايت الكبيرsha256_chain:indexed:le - مفهرس بترتيب البايت الصغيرsha256_chain:counter - مفهرس بنص: SHA256(seed || "n")توليد المفاتيح باستخدام الاشتقاق المتسلسل SHA256:```bash
vuke generate --transform=sha256_chain range --start 1 --end 1000
vuke generate --transform=sha256_chain:counter --chain-depth 5 wordlist --file seeds.txt
vuke generate --transform=sha256_chain:iterated --chain-depth 10 range --start 1 --end 100
## التحويلات المدعومة
| التحويل | الوصف | حالة الاستخدام |
|-----------|-------------|----------|
| `direct` | بايتات خام مبطنة إلى 32 بايت | اختبار البذور الرقمية الخام |
| `sha256` | SHA256(المدخل) | محافظ الدماغ الكلاسيكية |
| `double_sha256` | SHA256(SHA256(المدخل)) | تجزئة على نمط البيتكوين |
| `md5` | MD5(المدخل) مكرر إلى 32 بايت | تجزئة ضعيفة قديمة |
| `milksad` | مولد أرقام عشوائية MT19937 ببذرة 32 بت | CVE-2023-39910 (libbitcoin) |
| `mt64` | مولد MT19937-64 ببذرة 64 بت | اختبار فرضية البذرة 64 بت |
| `multibit` | خطأ بذرة MultiBit HD كإنتروبيا | محافظ MultiBit HD من 2014-2016 |
| `armory` | سلسلة اشتقاق Armory HD | محافظ ما قبل BIP32 |
| `electrum` | اشتقاق Electrum قبل BIP39 | محافظ Electrum 2011-2014 |
| `electrum:change` | سلسلة التغيير لـ Electrum | عناوين التغيير لـ Electrum 2011-2014 |
| `lcg[:variant][:endian]` | مولد LCG ببذرة 32 بت | دالة rand() من مكتبة C القياسية القديمة |
| `xorshift[:variant]` | مولد Xorshift ببذرة 64 بت | V8/SpiderMonkey Math.random() |
| `sha256_chain[:variant]` | سلسلة SHA256 حتمية | اشتقاق مفتاح متكرر/مفهرس |
| `bitimage` | ملف←base64←SHA256←BIP39←HD | اشتقاق مفتاح لغز Bitimage |
## المحللات المدعومة
| المحلل | الطريقة | حالة الاستخدام |
|----------|--------|----------|
| `milksad` | القوة العمياء 2^32 بذرة | التحقق مما إذا كان المفتاح ضحية Milksad |
| `milksad --mask N` | القوة العمياء مع قناع N بت | تحليل ألغاز على نمط BTC1000 |
| `milksad --cascade` | تحقق تسلسلي متعدد الأهداف | تقليل الإيجابيات الكاذبة في أبحاث الألغاز |
| `mt64 --cascade` | القوة العمياء 2^64 مع مرشح متتالي | فرضية PRNG 64 بت لـ BTC1000 |
| `multibit-hd --mnemonic` | اختبار العبارة التذكيرية مقابل المفتاح | التحقق من أصل خطأ MultiBit HD |
| `multibit-hd --mnemonic-file` | هجوم القاموس | العثور على العبارة التذكيرية لمفتاح MultiBit HD |
| `direct` | كشف النمط | كشف البذور الصغيرة، سلاسل ASCII |
| `heuristic` | تحليل إحصائي | شذوذات الإنتروبيا ووزن هامينغ |
| `lcg[:variant][:endian]` | القوة العمياء 2^31-2^32 بذرة | كشف rand() من glibc/minstd/msvc/borland |
| `xorshift[:variant] --cascade` | القوة العمياء 2^64 مع مرشح متتالي | مولدات Xorshift في V8/SpiderMonkey |
| `sha256_chain[:variant]` | القوة العمياء 2^32 بذرة مع عمق السلسلة | سلاسل مفاتيح SHA256 حتمية |
## استخدام المكتبة```rust
use vuke::derive::KeyDeriver;
use vuke::transform::{Input, Transform, Sha256Transform};
fn main() {
let deriver = KeyDeriver::new();
let transform = Sha256Transform;
let input = Input::from_string("test passphrase".to_string());
let mut buffer = Vec::new();
transform.apply_batch(&[input], &mut buffer);
for (source, key) in buffer {
let derived = deriver.derive(&key);
println!("Source: {}", source);
println!("WIF: {}", derived.wif_compressed);
println!("Address: {}", derived.p2pkh_compressed);
}
}
src/ ├── main.rs # CLI entry point (clap derive) ├── 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 ├── provider.rs # Data provider system (boha puzzles) ├── lcg.rs # LCG PRNG shared logic ├── xorshift.rs # Xorshift PRNG shared logic ├── mt64.rs # MT19937-64 PRNG shared logic ├── multibit.rs # MultiBit HD bug logic (PBKDF2, BIP32) ├── electrum.rs # Electrum pre-BIP39 deterministic derivation ├── sha256_chain.rs # SHA256 chain shared logic (iterated/indexed) ├── bitimage.rs # Bitimage puzzle derivation logic ├── analyze/ │ ├── mod.rs # Analyzer trait and types │ ├── key_parser.rs # Parse hex/WIF/decimal keys │ ├── output.rs # Plain text and JSON formatting │ ├── milksad.rs # MT19937 brute-force (GPU accelerated) │ ├── mt64.rs # MT19937-64 brute-force (requires cascade) │ ├── multibit.rs # MultiBit HD mnemonic verification │ ├── lcg.rs # LCG brute-force (glibc, minstd, msvc, borland) │ ├── xorshift.rs # Xorshift brute-force (requires cascade) │ ├── sha256_chain.rs # SHA256 chain brute-force (GPU accelerated) │ ├── direct.rs # Pattern detection │ └── heuristic.rs # Statistical analysis ├── 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 │ └── files.rs # File/directory source for binary data ├── output/ │ ├── mod.rs # Output trait │ ├── console.rs # Console output (compact CSV + verbose YAML) │ ├── multi.rs # Multi-output dispatcher │ ├── storage.rs # Parquet backend bridge (feature: storage) │ └── query_format.rs # DuckDB result formatting (feature: storage-query) ├── 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) │ ├── mt64.rs # MT19937-64 PRNG transform │ ├── multibit.rs # MultiBit HD seed-as-entropy bug │ ├── electrum.rs # Electrum pre-BIP39 deterministic derivation │ ├── lcg.rs # LCG PRNG transform │ ├── xorshift.rs # Xorshift PRNG transform │ ├── sha256_chain.rs # SHA256 chain transform │ ├── bitimage.rs # File-derived HD keys (Bitimage puzzle) │ └── armory.rs # Armory HD derivation ├── gpu/ # WebGPU acceleration (feature: gpu) │ ├── mod.rs # Module exports │ ├── context.rs # GPU device initialization │ ├── error.rs # GPU error types │ ├── buffer.rs # GPU buffer utilities │ ├── hash.rs # SHA256/MD5 hash pipelines │ ├── mt19937.rs # MT19937 brute-force pipeline │ ├── sha256_chain.rs # SHA256 chain pipeline │ └── shaders/ # WGSL compute shaders │ ├── mt19937.wgsl │ ├── sha256.wgsl │ └── md5.wgsl └── storage/ # Persistent storage (feature: storage) ├── mod.rs # StorageBackend trait ├── schema.rs # Arrow schema definitions ├── parquet_backend.rs # Parquet file writer with auto-chunking ├── query.rs # DuckDB SQL executor (feature: storage-query) ├── cloud/ # S3-compatible upload (feature: storage-cloud) │ ├── mod.rs # CloudUploader trait │ ├── s3.rs # S3/R2/MinIO implementation │ ├── credentials.rs # Credential resolution │ ├── sync.rs # Batch upload with concurrency │ ├── progress.rs # Upload progress tracking │ └── error.rs # Cloud error types └── iceberg/ # Iceberg catalog (feature: storage-iceberg) ├── mod.rs # Iceberg integration entry ├── catalog.rs # REST catalog client ├── schema.rs # Iceberg schema mapping ├── partition.rs # Partition spec └── error.rs # Iceberg error types
## المتطلبات
- Rust 1.70+
## إخلاء مسؤولية
هذه الأداة مخصصة **لأغراض تعليمية وبحثية أمنية فقط**. لا تستخدمها للوصول إلى محافظ لا تملكها. المؤلفون غير مسؤولين عن أي سوء استخدام.
## الترخيص
رخصة MIT - انظر [LICENSE](https://github.com/oritwoen/vuke/blob/HEAD/LICENSE) للتفاصيل.
## المراجع
- [Milksad vulnerability](https://milksad.info/) - CVE-2023-39910
- [MultiBit HD issue #445](https://github.com/Multibit-Legacy/multibit-hd/issues/445) - خطأ استخدام البذور كعشوائية
- [Brainwallet attacks](https://eprint.iacr.org/2016/103.pdf) - ورقة أكاديمية
- [وثائق Armory](https://btcarmory.com/) - محفظة HD قديمة
- [المولد التطابقي الخطي](https://en.wikipedia.org/wiki/Linear_congruential_generator) - ويكيبيديا
- [مولدات Xorshift العشوائية الزائفة](https://en.wikipedia.org/wiki/Xorshift) - ويكيبيديا
- [اشتقاق المفاتيح في Electrum 1.x](https://github.com/spesmilo/electrum/blob/b9196260cfd515363a026c3bfc7bc7aa757965a0/lib/bitcoin.py) - الكود المصدري قبل BIP39
| الثغرة | السنة | التأثير |
|---|
| محافظ الدماغ | 2011-2015 | SHA256(كلمة المرور) سهلة الاختراق |
| مولدات عشوائية ضعيفة | 2013-2023 | بذور قابلة للتنبؤ (طوابع زمنية، معرفات العمليات) |
| Milksad | 2023 | استخدمت bx من libbitcoin MT19937 ببذور 32 بت |
| MultiBit HD | 2014-2016 | بذرة BIP39 بحجم 64 بايت استخدمت كعشوائية |
| Electrum قبل BIP39 | 2011-2014 | اشتقاق حتمي مخصص بتمديد ضعيف |
| Armory HD | 2012-2016 | اشتقاق حتمي قبل BIP32 |
| مولدات LCG | 1990s-2010s | glibc rand(), MINSTD, MSVC - حالة 31-32 بت فقط |
| مولدات Xorshift | 2003-حتى الآن | V8/SpiderMonkey Math.random() - حالة 64-128 بت |
| سلاسل SHA256 | 2010s-حتى الآن | اشتقاق حتمي للمفاتيح من بذور ضعيفة |