PyDERASN: كما كتبت مكتبة ASN.1 مع فتحات ونقط

ASN.1 هو معيار (ISO ، ITU-T ، GOST) للغة التي تصف المعلومات المنظمة ، وكذلك قواعد الترميز لهذه المعلومات. بالنسبة لي كمبرمج ، هذا تنسيق آخر لتسلسل وعرض البيانات ، إلى جانب JSON و XML و XDR وغيرها. إنه أمر شائع للغاية في حياتنا العادية ، ويصادفه كثير من الناس: في الاتصالات الخلوية والهاتفية واتصالات VoIP (UMTS و LTE و WiMAX و SS7 و H.323) ، في بروتوكولات الشبكة (LDAP و SNMP و Kerberos) ، في كل شيء فيما يتعلق بالتشفير (X.509 ، CMS ، PKCS) ، في البطاقات المصرفية وجوازات السفر البيومترية ، وأكثر من ذلك بكثير.

تتناول هذه المقالة مكتبة PyDERASN : Python ASN.1 المستخدمة بنشاط في المشاريع المتعلقة بالتشفير في Atlas .

بلدي

في الواقع ، لا يستحق التوصية ASN.1 لمهام التشفير: ASN.1 وبرامج الترميز الخاصة به معقدة. هذا يعني أن الكود لن يكون بسيطًا ، لكنه دائمًا عبارة عن ناقل هجوم إضافي. انظر فقط إلى قائمة الثغرات الموجودة في مكتبات ASN.1. لا يوصي Bruce Schneier ، في هندسة التشفير الخاصة به ، باستخدام هذا المعيار بسبب تعقيده: "إن تشفير TLV الأكثر شهرة هو ASN.1 ، لكنه معقد بشكل لا يصدق ونحن نخجل منه". ولكن ، لسوء الحظ ، لدينا اليوم بنية تحتية للمفتاح العام تستخدم شهادات X.509 و CRL و OCSP و TSP و CMP و CMC و CMS وطنًا من معايير PKCS . لذلك ، يجب أن تكون قادرًا على العمل مع ASN.1 إذا كنت تفعل شيئًا ما يتعلق بالتشفير.

يمكن ترميز ASN.1 بعدة طرق / برامج الترميز:

  • BER (قواعد الترميز الأساسية)
  • CER (قواعد الترميز الكنسي)
  • DER (قواعد الترميز المتميزة)
  • GSER (قواعد تشفير السلسلة العامة)
  • JER (قواعد ترميز JSON)
  • LWER (قواعد الترميز خفيفة الوزن)
  • OER (قواعد ترميز Octet)
  • PER (قواعد التشفير المعبأة)
  • SER (تشفير قواعد تشفير محددة)
  • XER (قواعد ترميز XML)

وعدد من الآخرين. ولكن في مهام التشفير في الممارسة العملية ، يتم استخدام اثنين: BER و DER. حتى في مستندات XML الموقعة ( XMLDSig ، XAdES ) ، ستظل هناك كائنات ASN.1 DER ترميز Base64 ، وكذلك في بروتوكول ACME المستندة إلى JSON Let's Encrypt. يمكنك فهم جميع برامج الترميز هذه ومبادئ الترميز BER / CER / DER في المقالات والكتب: ASN.1 بكلمات بسيطة ، ASN.1 - التواصل بين الأنظمة غير المتجانسة بواسطة Olivier Dubuisson ، ASN.1 إكمال بواسطة البروفيسور John Larmouth .

BER عبارة عن تنسيق TLV ثنائي البايت (على سبيل المثال ، PER ، شائع في الاتصالات المتنقلة - بت). يتم تشفير كل عنصر في شكل: علامة ( T ag) تحدد نوع العنصر الذي يتم ترميزه (عدد صحيح ، سلسلة ، تاريخ ، وما إلى ذلك) ، الطول ( L ength) للمحتوى والمحتوى نفسه ( V alue). يسمح لك BER اختيارياً بعدم تحديد قيمة طول عن طريق تعيين قيمة طول غير محددة خاصة وتنتهي برسالة نهاية الثمانيات. بالإضافة إلى طول الترميز ، لدى BER الكثير من التباين في طريقة تشفير أنواع البيانات ، مثل:

  • قد لا يتم تطبيع INTEGER ، معرف الهدف ، STRING BIT وطول العنصر (غير مشفرة في شكل بسيط) ؛
  • BOOLEAN صحيح لأي محتوى غير صفري ؛
  • قد تحتوي BIT STRING على بتات صفرية "إضافية" ؛
  • BIT STRING ، OCTET STRING وجميع أنواع السلاسل المشتقة منها ، بما في ذلك التاريخ / الوقت ، يمكن تقسيمها إلى قطع (مقطع) بطول متغير ، طوله خلال (de) الترميز غير معروف مقدمًا ؛
  • يمكن أن يكون UTCTime / GeneralizedTime طرقًا مختلفة لتعيين إزاحة المنطقة الزمنية وكسور الصفر "الإضافية" بالثواني ؛
  • قد تكون أو لا تكون ترميز قيم DEFAULT SEQUENCE؛
  • يمكن ترميز قيم البتات الأخيرة في BIT STRING اختيارياً ؛
  • يمكن أن يكون الترتيب (OF) / SET (OF) ترتيبًا تعسفيًا للعناصر.

بالنسبة إلى كل ما سبق ، لا يمكن دائمًا تشفير البيانات بحيث تكون مطابقة للنموذج الأصلي. لذلك ، تم اختراع مجموعة فرعية من القواعد: DER عبارة عن تنظيم صارم لطريقة تشفير صالحة واحدة فقط ، وهو أمر مهم لمهام التشفير ، حيث ، على سبيل المثال ، سيؤدي تغيير بت واحد إلى إبطال التوقيع أو المجموع الاختباري. لدى DER عيبًا كبيرًا: يجب معرفة أطوال جميع العناصر مسبقًا أثناء الترميز ، والذي لا يسمح بتسلسل دفق البيانات. برنامج الترميز CER مجاني من هذا العيب ، مما يضمن عرضًا لا لبس فيه للبيانات. لسوء الحظ (أو لحسن الحظ ، لم يكن لدينا وحدات فك ترميز أكثر تعقيدًا؟) ، لم تصبح شائعة. لذلك ، في الممارسة العملية ، نواجه استخدامًا "مختلطًا" للبيانات المشفرة BER و DER. نظرًا لأن CER و DER هما مجموعة فرعية من BER ، فإن أي وحدة فك تشفير BER قادرة على معالجتها.

مشاكل مع pyasn1


في العمل ، نكتب العديد من برامج Python المتعلقة بالتشفير. وقبل بضع سنوات ، لم يكن هناك عملياً أي خيار للمكتبات المجانية: إما المكتبات منخفضة المستوى التي تسمح لك ببساطة بترميز / فك تشفير ، على سبيل المثال ، عدد صحيح ورأس هيكل ، أو هذه مكتبة pyasn1 . لقد عشناها لعدة سنوات ، وفي البداية كنا راضين للغاية ، لأنه يسمح لك بالعمل مع هياكل ASN.1 ككائنات عالية المستوى: على سبيل المثال ، يسمح لك كائن شهادة X.509 تم فك تشفيره بالوصول إلى الحقول الخاصة به من خلال واجهة القاموس: cert ["tbsCertificate"] سيظهر لنا ["SerialNumber"] الرقم التسلسلي لهذه الشهادة. وبالمثل ، يمكنك "تجميع" الكائنات المعقدة من خلال العمل معهم كما هو الحال مع القوائم ، والقواميس ، ثم استدعاء دالة pyasn1.codec.der.encoder.encode فقط والحصول على تمثيل متسلسل للمستند.

ومع ذلك ، تم الكشف عن نقاط الضعف والمشاكل والقيود. كانت هناك ، وللأسف ، لا تزال هناك أخطاء في pyasn1: في وقت كتابة هذا التقرير ، في pyasn1 ، أحد الأنواع الأساسية ، GeneralizedTime ، يتم فك تشفيره وترميزه بشكل غير صحيح .

في مشاريعنا ، لتوفير المساحة ، غالبًا ما نخزن فقط المسار إلى الملف والإزاحة والطول في بايت الكائن الذي نريد الإشارة إليه. على سبيل المثال ، من المرجح أن يوجد ملف موقّع تعسفي في بنية CMS SignedData ASN.1:

0 [1,3,1018] ContentInfo SEQUENCE 4 [1,1, 9] . contentType: ContentType OBJECT IDENTIFIER 1.2.840.113549.1.7.2 (id_signedData) 19-4 [0,0,1003] . content: [0] EXPLICIT [UNIV 16] ANY 19 [1,3, 999] . . DEFINED BY id_signedData: SignedData SEQUENCE 23 [1,1, 1] . . . version: CMSVersion INTEGER v3 (03) 26 [1,1, 19] . . . digestAlgorithms: DigestAlgorithmIdentifiers SET OF [...] 47 [1,3, 769] . . . encapContentInfo: EncapsulatedContentInfo SEQUENCE 51 [1,1, 8] . . . . eContentType: ContentType OBJECT IDENTIFIER 1.3.6.1.5.5.7.12.2 (id_cct_PKIData) 65-4 [1,3, 751] . . . . eContent: [0] EXPLICIT OCTET STRING 751 bytes OPTIONAL      751  820 [1,2, 199] . . . signerInfos: SignerInfos SET OF 823 [1,2, 196] . . . . 0: SignerInfo SEQUENCE 826 [1,1, 1] . . . . . version: CMSVersion INTEGER v3 (03) 829 [0,0, 22] . . . . . sid: SignerIdentifier CHOICE subjectKeyIdentifier [...] 956 [1,1, 64] . . . . . signature: SignatureValue OCTET STRING 64 bytes . . . . . . C1:B3:88:BA:F8:92:1C:E6:3E:41:9B:E0:D3:E9:AF:D8 . . . . . . 47:4A:8A:9D:94:5D:56:6B:F0:C1:20:38:D2:72:22:12 . . . . . . 9F:76:46:F6:51:5F:9A:8D:BF:D7:A6:9B:FD:C5:DA:D2 . . . . . . F3:6B:00:14:A4:9D:D7:B5:E1:A6:86:44:86:A7:E8:C9 

ويمكننا الحصول على الملف الأصلي الموقع عند إزاحة 65 بايت وطول 751 بايت. لا تخزن pyasn1 هذه المعلومات في كائناتها المشفرة. تمت كتابة ما يسمى TLVSeeker - مكتبة صغيرة تسمح لك بفك تشفير العلامات وأطوال الكائنات ، في الواجهة التي أمرنا بها "انتقل إلى العلامة التالية" ، "انتقل داخل العلامة" (انتقل داخل علامة SEQUENCE للكائن) ، "انتقل إلى العلامة التالية" ، "انتقل إلى العلامة التالية" ، "انتقل إلى العلامة التالية" ، "انتقل إلى العلامة التالية" إزاحة وطول الكائن حيث نحن ". كانت مسيرة "يدوية" على البيانات المتسلسلة ASN.1 DER. لكن لم يكن من الممكن التعامل مع البيانات المتسلسلة BER بهذه الطريقة ، لأنه ، على سبيل المثال ، يمكن ترميز سلسلة البايت OCTET STRING على هيئة عدة قطع.

عيب آخر لمهام pyasn1 لدينا هو عدم القدرة على الفهم من الكائنات التي تم فك شفرتها ما إذا كان حقل معين موجودًا في SEQUENCE أم لا. على سبيل المثال ، إذا كانت البنية تحتوي على حقل SEQUENCE OF Smth OPTIONAL ، فقد تكون غائبة تمامًا في البيانات المستلمة (اختياري) ، ولكن يمكن أن تكون موجودة ، لكن في نفس الوقت تكون ذات طول صفري (قائمة فارغة). في الحالة العامة ، لا يمكن توضيح ذلك. وهذا ضروري للتحقق الدقيق من صحة البيانات المستلمة. تخيل أن بعض المرجع المصدق سيصدر شهادة تحتوي على بيانات صالحة "غير كاملة" من وجهة نظر مخططات ASN.1! على سبيل المثال ، تجاوزت سلطة إصدار الشهادات TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı في شهادة الجذر حدود RFC 5280 المسموح بها لطول عنصر الموضوع - لا يمكن فك تشفيرها بأمانة وفقًا للمخطط. يتطلب برنامج الترميز DER ألا يتم تشفير الحقل الذي تكون قيمته DEFAULT أثناء الإرسال - وتواجه هذه المستندات في الحياة ، والنسخة الأولى من PyDERASN سمحت بوعي بسلوك غير صالح (من وجهة نظر DER) من أجل التوافق مع الإصدارات السابقة.

القيد الآخر هو عدم القدرة بسهولة على معرفة الشكل (BER / DER) الذي تم ترميز كائن أو آخر في الهيكل. على سبيل المثال ، يشير معيار CMS إلى أن الرسالة مشفرة BER ، ولكن يجب أن يكون حقل التوقيعات ، الذي يتكون عليه توقيع التشفير ، في DER. إذا تم فك تشفيرها باستخدام DER ، فسوف نقع في معالجة CMS نفسها ، إذا تم فك تشفيرها باستخدام BER ، فلن نعرف بأي شكل تم توقيعه. نتيجة لذلك ، سيكون من الضروري لـ TLVSeeker (ليس التناظرية في pyasn1) أن تبحث عن موقع كل حقل من الحقول الموقعة ، ويجب فك تشفيره بشكل منفصل بواسطة DER عن العرض التسلسلي.

كانت إمكانية المعالجة التلقائية لحقول DEFINED BY ، وهي شائعة جدًا ، مرغوبة جدًا بالنسبة لنا. بعد فك تشفير بنية ASN.1 ، قد يكون لدينا العديد من الحقول المتبقية ، والتي يجب معالجتها بشكل أكبر وفقًا للمخطط المحدد على أساس معرف الهدف المحدد في مجال الهيكل. في رمز Python ، هذا يعني كتابة if ثم استدعاء وحدة فك الترميز للحقل ANY.

ظهور PyDERASN


في نظام Atlas ، نقوم بانتظام ، بعد أن وجدنا أي مشاكل أو تعديل البرامج المجانية المستخدمة ، بإرسال تصحيحات إلى الأعلى. في pyasn1 ، أرسلنا تحسينات عدة مرات ، لكن رمز pyasn1 ليس هو الأسهل لفهمه ، وأحيانًا حدثت تغييرات API غير المتوافقة فيه ، الأمر الذي أدى بنا إلى الأيدي. بالإضافة إلى ذلك ، اعتدنا على كتابة الاختبارات مع الاختبارات التوليفية ، وهو ما لم يكن عليه الحال في pyasn1.

في أحد الأيام الجميلة ، قررت أنه كان علي تحمل ذلك ، وقد حان الوقت لمحاولة كتابة مكتبتي الخاصة مع __slot __s ، والإزاحة ، والنقاط المعروضة بشكل جميل! إن إنشاء برنامج ترميز ASN.1 لن يكون كافيًا - تحتاج إلى نقل جميع مشاريعنا التابعة إليه ، وهذا هو مئات الآلاف من أسطر التعليمات البرمجية التي يوجد فيها الكثير من العمل مع بنيات ASN.1. هذا أحد متطلبات ذلك: سهولة ترجمة رمز pyasn1 الحالي. بعد أن أمضيت عطلتي بأكملها ، كتبت هذه المكتبة ، ونقلت جميع المشاريع إليها. نظرًا لأن لديهم تغطية تقريبية 100٪ تقريبًا ، فإن هذا يعني أيضًا أن المكتبة تعمل بشكل كامل.

PyDERASN ، بالمثل ، لديها تغطية اختبار 100 ٪ تقريبا. يستخدم الاختبار التوليفي مع مكتبة الفرضيات الرائعة. كما تم تنفيذ py- afl على 32 آلة نووية. على الرغم من عدم وجود أي كود Python2 متبقي تقريبًا ، لا يزال PyDERASN يحافظ على التوافق معه وبسبب هذا فإنه لديه تبعية واحدة من ستة . بالإضافة إلى ذلك ، تم اختباره مقابل مجموعة اختبار التوافق ASN.1: 2008 .

يشبه مبدأ العمل معه pyasn1 - العمل مع كائنات Python عالية المستوى. وصف الدوائر ASN.1 مشابه.

 class TBSCertificate(Sequence): schema = ( ("version", Version(expl=tag_ctxc(0), default="v1")), ("serialNumber", CertificateSerialNumber()), ("signature", AlgorithmIdentifier()), ("issuer", Name()), ("validity", Validity()), ("subject", Name()), ("subjectPublicKeyInfo", SubjectPublicKeyInfo()), ("issuerUniqueID", UniqueIdentifier(impl=tag_ctxp(1), optional=True)), ("subjectUniqueID", UniqueIdentifier(impl=tag_ctxp(2), optional=True)), ("extensions", Extensions(expl=tag_ctxc(3), optional=True)), ) 

ومع ذلك ، فإن PyDERASN يشبه الكتابة القوية. في pyasn1 ، إذا كان الحقل من النوع CMSVersion (INTEGER) ، فيمكن تعيين int أو INTEGER. يتطلب PyDERASN بصرامة أن يكون الكائن المعين هو CMSVersion بالضبط. بالإضافة إلى كتابة رمز Python3 ، نستخدم كتابة التعليقات التوضيحية ، وبالتالي لن يكون لوظائفنا وسيطات غير مفهومة مثل def func (مسلسل ، محتويات) ، ولكن def func (مسلسل: CertificateSerialNumber ، المحتويات: EncapsulatedContentInfo) ، ويساعد PyDERASN في تتبع مثل هذه التعليمات البرمجية.

في الوقت نفسه ، لدى PyDERASN تنازلات مريحة للغاية لهذه الكتابة. لم يسمح pyasn1 بموضوع SubjectKeyIdentifier (). subtype (implicitTag = Tag (...)) لتعيين كائن SubjectKeyIdentifier () (بدون IMPLICIT TAG المطلوبة) وكان عليه غالبًا نسخ وإعادة إنشاء كائنات فقط بسبب تغيير IMPLICIT / EXPLICIT. لا يلاحظ PyDERASN بدقة إلا النوع الأساسي - سيحل محل العلامات تلقائيًا من بنية ASN.1 موجودة. هذا يبسط إلى حد كبير رمز التطبيق.

إذا حدث خطأ أثناء فك التشفير ، فليس من السهل فهم المكان الذي حدث فيه في pyasn1. على سبيل المثال ، في الشهادة التركية المذكورة سابقًا ، حصلنا على هذا الخطأ: UTF8String (tbsCertificate: issuer: rdnSequence: 3: 0: value: DEFINED BY 2.5.4.10:utf8String) (في 138) حدود غير مرضية: 1 ⇐ 77 ⇐ 64 .1 بنيات يمكن للأشخاص ارتكابها للأخطاء ، كما أنه من الأسهل تصحيح التطبيقات أو اكتشاف مشاكل المستندات المشفرة من الجانب الآخر.

لم يدعم الإصدار الأول من PyDERASN تشفير BER. يبدو لاحقًا كثيرًا ومعالجة UTCTime / GeneralizedTime مع المناطق الزمنية لا تزال غير مدعومة. سيأتي هذا في المستقبل ، لأن المشروع مكتوب بشكل رئيسي في وقت الفراغ.

أيضًا في الإصدار الأول ، لم يكن هناك أي عمل مع الحقول المحددة بـ BY. بعد بضعة أشهر ، ظهرت هذه الفرصة وبدأ استخدامها بنشاط ، مما قلل بشكل كبير من رمز التطبيق - في عملية فك تشفير واحدة كان من الممكن تفكيك الهيكل بأكمله إلى العمق. للقيام بذلك ، في المخطط ، يتم تحديد الحقول التي "تحدد". على سبيل المثال ، وصف لمخطط CMS:

 class ContentInfo(Sequence): schema = ( ("contentType", ContentType(defines=((("content",), { id_authenticatedData: AuthenticatedData(), id_digestedData: DigestedData(), id_encryptedData: EncryptedData(), id_envelopedData: EnvelopedData(), id_signedData: SignedData(), }),))), ("content", Any(expl=tag_ctxc(0))), ) 

يقول أنه إذا احتوى contentType على OID مع id_signedData ، فإن حقل المحتوى (الموجود في نفس الترتيب) يحتاج إلى فك تشفيره باستخدام نظام SignedData. لماذا يوجد الكثير من الأقواس؟ يمكن للحقل "تحديد" عدة حقول في نفس الوقت ، كما هو الحال في بنيات EnvelopedData. يتم تحديد الحقول المحددة بواسطة ما يسمى بمسار فك التشفير - حيث تحدد الموقع الدقيق لأي عنصر في جميع الهياكل.

ليس من المستحسن دائمًا أو ليس من الممكن دائمًا تقديم هذه التعريفات على الفور في الدائرة. قد تكون هناك حالات خاصة بالتطبيق تكون فيها OIDs والهياكل معروفة فقط في مشروع تابع لجهة أخرى. يوفر PyDERASN القدرة على تحديد هذه التعريفات في وقت فك تشفير البنية:

 ContentInfo().decode(data, ctx={"defines_by_path": (( ( "content", DecodePathDefBy(id_signedData), "certificates", any, "certificate", "tbsCertificate", "extensions", any, "extnID", ), ((("extnValue",), { id_ce_authorityKeyIdentifier: AuthorityKeyIdentifier(), id_ce_basicConstraints: BasicConstraints(), [...] id_ru_subjectSignTool: SubjectSignTool(), }),), ),)}) 

هنا نقول أنه في CMS SignedData لجميع الشهادات المرفقة ، قم بفك تشفير كل امتداداتها (AuthorityKeyIdentifier و BasicConstrict و SubjectSignTool ، إلخ). نشير من خلال مسار فك الترميز إلى تحديد العنصر "البديل" ، كما لو تم تعريفه في الدائرة.

أخيرًا ، PyDERASN لديه القدرة على العمل من سطر الأوامر لفك تشفير ملفات ASN.1 ولديه طباعة جميلة غنية. يمكنك فك تشفير ASN.1 التعسفي ، أو يمكنك تحديد مخطط محدد بوضوح ومشاهدة شيء مثل هذا:

المثال الطباعة جميلة

المعلومات المعروضة: إزاحة الكائن وطول العلامة وطول الطول وطول المحتوى ووجود EOC (نهاية الثمانيات) وعلامة تشفير BER وعلم تشفير الطول غير المحدد وطول وسم الإزاحة EXPLICIT (إن وجدت) وعمق تداخل الكائن في الهياكل ، قيمة علامة IMPLICIT / EXPLICIT ، اسم الكائن وفقًا للمخطط ، نوع ASN.1 الأساسي ، الرقم التسلسلي داخل SEQUENCE / SET OF ، قيمة الاختيار (إن وجد) ، الاسم الذي يمكن قراءته بواسطة الإنسان INTEGER / ENUMERATED / BIT STRING وفقًا للمخطط ، قيمة أي نوع أساسي ، علامة DEFAULT / OPTIONAL من الدائرة ، وهي علامة على أنه تم فك تشفير الكائن تلقائيًا كما هو محدد بواسطة وبعد جم من OID وحدث ما حدث، chelovekochitaemy OID.

تم تصميم نظام الطباعة الجميل خصيصًا بحيث ينشئ سلسلة من كائنات PP التي تم تصورها بالفعل بوسائل منفصلة. تظهر لقطة الشاشة في نص ملون عادي. هناك عارضون بتنسيق JSON / HTML بحيث يمكن رؤية ذلك مع إبراز في متصفح ASN.1 كما هو الحال في مشروع asn1js .

مكتبات أخرى


لم يكن هذا هو الهدف ، ولكن PyDERASN كان أسرع بكثير من pyasn1. على سبيل المثال ، يمكن أن يستغرق فك تشفير ملفات CRL ذات أحجام الميجابايت وقتًا طويلاً بحيث يتعين عليك التفكير في التنسيقات الوسيطة لتخزين البيانات (بسرعة) وتغيير بنية التطبيقات. يقوم pyasn1 بفك تشفير CRL CACert.org على جهاز الكمبيوتر المحمول الخاص بي لأكثر من 20 دقيقة ، بينما PyDERASN في 28 ثانية فقط! هناك مشروع asn1crypto يهدف إلى العمل بسرعة مع بنيات التشفير: فك تشفير (تماما ، وليس كسول) نفس CRL في 29 ثانية ، لكنه يستهلك ما يقرب من ضعف ذاكرة الوصول العشوائي عند التشغيل تحت Python3 (983 MiB مقابل 498) ، و 3.5 مرات تحت Python2 (1677 مقابل 488) ، بينما يستهلك pyasn1 ما يصل إلى 4.3 مرات أكثر (2093 مقابل 488).

asn1crypto ، التي ذكرتها ، لم نأخذ بعين الاعتبار ، لأن المشروع كان في بدايته ، ولم نسمع عنه. الآن لن يبدؤوا في النظر في اتجاهه أيضًا ، لأنني اكتشفت على الفور أن نفس الوقت العام لا يلقي نظرة تعسفية ، وعند إجراء تسلسل ، فإنه يزيل بصمت الكسور في الثانية. هذا مقبول للعمل مع شهادات X.509 ، ولكن بشكل عام لن يعمل.

في الوقت الحالي ، PyDERASN هو أكثر أجهزة فك التشفير المجانية المعروفة ببيثون / جو دير. في مكتبة الترميز / asn1 الخاصة بـ Go المفضل لدي ، لا يوجد فحص دقيق لسلاسل معرّف الهدف وسلاسل UTCTime / GeneralizedTime. في بعض الأحيان يمكن أن تتداخل التشددات (بشكل أساسي بسبب التوافق مع الإصدارات القديمة مع التطبيقات القديمة التي لن يقوم أحد بإصلاحها) ، لذلك في PyDERASN أثناء فك التشفير ، يمكنك اجتياز اختبارات متعددة لإضعاف الإعدادات .

يحاول رمز المشروع أن يكون بسيطًا قدر الإمكان. المكتبة بأكملها هي ملف واحد. تتم كتابة الرمز مع التركيز على سهولة الفهم ، دون أداء غير ضروري وتحسينات كود DRY. كما سبق أن قلت ، لا يدعم فك تشفير BER الكامل لسلاسل UTCTime / GeneralizedTime ، وكذلك أنواع REAL و OID ذات الصلة و الخارجية و INSTANCE OF و EMBEDDED PDV و CHRACTER STRING. في جميع الحالات الأخرى ، شخصيًا ، لا أرى أي سبب لاستخدام المكتبات الأخرى في بيثون.

مثل كل مشاريعي ، مثل PyGOST و GoGOST و NNCP و GoVPN و PyDERASN ، فهي برامج مجانية تمامًا موزعة وفقًا لشروط LGPLv3 + ، وهي متاحة للتنزيل المجاني. أمثلة على الاستخدام موجودة هنا في اختبارات PyGOST .

سيرجي ماتيف ، بنك الشفرات ، عضو في مؤسسة مؤسسة المجتمع المفتوح ، بيثون / مطور برامج التطوير ، كبير المتخصصين في FSUE "STC Atlas" .

Source: https://habr.com/ru/post/ar444272/


All Articles