سؤال

تحيات،

كيف يمكنني ببساطة تشفير بعض البيانات الثنائية في نقطة ASN.1 derded؟ أنا أستخدم C/C ++ ، وأعتقد أنه يجب أن يكون من الممكن ببساطة بادئة النقطة الثنائية مع بعض البايتات المناسبة التي تشير إلى أن البيانات من نوع Octet String وهي ذات طول معين (وفي سلسلة من الطول 1 I خمن).

الخلفية إذا كنت مهتمًا:

لماذا أريد إساءة استخدام ASN.1 بهذه الطريقة؟ بالنسبة لمشروع بحثي ، أحتاج إلى تضمين بعض البيانات في توقيع رقمي يحتوي على شهادة X.509. (أنا أستخدم CreateSignatureex في مكتبة Cryptlib الخاصة بـ Peter Gutmann لإنشاء توقيعات CMS / S / MIME-2 /3 / PKCS-#7 إذا كان الأمر مهمًا. أنا لا أوقع البيانات التي أرغب في تشفيرها ، فقط إضافتها كبيانات بيانات تعريف إلى التوقيع لإثراءها.) وفقًا لفهم ، تتطلب التوقيعات الخطيرة مع بيانات التمديد التعسفي ترميز بيانات التمديد باستخدام ASN.1 der. بياناتي هي نقطة ثنائية وهي مفيدة فقط لتطبيقي ، لذلك لا توجد قيمة حقيقية في القيام بترميز ASN.1 المناسب لكل جزء من بياناتي. أعتقد مع بعض الأعمال التي يمكنني تعلمها باستخدام ASN1C للقيام بذلك ، لكنها تبدو معقدة للغاية وأنا في الموعد النهائي. بنفس القدر من الأهمية ، يبدو أنه غير ضروري ويبدو أن هذه المعلومات يمكن أن تكون مفيدة للمطورين الآخرين الذين يرغبون في تجنب آلام الترميز ASN.1 المناسب.

شكرًا!

هل كانت مفيدة؟

المحلول

أود استخدام المترجم Asn.1.

الناس يسيئون معاملة ASN.1 لأنها وسيلة لترميز هياكل البيانات. في أي وقت لديك برنامج C/C ++ يعمل مع بنية بيانات يتحكم في مشاكل مثل المهاجم ؛ يتدفق العازلة والفيضانات العددية ، ودخل في اللعب. ASN.1 ليس أكثر انعدامًا مما يتيحه أن نقول XML أو JSON أو Bencode ، لأن هذه كلها محتملة من نقاط الفشل. يمكن أن تكون هناك مشاكل في مكتبة الترميز ذاتها ، مثل هذا ضعف Microsoft. ولكن هذا البيان صحيح بغض النظر عن طريقة الترميز التي تستخدمها. يعد ASN.1 خيارًا رائعًا لأن الرسالة الناتجة صغيرة للغاية وهي الاستخدام الأكثر فعالية لمساحة أي طريقة تشفير أعرفها.

نصائح أخرى

لا يمكنك فقط إلحاق نقطة ASN.1 بشهادة X.509 وتتوقع أن تصبح جزءًا من الشهادة. الشهادة هي تسلسل ASN.1 للقيم ، وبالتالي فهي تبدأ بعلامة تسلسل وطول ، والتي تشمل جميع الشهادة.

إذا كنت ترغب في إضافة حقل إلى بنية الشهادة (مما يعني على الأرجح أنه لم يعد شهادة صالحة ، ولكن يمكن أن يكون بنية ASN.1 صالحة) ، فسيتعين عليك تغيير طول التسلسل المرفق مثل وكذلك إلحاق بياناتك.

نعم ، 04 08 01 23 45 67 89 AB CD EF هو ترميز صالح لسلسلة الثماني. 04 في البداية هي علامة Octet String و 08 هو طول السلسلة. لاحظ أن الأطوال تصل إلى 127 مشفرة في بايت واحد وأن الأطوال الكبيرة تستخدم ترميزًا أطول.

للحصول على مقدمة جيدة لـ ASN.1 - وخاصة لاستخدامها في رسائل التشفير - انظر "دليل الشخص العادي لمجموعة فرعية من ASN.1 و BER و DER" ، والتي يجب أن تكون قادرًا على العثور عليها على RSA.com موقع.

أود أن أقترح استخدام Quick der, ، وأطعمها der_pack() روتين مع وصف هيكل يمكنك تجميعه مع asn2quickder المترجم. إذا كانت مسألة استخدام بنية قياسية ، فيمكنك على الأرجح فقط #include <quick-der/rfc5280> واستخدام بياناتها المحددة مسبقًا.

يمكنك استخدام der_unpack() لتفريغ مع نفس الوصف الهيكلي. سوف تحقق صحة الجوانب الهيكلية ، على الرغم من أنها ليست القيود التي قد تتضمنها بناء الجملة ASN.1. يتم فحص نطاقات عدد صحيح عند استخدام وظائف الأداة المساعدة التي تضعها وتحصل عليها.

آسف لدفع مكتبة ONW الخاصة بي ؛ ولكن تم كتابتها بالفعل لغرض ASN.1 يمكن الوصول إليها بسهولة لمطوري C/C ++ و Python.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top