Expérience avec les imprimantes à cartes, partie 1

Cet article sera utile pour ceux qui commencent à travailler avec des imprimantes à cartes ( Evolis Primacy et Smart-51 ) et des cartes codées NFC comme Mifare Classic et Mifare DESFire EV2 . Dans la première partie, nous décrirons l'impression générale de travailler avec des imprimantes à cartes, ainsi que les problèmes auxquels nous avons dû faire face. Dans la deuxième partie, il est prévu de montrer des parties plus pratiques: code, conseils d'utilisation.


1. Comment la tâche est-elle apparue


Nous développons un système de billetterie électronique, qui comprend l'utilisation de cartes NFC. Chaque carte NFC possède un numéro convivial et un identifiant individuel. Le numéro doit être imprimé sur la carte et l' ID est écrit sur la puce NFC. L'une des tâches consistait à établir une production stable de cartes de transport.


À la première étape, le problème a été résolu de la manière la plus simple: les impressions avec des numéros sont imprimées par le fournisseur de cartes NFC et les identifiants sont enregistrés par nous à l'aide de lecteurs de bureau, de logiciels spéciaux et de personnes. Après avoir reçu les cartes du fournisseur, il est nécessaire d'enregistrer la carte dans le système et d'associer l' ID et le numéro les uns aux autres. En tant que lecteur de bureau, nous avons utilisé le lecteur Z-2 [1].


Le processus ressemblait à ceci:


  • L'opérateur prend une carte. Le numéro de carte est déjà imprimé sur la carte, mais l'enregistrement de la carte dans le système et l'enregistrement de l' ID dans la puce NFC est requis
  • L'opérateur place la carte sur le lecteur Z-2 et enregistre le numéro dans le système de billetterie électronique en saisissant manuellement le numéro de carte. Pour le regroupement et l'enregistrement, un appel à l'API HTTPS est effectué
  • L'opérateur prend la carte suivante et la fait à nouveau.

Une solution simple et rapide avec un petit inconvénient. L'influence du facteur humain génère des cartes fantômes pour lesquelles le numéro imprimé sur la carte ne correspond pas à l' ID de lien - numéro dans la base de données système.


Ainsi, l'énoncé suivant du problème est né: il est nécessaire d'imprimer le numéro , de noter l' ID et d'enregistrer les cartes NFC dans le système de manière atomique et avec une implication humaine minimale.


Dans cet article, nous décrirons tout l'équipement avec lequel nous avons travaillé et tous les pièges. Au final, nous essaierons de dire quel équipement nous semble le mieux.


1.1. Cartes NFC


Nous avons examiné les cartes NFC MIFARE Classic 1K et MIFARE DESFire EV2. MIFARE Classic est le plus courant et le plus vulnérable à la copie. Cependant, ils continuent d'être populaires dans des endroits comme les universités et les transports publics. Lors de la gestion des flux de trésorerie, une solution plus fiable est nécessaire. Les cartes MIFARE DESFire EV2 sont donc devenues une alternative. Il s'agit de l'un des derniers types de cartes utilisant des algorithmes de cryptage DES, TDES (2KTDES, 3KTDES) et AES [2, 3]. En bref sur chaque carte:


MIFARE Classic


La carte mémoire est un secteur et des blocs. La première unité de mémoire est un secteur. Il y a 16 secteurs sur la carte, chacun ayant 4 blocs de données. La mémoire de chaque bloc est de 16 octets. Pour lire et / ou écrire des données, le lecteur doit se connecter au secteur. Un bloc spécial dans chaque secteur, le bloc de remorque, est conçu pour stocker les clés. Tout d'abord, pour travailler avec le secteur, vous devez vous connecter au bloc remorque. Le bloc de remorque stocke également 16 octets: 6 octets par type de clé A, 4 octets par droit d'accès, 6 octets par type de clé B.


La figure 1 [4] montre clairement les secteurs, les blocs et les clés.




Figure 1 - Périphérique mémoire dans Mifare Classic


MIFARE DESFire


Le périphérique de carte ressemble à un système de fichiers. La carte se compose d'applications et de fichiers. Sur la carte, il y a une application principale (application) avec l'ID - 000000 (0x00, 0x00, 0x00). À l'intérieur de l'application principale, vous pouvez créer une nouvelle application et créer des fichiers de données à l'intérieur.
Les caractéristiques des cartes DESFire sont présentées dans la figure 2 [5]. Chaque application se voit attribuer ses propres clés d'accès aux fichiers d'application.



Figure 2 - Caractéristiques des cartes Mifare DESFire


1.2. Les imprimantes comme solution


Pour accomplir cette tâche, des imprimantes de cartes spéciales sont utilisées. À l'heure actuelle, il existe de nombreuses sociétés différentes qui fournissent ces imprimantes. Par exemple: Evolis, Smart, Zebra, Datacard, etc. Nous avons utilisé les imprimantes Evolis Primacy et Smart-51 . Ces imprimantes ont beaucoup en commun au cœur du travail: elles utilisent toutes deux des cartouches de bande pour l'impression et ont un principe de nettoyage similaire. Il existe également des différences - différents encodeurs NFC. Les deux imprimantes peuvent être complétées ou remplacées en fonction des besoins du client.


Les programmateurs pour cartes NFC s'appuient sur les normes ISO / IEC 14443A et ISO / IEC 7816-4 pour DESFire, ISO / IEC 14443 Type A pour Classic. Cependant, selon le fabricant, les programmeurs peuvent soit accepter des commandes natives conformément aux normes, soit encapsuler les commandes natives spécifiquement pour un programmeur particulier. Nous sommes face à l'un et à l'autre.


Primauté d'EvolisSmart-51
ImprimerLe ruban est utilisé pour l'impression (couleur ou monochrome). Une cassette de bande entière est fournie.Le ruban est utilisé pour l'impression (couleur ou monochrome). Seule la bande est fournie, une cartouche et est livrée avec l'imprimante elle-même. Un rouleau de nettoyage est inclus avec le ruban.
EncodeurEncodeur Elyctis. Facile à utiliser car prend en charge l'interaction avec les bibliothèques Windows par défaut pour la communication avec les cartes NFC, winscard.Encodeur DUALi. Le support technique fournit un SDK spécial pour travailler avec l'encodeur.
Le nettoyagePour maintenir l'imprimante en état de fonctionnement, elle nécessite un nettoyage constant. Il existe deux types de nettoyage: périodique (après chaque 1000 cartes) et étendu (après 5000 cartes). Le respect du programme de nettoyage est une condition préalable à l'accord de garantie.Le nettoyage est requis après l'utilisation du ruban imprimé. Selon le type de bande et la taille de l'image à imprimer, un nettoyage sera nécessaire après 2 à 4 000 cartes.
LogementLe boîtier en plastique permet à l'imprimante d'être assez légère. L'intérieur est facilement accessible, car les parois de l'imprimante s'ouvrent des deux côtés.Le boîtier métallique rend l'imprimante fiable pour son fonctionnement. Certains entrailles ne sont visibles qu'en ouvrant le capot supérieur.
LogicielsLivré avec le logiciel spécial "Evolis Print Center" et CardPresso. Le premier est nécessaire pour les paramètres de l'imprimante, équipé de divers assistants. Le second logiciel vous permet de tester rapidement les capacités de l'imprimante pour l'impression et l'encodage.Aucun logiciel distinct pour contrôler l'imprimante n'est requis. Assez de propriétés d'imprimante dans la liste des périphériques Windows. Livré avec le logiciel SmartID pour l'impression et l'encodage.

Tableau 1 - Comparaison d'Evolis Primacy et de Smart-51

2. Expériences


En général, le travail avec les imprimantes peut être divisé en plusieurs parties: communication avec le support technique, étude de l'interaction des cartes et des encodeurs, impression.


2.1. Impression de support technique


Le travail avec les imprimantes comprenait une communication constante avec le support technique, car nous devions écrire notre propre logiciel. Dans les deux cas, nous avons davantage parlé avec les distributeurs d'entreprises de notre pays et des pays voisins.


Les distributeurs Evolis sont pour la plupart toujours en contact. Cependant, presque immédiatement, les détails des problèmes ont montré la nécessité d'une communication avec les représentants d'Evolis. Malheureusement, ils ne nous ont pas communiqué leurs contacts et ont dû échanger des messages via un distributeur. Cependant, cela ne concernait que les problèmes d'impression; pour les problèmes de codage, nous avons reçu le courrier d'un représentant Elyctis. La communication directe avec Elyctis a grandement simplifié le processus d'encodage. Purement technique, nous nous sommes immédiatement compris et il n'y a pas eu de malentendu. Dans le cas des exemples d'impression et de code pour Evolis Primacy, la communication s'est à un moment donné arrêtée. Fondamentalement, l'impression négative a été faite par les moments où les exemples d'impression recto verso ne fonctionnaient pas pour nous et il a fallu beaucoup de temps pour le prouver. Je suis arrivé aux enregistrements des processus d'impression sur vidéo, après quoi des conseils plus productifs d'Evolis ont suivi.


L'une des dernières questions du support technique Evolis était de savoir comment connecter l'imprimante via Ethernet. Pour le moment, nous connectons l'imprimante via USB à l'ordinateur portable, ce qui est tolérable en présence de 1-2 imprimantes. Les réponses attendent toujours. Cependant, une réponse a déjà été reçue d'Elyctis que leur encodeur pour l'imprimante Evolis Primacy ne fournit pas de connexion réseau.


Communiquer avec le support technique Smart-51 se résumait également à communiquer avec les représentants de l'entreprise via un distributeur. Au tout début, tout s'est bien passé. Quand il s'agissait d'encoder des cartes comme Mifare DESFire, des problèmes ont commencé. Des difficultés ont été causées par des équipes spécifiques que vous ne trouverez pas sur Internet. Pour cette raison, il vous suffisait de copier certaines parties du code de travail fourni par le fabricant à titre d'exemple. Cependant, une copie irréfléchie ne mène pas au bien. En conséquence, deux semaines ont été passées à expliquer l'erreur au fabricant, du côté duquel l'homme était clairement assis, pas très proche des subtilités du système, mais avec lui une documentation générale. Un précipité désagréable est resté, mais il a très bien commencé.


La communication par le biais d'un distributeur n'a aucun avantage, aucun inconvénient solide. Par exemple:


  1. Réponses différées, car la personne responsable du côté du distributeur peut être occupée à d'autres choses ou partir en vacances.
  2. Lorsque le distributeur se trouve dans un autre pays, il s'agit donc de jours fériés supplémentaires et non de jours ouvrables. Dans le cas de Smart-51, la communication a eu lieu avec la participation de personnes de 3 pays.
  3. Les réponses ne sont pas transmises. Le texte de la réponse est inséré dans une nouvelle lettre du distributeur. Pour cette raison, les fichiers joints sont parfois perdus et n'atteignent pas immédiatement.
  4. Il n'y a aucune certitude claire que votre message a atteint le fabricant inchangé.

Vous trouverez ci-dessous un tableau avec le nombre de lettres qui ont constitué la communication avec l'assistance technique. Fondamentalement, les questions pour Evolis et Smart étaient à peu près les mêmes. Par exemple, "Pourquoi l'impression n'est-elle pas d'une couleur uniforme? Avez-vous des exemples de code en C # ou Java?" et des questions plus spécifiques sur les raisons pour lesquelles quelque chose ne fonctionne pas comme prévu.


EvolisElyctisSmart-51
Nombre de lettres973761

Tableau 2 - Comparaison du nombre d'e-mails avec le support technique

2.2. Encodage


La communication avec le lecteur se fait via les commandes APDU. APDU (Application Protocol Data Unit) est un format standard pour la communication entre une carte et un lecteur. Cet article décrira les équipes APDU de base pour MIFARE Classic et MIFARE DESFire.


Le titreLa tailleLa description
CLA1 octetOctets de classe
Ins1 octetOctet d'instruction
P11 octetParamètre 1
P21 octetParamètre 2
Longueur des données1 octetTaille des données transmises
Les données...Données transmises
Longueur de données attendue1 octetLa taille des données attendues dans la réponse

Tableau 3 - Format des commandes APDU
Le titreLa tailleLa description
SW11 octetCode d'erreur ou de réussite courant
SW21 octetCode d'erreur détaillé
Les données...Renvoyer les données

Tableau 4 - Format de réponse APDU

Une description de tous les codes de réponse possibles peut être trouvée ici [6]. Un dispositif pour communiquer des cartes avec un lecteur peut être trouvé à [7].


Un bref algorithme de codage est le suivant:


  1. Obtenez l'UID de la carte. Il s'agit d'un numéro unique, il est flashé par le fournisseur et ne change pas.
  2. Lisez les données de chaque secteur:
    2.1 Connectez-vous au secteur à l'aide de la clé par défaut (0x00 ou 0xFF)
    2.2 Lire les données de trois blocs de données
  3. Si les données lues sont vides, accédez à l'enregistrement de données
    3.1 Connectez-vous au secteur à l'aide de la clé par défaut (0x00 ou 0xFF)
    3.2 Écrire des données dans trois blocs de données sectoriels
    3.3 Créer une nouvelle clé basée sur l'UID de la carte
    3.4 Remplacez la clé d'autorisation dans le bloc de fin par une nouvelle clé.

2.2.1. Elyctis


L'imprimante Evolis utilise un lecteur ELYCTIS CL . En utilisant la bibliothèque WinSCard (C ++ et C #) et jnasmartcardio (java), vous pouvez facilement interagir avec le lecteur. Afin de créer rapidement un logiciel avec une interface assez simple, il a été décidé d'écrire du code en C # . Généralement, notre équipe écrit du code en Java, ce qui a rendu la transition vers C # moins pénible. Egalement en faveur de C #, le fait que Windows est plus adapté pour travailler avec des imprimantes.


Le tableau ci-dessous montre des exemples de commandes APDU natives acceptées par le lecteur Elyctis.


La descriptionLes donnéesAPDU
Obtention d'une carte UID-0xFF 0xCA 0x00 0x00 0x00
Chargement de la clé d'autorisation dans la mémoire du lecteurTouche 6 octetsUn exemple de chargement d'une clé par défaut. 0xFF 0x82 0x20 0x00 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Se connecterNuméro de bloc d'autorisation de secteur (3e bloc de secteur) et type de clé (A - 0x60 ou B - 0x61)Un exemple d'autorisation au secteur 1. Les numéros de bloc de ce secteur sont 4-7, le bloc de fin est le numéro 7. 0xFF 0x86 0x00 0x00 0X05 0x01 0x00 0x07 0X60 0x00 0x00
Lecture des données d'un bloc-Un exemple de lecture des données du bloc 4 (1er bloc du secteur 1). Le numéro de secteur est entré dans le paramètre 2. 0xFF 0xB0 0x00 0x04 0x00 0x10
Écriture de données dans le bloc16 octets de donnéesUn exemple d'écriture de données dans le bloc 4. 0xFF 0xD6 0x00 0x04 0x10 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 0x00

Tableau 5 - Exemples de commandes APDU pour Mifare Classic

Après avoir vérifié que l'encodage des cartes comme Mifare Classic a réussi, nous sommes passés aux commandes pour DESFire . Par référence [8], vous pouvez trouver des exemples simples de commandes avec des explications. Cependant, déjà dans l'équipe d'autorisation, nous sommes tombés sur un comportement de lecteur intéressant. Bref, le lecteur a lui-même fait pleine autorisation. Il s'est avéré que le support technique d'Elyctis nous a fourni un firmware spécial qui comprenait l' intelligence easyDESFire . Il suffit de déterminer l'algorithme de chiffrement utilisé par le lecteur. Dans notre cas, c'était 3DES.


Dans des cas normaux, l'autorisation est effectuée en échangeant plusieurs messages.


  1. Nous envoyons la commande APDU pour autorisation: 0x90 0x0A 0x00 0x00 0x00 0x00 .
  2. Selon l'algorithme, un tableau de 8 octets aléatoires encodés par la clé de la carte vient en réponse à la commande; nous le désignons par RandBEnc .
  3. Nous déchiffrons RandBEnc et faisons un décalage d'octet vers la gauche. Notons le résultat de RandBLeft .
  4. Nous générons de notre côté un tableau de 8 octets aléatoires, RandA .
  5. Nous regroupons RandA et RandBLeft , chiffrons avec la clé de la carte et envoyons le tableau résultant de 16 octets.
  6. Nous obtenons la clé de session en réponse, nous connectant ainsi à l'application sur la carte.

Plus de détails sur le processus d'autorisation peuvent être trouvés ici [9]. Le code du github est également très utile [10].


Pendant l'encodage, des problèmes sont survenus avec l'utilisation des commandes de la source [8]. Avec l'aide du support technique d'Elyctis, nous avons reçu les commandes nécessaires adaptées à l' intelligence easyDESFire .


Lors de l'encodage sur Elyctis, un gros problème du lecteur a été révélé - le retard de communication . Très souvent, les signaux n'atteignent pas le lecteur, de sorte que la même commande doit parfois être envoyée plusieurs fois. Ce comportement est moins courant, mais est toujours remarqué lors de l'envoi de commandes d'impression. Par conséquent, l'envoi de toutes les commandes a lieu dans une boucle, jusqu'à l'exécution réussie.


2.2.2. DUALi


Le fabricant donne son SDK pour travailler avec un encodeur DUALi. Au stade de travailler avec Mifare Classic, les commandes de lecture et d'écriture pouvaient être extraites du code modèle que les distributeurs nous avaient donné. Les exemples étaient en C ++, Visual Basic, Java. Cependant, il était possible de compiler entièrement le code uniquement en C ++. A la première demande d'un exemple de code C #, on nous a refusé, ou plutôt, le distributeur n'en a pas. Il n'y a pas de programmeurs C ++ confiants dans notre équipe, donc écrire tout le code a été grandement compliqué par des choses assez simples. Par exemple:


  1. Travailler avec des tableaux
    Lors du passage d'un tableau en tant que paramètre à une fonction, nous n'avons pas transmis la taille du tableau. Pour déterminer la longueur du tableau, la fonction sizeOf () a été utilisée. Cependant, la fonction a constamment renvoyé une taille de 4, quelle que soit la taille réelle du tableau. Ce comportement n'a pas été immédiatement enregistré, car certains tableaux étaient en effet de taille 4.
  2. Configurer toutes les bibliothèques
    Beaucoup de douleur a été ressentie lors de l'installation de tous les environnements nécessaires. Nous sommes trop habitués à des choses comme maven et apt (sur Ubuntu). Notre programme était censé appeler l'API backend via des requêtes HTTP et crypter les données en Base64. Pour cela, il a été décidé d'utiliser les bibliothèques libcurl et openssl. L'écriture du programme lui-même a eu lieu dans l'environnement Microsoft Visual Studio. La plus longue histoire avec l'installation de libcurl.

Le SDK lui-même est une bibliothèque de DLL écrite en C ++. Grâce à l'exemple de code, nous avons écrit assez rapidement un programme pour interagir avec la carte Mifare Classic. Comme mentionné ci-dessus, les commandes APDU pour DUALi étaient très spécifiques, à savoir que les deux premiers octets ne correspondaient pas à ceux qui peuvent être trouvés sur Internet. Pour cette raison, j'ai dû les copier à l'aveugle, car, en principe, tout fonctionne comme prévu. Les problèmes commencent par les tests avec les cartes DESFire.


Le principe des commandes APDU pour DESFire dans DUALi est au moins compréhensible. Il y a deux octets pour {CLA, INS} , ils ne changent pas, et en fait ils disent que la commande est destinée à des cartes comme DESFire. Les paramètres 1 et 2 ne changent pas non plus. Les données transmises contiennent déjà une partie de la commande native DESFire, à savoir les octets {INS, Data} . Pendant environ une semaine, nous n'avons pas pu obtenir les réponses attendues aux commandes simples, par exemple, la commande "sélectionner l'application". Au tout début du code, nous avons laissé l'exécution APDU de la commande GetCardStatus, qui n'était pas un format de commande pour DESFire. Cependant, elle a travaillé et délivré des cartes UID. Il s'est avéré que, après l'exécution de GetCardStatus DESFire, les équipes ont cessé de fonctionner. Cette omission a été déterminée par nos forces, après un dialogue d'une semaine avec le fournisseur, qui n'a abouti à rien.


Après un mois de fonctionnement stable de notre programme, nous sommes arrivés à la nécessité de réécrire le programme en C #. La principale raison était la mise en place de CI. Le programme C ++ a été compilé à l'aide de Microsoft Visual Studio. Tous nos serveurs fonctionnent sous Linux, donc le lancement du docker avec Windows et le nécessaire Visual Studio ToolKit n'était pas possible. Bien sûr, vous pouvez créer une machine virtuelle avec Windows et tout configurer pour C ++, mais je ne voulais pas vraiment. Après avoir demandé à plusieurs reprises un exemple de code C # au fabricant, nous avons reçu un exemple. Vous pouvez l'écrire vous-même, sur la base des définitions de méthode dans l'exemple d'interface C ++, mais il s'est avéré que toutes les fonctions n'étaient pas décrites. L'exemple a beaucoup aidé et à la fin nous avons réécrit le programme en C # et mis en place CI.


2.3. Imprimer


À première vue, il semble que l'impression ne devrait pas poser de problèmes, car nous utilisons en premier lieu des imprimantes d'impression. , , .


. , , .


2.3.1. Evolis Primacy


JSON , HTTP . Evolis Services Provider, . 8 :


  1. : , , . .

- 4-6, . . . . SDK, . .
:



  1. .

  2. .

. , . . , . . . , , , 3.


drawing

3 —


3 .


, . . QR-. , QR- . , , 4 6 .


, Evolis , Evolis Print Center, , , . .


2.3.2. Smart-51


, SmartID, . , Evolis. :


  1. , .
  2. , .

, . Smart-51. :


  1. , .
  2. , QR-

, User Manuals . , , .


2.3.3.


, . , , . . . , .


Evolis Primacy 100 , 0,76 . , 86 . Smart-51 100 , . , .


3.


. . . 17 . .


,,Total
Evolis Primacy≈ 10≈ 10≈ 20
Smart-51≈ 17≈ 6≈ 23

drawing

)


drawing

)
4 — : — , —


4.


NFC -. , .. . Smart-51 Evolis Primacy. Evolis , . Smart-51 . Smart-51 Evolis. , . Evolis Primacy , . . Smart-51 . , .


, .. . , .


Les références


  1. https://ironlogic.ru/il.nsf/htm/ru_z2usb
  2. https://www.nxp.com/products/rfid-nfc/mifare-hf/mifare-desfire/mifare-desfire-ev2:MIFARE_DESFIRE_EV2_2K_8K
  3. https://www.nxp.com/docs/en/data-sheet/MF3DX2_MF3DHX2_SDS.pdf
  4. https://www.nxp.com/docs/en/data-sheet/MF1S50YYX_V1.pdf
  5. https://www.nxp.com/docs/en/data-sheet/MF3DX2_MF3DHX2_SDS.pdf
  6. https://www.eftlab.com/knowledge-base/complete-list-of-apdu-responses/
  7. Advanced Card Systems Guide http://downloads.acs.com.hk/drivers/en/API-ACR122U-2.02.pdf
  8. Mifare Desfire communication example https://ridrix.wordpress.com/2009/09/19/mifare-desfire-communication-example/
  9. Mifare DESFire Data Sheet http://neteril.org/files/M075031_desfire.pdf
  10. GitHub DESFire https://github.com/EsupPortail/esup-nfc-tag-server/blob/master/src/main/java/nfcjlib/core/DESFireEV1.java

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


All Articles