ستكون هذه المقالة مفيدة لأولئك الذين يبدأون العمل مع طابعات البطاقات ( Evolis Primacy و Smart-51 ) وبطاقات NFC المشفرة مثل Mifare Classic و Mifare DESFire EV2 . في الجزء الأول ، سنصف الانطباع العام عن العمل مع طابعات البطاقات ، بالإضافة إلى المشكلات التي واجهناها. في الجزء الثاني ، من المخطط عرض أجزاء عملية أكثر: الشفرة ، نصائح التشغيل.
1. كيف تظهر المهمة
نحن نعمل على تطوير نظام التذاكر الإلكترونية ، والذي يتضمن العمل مع بطاقات NFC. كل بطاقة NFC لديها رقم سهل الاستخدام ، ومعرف فردي. يجب طباعة الرقم على البطاقة ، وكتابة المعرّف في رقاقة NFC. كانت إحدى المهام إنشاء إنتاج مستقر لبطاقات النقل.
في المرحلة الأولى ، تم حل المشكلة بأبسط الطرق - تتم طباعة المطبوعات التي تحمل أرقام بواسطة مزود بطاقة NFC ، ويتم تسجيل المعرفات بواسطتنا باستخدام قارئات سطح المكتب والبرامج الخاصة والشخص. بعد استلام البطاقات من المورد ، يجب تسجيل البطاقة في النظام وربط البطاقة الشخصية والرقم مع بعضهما البعض. كقارئ سطح مكتب ، استخدمنا قارئ Z-2 [1].
بدت العملية بشيء من هذا القبيل:
- المشغل يلتقط بطاقة. رقم البطاقة مطبوع بالفعل على البطاقة ، لكن تسجيل البطاقة في النظام وتسجيل المعرف في رقاقة NFC مطلوب
- يضع المشغل البطاقة على قارئ Z-2 ويسجل الرقم في نظام التذاكر الإلكتروني عن طريق إدخال رقم البطاقة يدويًا. للتجميع والتسجيل ، يتم إجراء اتصال HTTPS API
- يأخذ المشغل البطاقة التالية ويفعلها مرة أخرى.
حل بسيط وسريع مع عيب واحد صغير . يؤدي تأثير العامل البشري إلى إنشاء بطاقات فانتوم لا يتوافق الرقم المطبوع على البطاقة مع معرف الارتباط - الرقم في قاعدة بيانات النظام.
لذا وُلد البيان التالي للمشكلة: من المطلوب طباعة الرقم ، وكتابة المعرف وتسجيل بطاقات NFC في النظام تلقائيًا وبأقل قدر من المشاركة البشرية.
في هذه المقالة سنصف جميع المعدات التي عملنا بها ، وجميع المزالق. في النهاية ، سنحاول تحديد المعدات التي تبدو أفضل لنا.
1.1. بطاقات NFC
استعرضنا بطاقات NFC MIFARE Classic 1K و MIFARE DESFire EV2. MIFARE Classic هو الأكثر شيوعًا والأكثر عرضة للنسخ. ومع ذلك ، فإنها لا تزال تحظى بشعبية في أماكن مثل الجامعات ووسائل النقل العام. عند التعامل مع التدفقات النقدية ، هناك حاجة إلى حل أكثر موثوقية. لذلك ، أصبحت بطاقات MIFARE DESFire EV2 بديلاً. هذا هو واحد من آخر أنواع البطاقات التي تستخدم DES ، TDES (2KTDES ، 3KTDES) ، خوارزميات تشفير AES [2 ، 3]. باختصار عن كل خريطة:
MIFARE كلاسيك
بطاقة الذاكرة هي قطاع وكتل. الوحدة الأولى من الذاكرة هي القطاع. يوجد 16 قطاعًا على الخريطة ، لكل منها 4 كتل بيانات. ذاكرة كل كتلة 16 بايت. لقراءة و / أو كتابة البيانات ، يجب على القارئ تسجيل الدخول إلى القطاع. تم تصميم كتلة خاصة واحدة في كل قطاع ، مقطع المقطورة ، لتخزين المفاتيح. بادئ ذي بدء ، للعمل مع القطاع ، تحتاج إلى تسجيل الدخول إلى كتلة المقطورة. يقوم مقطع المقطورة أيضًا بتخزين 16 بايت: 6 بايت لكل نوع مفتاح A ، 4 بايت لكل حقوق وصول ، 6 بايت لكل نوع مفتاح B.
يوضح الشكل 1 [4] القطاعات والكتل والمفاتيح بوضوح.

الشكل 1 - جهاز الذاكرة في Mifare Classic
MIFARE DESFire
يشبه جهاز البطاقة نظام الملفات. تتكون البطاقة من التطبيقات والملفات. يوجد على الخريطة تطبيق رئيسي (تطبيق) بالكود - 000000 (0x00 ، 0x00 ، 0x00). داخل التطبيق الرئيسي ، يمكنك إنشاء تطبيق جديد وإنشاء ملفات بيانات داخله.
يتم عرض خصائص بطاقات DESFire في الشكل 2 [5]. يتم تعيين كل تطبيق مفاتيح الوصول الخاصة به إلى ملفات التطبيق.

الشكل 2 - خصائص بطاقات Mifare DESFire
1.2. الطابعات كحل
لإنجاز هذه المهمة ، يتم استخدام طابعات البطاقات الخاصة. في الوقت الحالي ، هناك العديد من الشركات المختلفة التي تقدم هذه الطابعات. على سبيل المثال: Evolis و Smart و Zebra و Datacard ، إلخ. استخدمنا طابعات Evolis Primacy و Smart-51 . تشترك هذه الطابعات كثيرًا في قلب المهمة: فهي تستخدم خراطيش الشريط للطباعة ولديها مبدأ تنظيف مماثل. هناك أيضا اختلافات - تشفير NFC مختلفة. يمكن استكمال الطابعتين أو استبدالهما حسب احتياجات العميل.
يعتمد مبرمجو بطاقات NFC على المعايير ISO / IEC 14443A و ISO / IEC 7816-4 لـ DESFire و ISO / IEC 14443 Type A for Classic. ومع ذلك ، بناءً على الشركة المصنعة ، يمكن للمبرمجين إما قبول الأوامر الأصلية وفقًا للمعايير ، أو التفاف الأوامر المحلية الخاصة بمبرمج معين. نحن نواجه واحد والآخر.
الجدول 1 - مقارنة بين Evolis الأسبقية و Smart-51
2. التجارب
بشكل عام ، يمكن تقسيم العمل مع الطابعات إلى عدة أجزاء: التواصل مع الدعم الفني ، ودراسة تفاعل البطاقات وأجهزة التشفير والطباعة.
2.1. الانطباع بالدعم الفني
تضمن العمل مع الطابعات التواصل المستمر مع الدعم الفني ، لأننا كنا بحاجة إلى كتابة برنامجنا الخاص. في كلتا الحالتين ، تحدثنا أكثر مع موزعي الشركات في بلدنا والبلدان المجاورة.
لقد كان موزعو Evolis دائمًا على اتصال دائم. ومع ذلك ، على الفور تقريبا أظهرت تفاصيل القضايا الحاجة إلى التواصل مع ممثلي Evolis. لسوء الحظ ، لم يعطونا جهات اتصالهم واضطروا إلى تبادل الرسائل من خلال موزع. ومع ذلك ، كان هذا يتعلق فقط بمشكلات الطباعة ؛ فيما يتعلق بمشكلات الترميز ، تم إرسال بريد إليكتروني إلى ممثل Elyctis. التواصل المباشر مع Elyctis يبسط إلى حد كبير عملية الترميز. من الناحية الفنية البحتة ، فهمنا بعضنا البعض على الفور ولم يكن هناك سوء فهم. في حالة الطباعة ورمز الأمثلة لـ Evolis Primacy ، توقف الاتصال في مرحلة ما. في الأساس ، كان الانطباع السلبي ناتج عن اللحظات التي لم تنجح فيها أمثلة الطباعة على الوجهين واستغرق الأمر وقتًا طويلاً لإثبات ذلك. وصلت إلى تسجيلات عمليات الطباعة على الفيديو ، وبعدها اتبعت نصائح أكثر إنتاجية من Evolis.
كان أحد أحدث أسئلة الدعم الفني لشركة Evolis هو كيفية توصيل الطابعة عبر الإيثرنت. في الوقت الحالي ، نقوم بتوصيل الطابعة عبر USB بجهاز الكمبيوتر المحمول ، وهو أمر مقبول بوجود طابعات 1-2. الإجابات لا تزال تنتظر. ومع ذلك ، تم بالفعل تلقي إجابة من Elyctis تفيد بأن برنامج التشفير الخاص بالطابعة Evolis Primacy لا يوفر اتصال شبكة.
تواصل التواصل مع الدعم الفني Smart-51 أيضًا في التواصل مع ممثلي الشركة من خلال موزع. في البداية ، سارت الأمور بسلاسة. عندما يتعلق الأمر بترميز البطاقات مثل Mifare DESFire ، بدأت المشاكل. كانت الصعوبات ناجمة عن وجود فرق محددة لن تجدها على الإنترنت. لهذا السبب ، كان عليك فقط نسخ بعض الأجزاء من رمز العمل المقدم من الشركة المصنعة كمثال. ومع ذلك ، لا يؤدي النسخ الطائش إلى الخير. ونتيجة لذلك ، أمضى أسبوعان في شرح الخطأ للشركة المصنعة ، الذي كان الرجل جالسًا بجانبه بوضوح ، وليس قريبًا جدًا من تعقيدات النظام ، ولكن لديه وثائق عامة معه. بقي راسب غير سارة ، لكنها بدأت بشكل جيد للغاية.
التواصل من خلال موزع لا يوجد لديه إيجابيات ، السلبيات الصلبة. على سبيل المثال:
- ردود متأخرة ، لأن الشخص المسؤول على جانب الموزع قد يكون مشغولًا بأشياء أخرى أو يذهب في إجازة.
- عندما يكون الموزع في بلد آخر ، تكون هذه أيام عطلات إضافية ، وليست أيام عمل. في حالة Smart-51 ، تم التواصل بمشاركة أشخاص من 3 دول.
- لا تتم إعادة توجيه الردود. يتم إدراج نص الاستجابة في رسالة جديدة من الموزع. لهذا السبب ، تُفقد الملفات المرفقة في بعض الأحيان ولا تصل على الفور.
- لا يوجد يقين واضح بأن رسالتك قد وصلت إلى الشركة المصنعة دون تغيير.
يوجد أدناه جدول يحتوي على عدد الأحرف التي تشكل اتصالًا مع الدعم الفني. في الأساس ، كانت أسئلة Evolis و Smart متشابهة. على سبيل المثال ، "لماذا لا تتم طباعة لون موحد؟ هل لديك أمثلة التعليمات البرمجية في C # أو Java؟" وأسئلة أكثر تحديدًا حول سبب عدم عمل شيء كما هو متوقع.
الجدول 2 - مقارنة عدد رسائل البريد الإلكتروني مع الدعم الفني
2.2. ترميز
يحدث التواصل مع القارئ من خلال أوامر APDU. APDU (وحدة بيانات بروتوكول التطبيق) هو تنسيق قياسي للاتصال بين البطاقة والقارئ. سوف تصف هذه المقالة فرق APDU الأساسية لـ MIFARE Classic و MIFARE DESFire.
الجدول 3 - تنسيق أوامر APDU
الجدول 4 - تنسيق استجابة APDU
يمكن العثور على وصف لجميع رموز الاستجابة الممكنة هنا [6]. يمكن العثور على جهاز لتوصيل البطاقات مع القارئ في [7].
خوارزمية ترميز موجزة هي كما يلي:
- الحصول على UID للبطاقة. هذا رقم فريد ، يتم وميضه من قبل المورد ولا يتغير.
- قراءة البيانات من كل قطاع:
2.1 تسجيل الدخول إلى القطاع باستخدام المفتاح الافتراضي (0x00 أو 0xFF)
2.2 قراءة البيانات من ثلاث كتل البيانات - إذا كانت بيانات القراءة فارغة ، فانتقل إلى سجل البيانات
3.1 تسجيل الدخول إلى القطاع باستخدام المفتاح الافتراضي (0x00 أو 0xFF)
3.2 كتابة البيانات إلى ثلاث كتل بيانات القطاع
3.3 إنشاء مفتاح جديد يستند إلى UID للبطاقة
3.4 استبدل مفتاح التخويل في مقطع المقطورة بمفتاح جديد.
2.2.1. Elyctis
تستخدم الطابعة Evolis قارئ ELYCTIS CL . باستخدام مكتبة WinSCard (C ++ و C #) و jnasmartcardio (java) ، يمكنك التفاعل بسهولة مع القارئ. من أجل إنشاء برنامج بسرعة مع واجهة بسيطة إلى حد ما ، فقد تقرر كتابة التعليمات البرمجية في C # . غالبًا ما يكتب فريقنا رمزًا في Java ، مما جعل الانتقال إلى C # أقل إيلامًا. أيضا لصالح C # كان حقيقة أن ويندوز هو أكثر ملاءمة للعمل مع الطابعات.
يعرض الجدول أدناه أمثلة لأوامر APDU الأصلية التي يقبلها قارئ Elyctis.
الجدول 5 - أمثلة لأوامر APDU لـ Mifare Classic
بعد التأكد من نجاح تشفير البطاقات مثل Mifare Classic ، فقد تحولنا إلى أوامر DESFire . بالرجوع إلى [8] يمكنك العثور على أمثلة بسيطة للأوامر مع التفسيرات. ومع ذلك ، بالفعل في فريق التفويض ، واجهنا سلوكًا مثيرًا للقارئ. باختصار ، قدم القارئ التفويض الكامل نفسه. اتضح أن الدعم الفني Elyctis زودنا ببرنامج ثابت خاص تضمن ذكاء easyDESFire . من الضروري فقط تحديد خوارزمية التشفير التي يستخدمها القارئ. في حالتنا ، كان 3DES.
في الحالات العادية ، يتم التفويض من خلال تبادل عدة رسائل.
- نرسل الأمر APDU للتخويل: 0x90 0x0A 0x00 0x00 0x00 0x00 .
- اعتمادًا على الخوارزمية ، تأتي مجموعة مكونة من 8 بايتات عشوائية مُشفرة بواسطة مفتاح البطاقة استجابةً للأمر ؛ ونشير إليها بواسطة RandBEnc .
- نقوم بفك تشفير RandBEnc ونقوم بتحول بايت إلى اليسار. تشير إلى النتيجة بواسطة RandBLeft .
- نحن ننتج على جانبنا مجموعة من 8 بايت عشوائي ، RandA .
- نقوم بتجميع RandA و RandBLeft ، والتشفير باستخدام مفتاح البطاقة وإرسال الصفيف الناتج من 16 بايت.
- نحصل على استجابة مفتاح الجلسة ، وبالتالي تسجيل الدخول إلى التطبيق على الخريطة.
يمكن الاطلاع على مزيد من التفاصيل حول عملية التفويض هنا [9]. الكود الموجود في جيثب مفيد أيضا [10].
أثناء الترميز ، نشأت مشاكل مع استخدام الأوامر من المصدر [8]. بمساعدة الدعم الفني لـ Elyctis ، تلقينا الأوامر اللازمة المناسبة لذكاء easyDESFire .
أثناء الترميز على Elyctis ، تم الكشف عن مشكلة واحدة كبيرة للقارئ - تأخير الاتصال . في كثير من الأحيان ، لا تصل الإشارات إلى القارئ ، لذلك يحتاج الأمر نفسه في بعض الأحيان إلى إرسالها عدة مرات. هذا السلوك أقل شيوعًا ، لكن لا يزال يتم ملاحظته عند إرسال أوامر للطباعة. نتيجة لذلك ، يتم إرسال جميع الأوامر في حلقة ، حتى يتم التنفيذ الناجح.
2.2.2. DUALi
الشركة المصنعة يعطي SDK له للعمل مع التشفير DUALi. في مرحلة العمل مع Mifare Classic ، يمكن أخذ أوامر القراءة والكتابة من رمز القالب الذي قدمه لنا الموزعون. ومن الأمثلة على ذلك C ++ و Visual Basic و Java. ومع ذلك ، كان من الممكن ترجمة التعليمات البرمجية بالكامل في C ++ فقط. الطلب الأول للحصول على مثال لرمز C # ، تم رفضنا ، أو بالأحرى ، لا يوجد لدى الموزع واحد. لا يوجد مبرمجين C ++ واثقين في فريقنا ، لذا فإن كتابة جميع الكودات كانت معقدة للغاية بسبب أشياء بسيطة للغاية. على سبيل المثال:
- العمل مع المصفوفات
عند تمرير صفيف كمعلمة إلى دالة ، لم نمر حجم الصفيف. لتحديد طول الصفيف ، تم استخدام الدالة sizeOf (). ومع ذلك ، ترجع الدالة باستمرار حجم 4 ، بغض النظر عن الحجم الفعلي للصفيف. لم يتم تسجيل هذا السلوك على الفور ، لأن بعض الصفائف كانت بالفعل 4 في الحجم. - تكوين جميع المكتبات
كان هناك الكثير من الألم عند تثبيت جميع المناطق المحيطة اللازمة. نحن معتادون على أشياء مثل maven و apt (على Ubuntu). كان من المفترض أن يقوم برنامجنا بالاتصال بـ API الخلفية عبر طلبات HTTP وتشفير البيانات في Base64. لهذا ، تقرر استخدام مكتبات libcurl و opensl. تمت كتابة البرنامج نفسه في بيئة Microsoft Visual Studio. أطول ضجة مع تثبيت libcurl.
و SDK نفسها هي مكتبة دلل مكتوبة في C ++. بفضل مثال الكود ، قمنا بسرعة نسبيا بكتابة برنامج للتفاعل مع بطاقة Mifare Classic. كما ذكر أعلاه ، كانت أوامر APDU لـ DUALi محددة للغاية ، أي أن أول وحدتي بايت لا يتطابقان مع الأوامر التي يمكن العثور عليها على الإنترنت. لهذا السبب ، كان علي نسخها بشكل أعمى ، لأنه من حيث المبدأ ، كل شيء يعمل كما هو متوقع. تبدأ المشاكل باختبارات بطاقات DESFire.
مبدأ أوامر APDU لـ DESFire في DUALi مفهوم على الأقل. هناك وحدتي بايت لـ {CLA ، INS} ، لا يتغيران ، وفي الواقع يقولون إن الأمر مخصص لبطاقات مثل DESFire. المعلمات 1 و 2 أيضا لا تتغير. تحتوي البيانات المنقولة بالفعل على جزء من أمر DESFire الأصلي ، أي البايتات {INS ، البيانات} . لمدة أسبوع تقريبًا لم نتمكن من الحصول على الإجابات المتوقعة للأوامر البسيطة ، على سبيل المثال ، أمر "select application". في بداية التعليمة البرمجية ، تركنا تنفيذ APDU للأمر GetCardStatus ، والذي لم يكن تنسيق أمر لـ DESFire. ومع ذلك ، عملت وأصدرت بطاقات UID. كما اتضح ، بعد تنفيذ فرق GetCardStatus DESFire توقفت عن العمل. تم تحديد هذا الإغفال من قبل قواتنا ، بعد حوار دام أسبوعًا مع المورد ، والذي لم يؤد إلى أي شيء.
بعد شهر من التشغيل المستقر لبرنامجنا ، توصلنا إلى الحاجة إلى إعادة كتابة البرنامج في C #. السبب الرئيسي هو إعداد CI. تم تصنيف البرنامج C ++ باستخدام Microsoft Visual Studio. تعمل جميع الخوادم الخاصة بنا على نظام التشغيل Linux ، لذلك لم يكن من الممكن تشغيل أداة الإرساء باستخدام Windows ومجموعة أدوات Visual Studio Toolkit الضرورية. بالطبع ، يمكنك رفع جهاز افتراضي مع Windows ولا يزال تكوين كل شيء لـ C ++ ، لكنني لا أريد ذلك حقًا. بعد طلب رمز C # نموذجي من الشركة المصنعة بشكل متكرر ، تم تزويدنا بمثال. يمكنك كتابتها بنفسك ، استنادًا إلى تعريفات الطريقة في مثال واجهة C ++ ، لكن اتضح أنه لم يتم توضيح جميع الوظائف. لقد ساعد المثال كثيرًا وفي النهاية ، أعدنا كتابة البرنامج في C # وقمنا بإعداد CI.
2.3. طباعة
للوهلة الأولى ، يبدو أن الطباعة يجب ألا تسبب مشاكل ، لأننا في البداية نستخدم طابعات الطباعة. , , .
. , , .
2.3.1. Evolis Primacy
JSON , HTTP . Evolis Services Provider, . 8 :
- : , , . .
- 4-6, . . . . SDK, . .
:
.
.
. , . . , . . . , , , 3.

3 —
3 .
, . . QR-. , QR- . , , 4 6 .
, Evolis , Evolis Print Center, , , . .
2.3.2. Smart-51
, SmartID, . , Evolis. :
- , .
- , .
, . Smart-51. :
- , .
- , QR-
, User Manuals . , , .
2.3.3.
, . , , . . . , .
Evolis Primacy 100 , 0,76 . , 86 . Smart-51 100 , . , .
3.
. . . 17 . .

أ)

ب)
4 — : — , —
4.
NFC -. , .. . Smart-51 Evolis Primacy. Evolis , . Smart-51 . Smart-51 Evolis. , . Evolis Primacy , . . Smart-51 . , .
, .. . , .
مراجع
- https://ironlogic.ru/il.nsf/htm/ru_z2usb
- https://www.nxp.com/products/rfid-nfc/mifare-hf/mifare-desfire/mifare-desfire-ev2:MIFARE_DESFIRE_EV2_2K_8K
- https://www.nxp.com/docs/en/data-sheet/MF3DX2_MF3DHX2_SDS.pdf
- https://www.nxp.com/docs/en/data-sheet/MF1S50YYX_V1.pdf
- https://www.nxp.com/docs/en/data-sheet/MF3DX2_MF3DHX2_SDS.pdf
- https://www.eftlab.com/knowledge-base/complete-list-of-apdu-responses/
- Advanced Card Systems Guide http://downloads.acs.com.hk/drivers/en/API-ACR122U-2.02.pdf
- Mifare Desfire communication example https://ridrix.wordpress.com/2009/09/19/mifare-desfire-communication-example/
- Mifare DESFire Data Sheet http://neteril.org/files/M075031_desfire.pdf
- GitHub DESFire https://github.com/EsupPortail/esup-nfc-tag-server/blob/master/src/main/java/nfcjlib/core/DESFireEV1.java