
خوارزمية Pollard's Kangaroo المسرعة بواسطة GPU لحل مشكلة اللوغاريتم المتقطع للمنحنيات الإهليلجية (ECDLP) على secp256k1، مع دعم الواجهات الخلفية Vulkan و Metal و DX12.
خوارزمية بولارد كانغر (Pollard's Kangaroo) المُسرَّعة بواسطة GPU لحل مشكلة اللوغاريتم المنفصل للمنحنى الإهليلجي (ECDLP) على secp256k1.
--benchmark لاختبار العتاد، --save-benchmarks لتسجيل النتائجمعظم تطبيقات Kangaroo الحالية (JeanLucPons/Kangaroo، RCKangaroo، إلخ) تدعم فقط GPUs من NVIDIA عبر CUDA. يستخدم هذا التطبيق WebGPU/wgpu الذي يوفر حوسبة GPU عبر المنصات عبر Vulkan و Metal و 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>
يجب تحديد --target أو --pubkey.
استخدام مزود البيانات (boha):
# حل لغز باستخدام بيانات boha (تلقائي: المفتاح العام، البداية، النطاق)
kangaroo --target boha:b1000/66
# تجاوز النطاق (ابحث في مجموعة فرعية أصغر)
kangaroo --target boha:b1000/66 --range 60
# عرض الألغاز المتاحة
kangaroo --list-providers
معاملات يدوية:
kangaroo \
--pubkey 03a2efa402fd5268400c77c20e574ba86409ededee7c4020e4b9f0edbee53de0d4 \
--start 8000000000 \
--range 40
مع قيد معياري (k ≡ 37 mod 60):
kangaroo \
--pubkey 03a2efa402fd5268400c77c20e574ba86409ededee7c4020e4b9f0edbee53de0d4 \
--start 8000000000 \
--range 40 \
--mod-step 3c \
--mod-start 25
هذا يقلل مساحة البحث بحوالي 60 مرة. مفيد عندما يكون هيكل المفتاح الجزئي معروفًا (مثل مفتاح تم إنشاؤه بنمط خطوة يمكن التنبؤ به).
خوارزمية بولارد كانغر تحل مشكلة اللوغاريتم المنفصل في وقت O(√n) حيث n هو نطاق البحث. تعمل على النحو التالي:
تحسين النقاط المميزة (DP): بدلاً من تخزين كل النقاط التي تمت زيارتها، نخزن فقط النقاط التي تحتوي الإحداثي x على عدد محدد من البتات الصفرية الرائدة. هذا يقلل بشكل كبير من استخدام الذاكرة مع السماح باكتشاف التصادم.
العمليات المتوقعة: ~2^(range_bits/2)
قم بتشغيل kangaroo --benchmark لاختبار عتادك دون لمس الملفات. استخدم kangaroo --benchmark --save-benchmarks لتحديث BENCHMARKS.md.
| حالة الاستخدام | مثال |
|---|---|
| مفتاح جزئي مفكوك | لغز يعطي حوالي 240 بت، نحتاج إلى إيجاد الـ 16 بت المتبقية |
| مفتاح في نطاق معروف | نعرف أن المفتاح يقع بين X و Y |
| التحقق من حل قريب | لدينا مرشح، ابحث ±N بت حوله |
غير مفيد لـ:
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 موفري بيانات خارجيين لمصادر الألغاز. يقوم المزودون بتوفير المفتاح العام ونطاق المفتاح وبيانات وصفية أخرى للغز.
boha يوفر بيانات ألغاز التشفير بما في ذلك لغز معاملة بيتكوين (b1000).
البناء مع دعم boha:
cargo build --release --features boha
الاستخدام:
# حل لغز معين
kangaroo --target boha:b1000/66
# عرض الألغاز القابلة للحل (غير المحلولة مع مفتاح عام معروف)
kangaroo --list-providers
يتحقق المزود من تجاوزات النطاق - لا يمكنك البحث خارج نطاق مفتاح اللغز.
src/
├── main.rs # نقطة دخول CLI
├── lib.rs # دخول المكتبة + Args + run()
├── solver.rs # تنسيق حلال GPU
├── cli.rs # أدوات CLI (التتبع، شريط التقدم)
├── benchmark.rs # مجموعة معايير أداء مدمجة
├── modular.rs # تحويل القيد المعياري
├── math.rs # عمليات حسابية 256 بت، توليد قناع DP
├── convert.rs # تحويلات Limb/بايت لـ GPU↔CPU
├── provider/
│ ├── mod.rs # واجهة نظام المزود
│ └── boha.rs # مزود boha (مقيد بالميزة)
├── cpu/
│ ├── cpu_solver.rs # حلال CPU نقي (اختبار/مقارنة)
│ ├── dp_table.rs # كشف تصادم النقاط المميزة
│ └── init.rs # تهيئة الكناغر + جداول القفز
├── crypto/
│ └── mod.rs # أغلفة k256/secp256k1
├── gpu/
│ ├── pipeline.rs # إعداد خط أنابيب الحوسبة
│ └── buffers.rs # إدارة مخازن GPU
├── gpu_crypto/
│ ├── context.rs # سياق GPU + اختيار الخلفية
│ └── shaders/ # مكتبة شادرات WGSL
│ ├── field.wgsl # عمليات حقل secp256k1
│ └── curve.wgsl # عمليات نقطية جاكوبية
└── shaders/
└── kangaroo_affine.wgsl # شادر حوسبة كانغر الرئيسي
رخصة MIT - راجع LICENSE للتفاصيل.
| الوسيط | الافتراضي | الوصف |
|---|
-t, --target | - | هدف مزود البيانات (مثل boha:b1000/135) |
-p, --pubkey | - | المفتاح العام المستهدف (hex مضغوط، 33 بايت) |
-s, --start | 0 | بداية نطاق البحث (hex، بدون بادئة 0x) |
-r, --range | 32 | نطاق البحث بالبت (المفتاح في [start, start + 2^range - 1]) |
-d, --dp-bits | تلقائي | بتات النقطة المميزة |
-k, --kangaroos | تلقائي | عدد الكناغر المتوازية |
--gpu | 0 | فهرس جهاز GPU |
--backend | تلقائي | خلفية GPU: auto، vulkan، dx12، metal، gl |
-o, --output | - | ملف الإخراج للنتيجة |
-q, --quiet | false | إخراج أدنى، اطبع فقط المفتاح الذي تم العثور عليه |
--max-ops | 0 | أقصى عدد للعمليات (0 = غير محدود) |
--cpu | false | استخدام حلال CPU بدلاً من GPU |
--json | false | إخراج نتائج القياس بصيغة JSON |
--benchmark | false | تشغيل مجموعة معايير الأداء |
--save-benchmarks | false | حفظ نتائج القياس في BENCHMARKS.md عند استخدام --benchmark |
--mod-step | 1 | الخطوة المعيارية M (hex): ابحث فقط عن k ≡ R (mod M) |
--mod-start | 0 | الباقي المعياري R (hex): 0 ≤ R < M |
--list-providers | false | عرض الألغاز المتاحة من المزودين |