
توقيع/تحقق ECDSA واتفاق مفاتيح ECDH بلغة بايثون نقية
هذا تطبيق سهل الاستخدام لتشفير المنحنيات الإهليلجية (ECC) مع دعم لـ ECDSA (خوارزمية التوقيع الرقمي بالمنحنيات الإهليلجية)، وEdDSA (خوارزمية التوقيع الرقمي بمنحنيات إدواردز)، وECDH (تبادل مفاتيح ديفي-هيلمان بالمنحنيات الإهليلجية)، مطبق بالكامل في Python ومصدر بموجب رخصة MIT. باستخدام هذه المكتبة، يمكنك إنشاء أزواج مفاتيح (مفتاح توقيع ومفتاح تحقق) بسرعة، وتوقيع الرسائل، والتحقق من التوقيعات. يمكنك أيضًا الاتفاق على مفتاح سري مشترك استنادًا إلى المفاتيح العامة المتبادلة. المفاتيح والتوقيعات قصيرة جدًا، مما يجعل من السهل التعامل معها ودمجها في بروتوكولات أخرى.
ملاحظة: لا ينبغي استخدام هذه المكتبة في بيئات الإنتاج؛ راجع Security لمزيد من التفاصيل.
توفر هذه المكتبة توليد المفاتيح والتوقيع والتحقق واشتقاق السر المشترك لخمس منحنيات NIST الشهيرة من فئة "Suite B" على حقل GF(p) (الحقل الأولي)، بأطوال مفاتيح 192 و224 و256 و384 و521 بت. "الأسماء المختصرة" لهذه المنحنيات، كما تعرفها أداة OpenSSL (openssl ecparam -list_curves)، هي: prime192v1، secp224r1، prime256v1، secp384r1، وsecp521r1. كما تتضمن منحنى 256-بت secp256k1 المستخدم في Bitcoin. يوجد أيضًا دعم للنسخ العادية (غير الملتوية) لمنحنيات Brainpool من 160 إلى 512 بت. "الأسماء المختصرة" لتلك المنحنيات هي: brainpoolP160r1، brainpoolP192r1، brainpoolP224r1، brainpoolP256r1، brainpoolP320r1، brainpoolP384r1، brainpoolP512r1. كما تم تضمين بعض المنحنيات الصغيرة من معيار SEC (بشكل أساسي لتسريع اختبار المكتبة)، وهي: secp112r1، secp112r2، secp128r1، وsecp160r1. يُدعم أيضًا توليد المفاتيح والتوقيع والتحقق لمنحنيات Ed25519 وEd448. لا يتم تضمين منحنيات أخرى، لكن إضافة دعم لمزيد من المنحنيات على الحقول الأولية ليس بالأمر الصعب.
تعتمد هذه المكتبة على Python وحزمة 'six' فقط. وهي متوافقة مع Python 2.6 و2.7 و3.6+. كما أنها تدعم التنفيذ على تطبيقات بديلة مثل pypy وpypy3.
إذا تم تثبيت gmpy2 أو gmpy، فسيتم استخدامهما لإجراء عمليات حسابية أسرع. يمكن تثبيت أي منهما بعد تثبيت هذه المكتبة، وسيكتشف python-ecdsa وجودهما عند بدء التشغيل ويستخدمهما تلقائيًا. ويُفضّل استخدام gmpy2 على Python3 للحصول على الأداء الأمثل.
لتشغيل اختبارات التوافق مع OpenSSL، يجب أن تكون أداة 'openssl' في مسار PATH. تم اختبار هذا الإصدار بنجاح مع OpenSSL 0.9.8o و1.0.0a و1.0.2f و1.1.1d و3.0.1 (من بين إصدارات أخرى).
هذه المكتبة متاحة على PyPI، ويُنصح بتثبيتها باستخدام pip:```
pip install ecdsa
في حال كانت هناك حاجة لأداء أعلى ولم يكن استخدام الكود الأصلي مشكلة، فمن الممكن تحديد التثبيت مع `gmpy2`:```
pip install ecdsa[gmpy2]
أو (خيار أبطأ وقديم):``` pip install ecdsa[gmpy]
## السرعة
يوضح الجدول التالي المدة التي تستغرقها هذه المكتبة لتوليد أزواج المفاتيح
(`keygen`)، لتوقيع البيانات (`sign`)، للتحقق من تلك التوقيعات (`verify`)،
لاشتقاق سر مشترك (`ecdh`)،
وللتحقق من التوقيعات دون حساب مسبق خاص بالمفتاح (`no PC verify`).
جميع هذه القيم بالثواني.
للتسهيل، تُقدَّم أيضاً القيم العكسية لهذه القيم:
كم عدد المفاتيح التي يمكن توليدها في الثانية (`keygen/s`)، وكم عدد التوقيعات
التي يمكن إنشاؤها في الثانية (`sign/s`)، وكم عدد التوقيعات التي يمكن التحقق منها
في الثانية (`verify/s`)، وكم عدد الأسرار المشتركة التي يمكن اشتقاقها في الثانية
(`ecdh/s`)، وكم عدد التوقيعات دون حساب مسبق خاص
بالمفتاح التي يمكن التحقق منها في الثانية (`no PC verify/s`). حجم التوقيع
الخام (عادةً أصغر
طريقة يمكن بها ترميز التوقيع) مُقدَّم أيضاً في عمود `siglen`.
استخدم `tox -e speed` لتوليد هذا الجدول على جهازك الخاص.
على معالج Intel Core i7 4790K @ 4.0GHz أحصل على الأداء التالي:```
siglen keygen keygen/s sign sign/s verify verify/s no PC verify no PC verify/s
NIST192p: 48 0.00032s 3134.06 0.00033s 2985.53 0.00063s 1598.36 0.00129s 774.43
NIST224p: 56 0.00040s 2469.24 0.00042s 2367.88 0.00081s 1233.41 0.00170s 586.66
NIST256p: 64 0.00051s 1952.73 0.00054s 1867.80 0.00098s 1021.86 0.00212s 471.27
NIST384p: 96 0.00107s 935.92 0.00111s 904.23 0.00203s 491.77 0.00446s 224.00
NIST521p: 132 0.00210s 475.52 0.00215s 464.16 0.00398s 251.28 0.00874s 114.39
SECP256k1: 64 0.00052s 1921.54 0.00054s 1847.49 0.00105s 948.68 0.00210s 477.01
BRAINPOOLP160r1: 40 0.00025s 4003.88 0.00026s 3845.12 0.00053s 1893.93 0.00105s 949.92
BRAINPOOLP192r1: 48 0.00033s 3043.97 0.00034s 2975.98 0.00063s 1581.50 0.00135s 742.29
BRAINPOOLP224r1: 56 0.00041s 2436.44 0.00043s 2315.51 0.00078s 1278.49 0.00180s 556.16
BRAINPOOLP256r1: 64 0.00053s 1892.49 0.00054s 1846.24 0.00114s 875.64 0.00229s 437.25
BRAINPOOLP320r1: 80 0.00073s 1361.26 0.00076s 1309.25 0.00143s 699.29 0.00322s 310.49
BRAINPOOLP384r1: 96 0.00107s 931.29 0.00111s 901.80 0.00230s 434.19 0.00476s 210.20
BRAINPOOLP512r1: 128 0.00207s 483.41 0.00212s 471.42 0.00425s 235.43 0.00912s 109.61
SECP112r1: 28 0.00015s 6672.53 0.00016s 6440.34 0.00031s 3265.41 0.00056s 1774.20
SECP112r2: 28 0.00015s 6697.11 0.00015s 6479.98 0.00028s 3524.72 0.00058s 1716.16
SECP128r1: 32 0.00018s 5497.65 0.00019s 5272.89 0.00036s 2747.39 0.00072s 1396.16
SECP160r1: 42 0.00025s 3949.32 0.00026s 3894.45 0.00046s 2153.85 0.00102s 985.07
Ed25519: 64 0.00076s 1324.48 0.00042s 2405.01 0.00109s 918.05 0.00344s 290.50
Ed448: 114 0.00176s 569.53 0.00115s 870.94 0.00282s 355.04 0.01024s 97.69