Experiencia con impresoras de tarjetas, parte 1

Este artículo será útil para aquellos que comienzan a trabajar con impresoras de tarjetas ( Evolis Primacy y Smart-51 ) y tarjetas codificadas con NFC como Mifare Classic y Mifare DESFire EV2 . En la primera parte describiremos la impresión general de trabajar con impresoras de tarjetas, así como los problemas que tuvimos que enfrentar. En la segunda parte, se planea mostrar partes más prácticas: código, consejos de operación.


1. ¿Cómo apareció la tarea?


Estamos desarrollando un sistema de tickets electrónicos, que incluye trabajar con tarjetas NFC. Cada tarjeta NFC tiene un número fácil de usar y una identificación individual. El número debe estar impreso en la tarjeta y la identificación está escrita en el chip NFC. Una de las tareas era establecer una producción estable de tarjetas de transporte.


En la primera etapa, el problema se resolvió de la manera más simple: el proveedor de la tarjeta NFC imprime las impresiones con Números , y nosotros registramos las ID utilizando lectores de escritorio, software especial y una persona. Después de recibir las tarjetas del proveedor, es necesario registrar la tarjeta en el sistema y asociar la identificación y el número entre sí. Como lector de escritorio, utilizamos el lector Z-2 [1].


El proceso se parecía a esto:


  • El operador recoge una tarjeta. El número de la tarjeta ya está impreso en la tarjeta, pero se requiere el registro de la tarjeta en el sistema y el registro de la identificación en el chip NFC
  • El operador coloca la tarjeta en el Lector Z-2 y registra el Número en el sistema de tickets electrónicos ingresando manualmente el Número de Tarjeta. Para la agrupación y el registro, se realiza una llamada a la API HTTPS
  • El operador toma la siguiente tarjeta y la vuelve a hacer.

Una solución simple y rápida con un pequeño inconveniente. La influencia del factor humano genera tarjetas fantasma para las cuales el Número impreso en la tarjeta no corresponde al ID de enlace - Número en la base de datos del sistema.


Así nació la siguiente declaración del problema: se requiere imprimir el Número , escribir la ID y registrar las tarjetas NFC en el sistema atómicamente y con una mínima participación humana.


En este artículo describiremos todo el equipo con el que trabajamos, y todos los escollos. Al final, trataremos de decir qué equipo nos parece mejor.


1.1. Tarjetas NFC


Revisamos las tarjetas NFC MIFARE Classic 1K y MIFARE DESFire EV2. MIFARE Classic es el más común y más vulnerable para copiar. Sin embargo, siguen siendo populares en lugares como universidades y transporte público. Cuando se manejan flujos de efectivo, se necesita una solución más confiable. Por lo tanto, las tarjetas MIFARE DESFire EV2 se convirtieron en una alternativa. Este es uno de los últimos tipos de tarjetas que utilizan DES, TDES (2KTDES, 3KTDES), algoritmos de cifrado AES [2, 3]. Brevemente sobre cada mapa:


MIFARE Classic


La tarjeta de memoria es un sector y bloques. La primera unidad de memoria es un sector. Hay 16 sectores en el mapa, cada uno de los cuales tiene 4 bloques de datos. La memoria de cada bloque es de 16 bytes. Para leer y / o escribir datos, el lector debe iniciar sesión en el sector. Un bloque especial en cada sector, el bloque de remolque, está diseñado para almacenar llaves. En primer lugar, para trabajar con el sector, debe iniciar sesión en el bloque de tráiler. El bloque de avance también almacena 16 bytes: 6 bytes por clave tipo A, 4 bytes por derechos de acceso, 6 bytes por clave tipo B.


La Figura 1 [4] muestra claramente los sectores, bloques y claves.




Figura 1 - Dispositivo de memoria en Mifare Classic


MIFARE DESFire


El dispositivo de tarjeta se parece a un sistema de archivos. La tarjeta consta de aplicaciones y archivos. En el mapa hay una aplicación principal (aplicación) con id - 000000 (0x00, 0x00, 0x00). Dentro de la aplicación principal, puede crear una nueva aplicación y crear archivos de datos dentro de ella.
Las características de las tarjetas DESFire se presentan en la Figura 2 [5]. A cada aplicación se le asignan sus propias claves de acceso a los archivos de la aplicación.



Figura 2 - Características de las tarjetas Mifare DESFire


1.2. Impresoras como solución


Para realizar esta tarea, se utilizan impresoras de tarjetas especiales. En este momento hay muchas compañías diferentes que suministran estas impresoras. Por ejemplo: Evolis, Smart, Zebra, Datacard, etc. Utilizamos las impresoras Evolis Primacy y Smart-51 . Estas impresoras tienen mucho en común en el corazón del trabajo: ambas usan cartuchos de cinta para imprimir y tienen un principio de limpieza similar. También hay diferencias: diferentes codificadores NFC. Ambas impresoras se pueden complementar o reemplazar según las necesidades del cliente.


Los programadores para tarjetas NFC se basan en los estándares ISO / IEC 14443A e ISO / IEC 7816-4 para DESFire, ISO / IEC 14443 Tipo A para Classic. Sin embargo, dependiendo del fabricante, los programadores pueden aceptar comandos nativos de acuerdo con los estándares o ajustar los comandos nativos en forma específica para un programador en particular. Nos enfrentamos con uno y el otro.


Evolución primacíaSmart-51
ImprimirLa cinta se utiliza para imprimir (color o monocromo). Se suministra un casete de cinta completo.La cinta se utiliza para imprimir (color o monocromo). Solo se suministra cinta, un cartucho y viene con la propia impresora. Se incluye un rodillo de limpieza con la cinta.
CodificadorElyctis Encoder. Fácil de usar porque admite la interacción con las bibliotecas predeterminadas de Windows para la comunicación con tarjetas NFC, winscard.Codificador DUALi. El soporte técnico proporciona un SDK especial para trabajar con el codificador.
LimpiezaPara mantener la impresora en condiciones de funcionamiento, requiere una limpieza constante. Hay dos tipos de limpieza: periódica (después de cada 1000 tarjetas) y extendida (después de 5000 tarjetas). El cumplimiento del programa de limpieza es un requisito previo en el acuerdo de garantía.Se requiere limpieza después de usar la cinta impresa. Dependiendo del tipo de cinta y el tamaño de la imagen para imprimir, se requerirá limpieza después de 2-4 mil tarjetas.
ViviendaLa carcasa de plástico permite que la impresora sea bastante ligera. Se puede acceder fácilmente a los interiores porque las paredes de la impresora se abren por ambos lados.La carcasa metálica hace que la impresora sea confiable para la operación. Algunas entrañas solo se pueden ver abriendo la cubierta superior.
SoftwareViene con el software especial "Evolis Print Center" y CardPresso. El primero es necesario para la configuración de la impresora, equipado con varios ayudantes. El segundo software le permite probar rápidamente las capacidades de la impresora para imprimir y codificar.No se requiere un software separado para controlar la impresora. Suficientes propiedades de impresora en la lista de dispositivos Windows. Viene con el software SmartID para imprimir y codificar.

Tabla 1 - Comparación de Evolis Primacy y Smart-51

2. Experimentos


En general, el trabajo con impresoras se puede dividir en varias partes: comunicación con soporte técnico, estudio de la interacción de tarjetas y codificadores, impresión.


2.1. Impresión de soporte técnico.


El trabajo con impresoras incluía comunicación constante con soporte técnico, ya que necesitábamos escribir nuestro propio software. En ambos casos, hablamos más con distribuidores de empresas en nuestro país y países vecinos.


Los distribuidores de Evolis siempre han estado siempre en contacto. Sin embargo, casi de inmediato los detalles de los problemas mostraron la necesidad de comunicarse con los representantes de Evolis. Desafortunadamente, no nos dieron sus contactos y tuvieron que intercambiar mensajes a través de un distribuidor. Sin embargo, esto solo se refería a problemas de impresión; en cuestiones de codificación, nos dieron el correo de un representante de Elyctis. La comunicación directa con Elyctis simplificó enormemente el proceso de codificación. Puramente técnicamente, nos entendimos de inmediato y no hubo malentendidos. En el caso de los ejemplos de impresión y código para Evolis Primacy, la comunicación en algún momento se detuvo. Básicamente, la impresión negativa fue causada por los momentos en que los ejemplos de impresión a doble cara no funcionaron para nosotros y tomó mucho tiempo probarlo. Llegué a las grabaciones de los procesos de impresión en video, después de lo cual siguieron consejos más productivos de Evolis.


Una de las últimas preguntas de soporte técnico de Evolis fue cómo conectar la impresora a través de Ethernet. En este momento, estamos conectando la impresora a través de USB a la computadora portátil, lo cual es tolerable en presencia de 1-2 impresoras. Las respuestas aún están esperando. Sin embargo, Elyctis ya recibió una respuesta de que su codificador para la impresora Evolis Primacy no proporciona una conexión de red.


La comunicación con el soporte técnico de Smart-51 también se redujo a comunicarse con los representantes de la compañía a través de un distribuidor. Al principio, todo salió bien. Cuando se trataba de codificar tarjetas como Mifare DESFire, comenzaron los problemas. Las dificultades fueron causadas por equipos específicos que no encontrarás en Internet. Por esta razón, solo tenía que copiar algunas partes del código de trabajo proporcionado por el fabricante como ejemplo. Sin embargo, la copia irreflexiva no conduce al bien. Como resultado, pasaron dos semanas explicando el error al fabricante, en cuyo lado el hombre estaba sentado claramente, no muy cerca de las complejidades del sistema, pero con documentación general con él. Quedó un precipitado desagradable, pero comenzó muy bien.


La comunicación a través de un distribuidor no tiene ventajas, desventajas sólidas. Por ejemplo:


  1. Retraso en las respuestas, porque la persona responsable del lado del distribuidor puede estar ocupada con otras cosas o irse de vacaciones.
  2. Cuando el distribuidor se encuentra en otro país, estos son días festivos adicionales, por lo tanto, no son días hábiles. En el caso de Smart-51, la comunicación se realizó con la participación de personas de 3 países.
  3. Las respuestas no se reenvían. El texto de respuesta se inserta en una nueva carta del distribuidor. Por esta razón, a veces los archivos adjuntos se pierden y no llegan de inmediato.
  4. No hay una certeza clara de que su mensaje haya llegado al fabricante sin cambios.

A continuación se muestra una tabla con el número de letras que conformaron la comunicación con el soporte técnico. Básicamente, las preguntas para Evolis y Smart eran casi las mismas. Por ejemplo, "¿Por qué la impresión no es un color uniforme? ¿Tiene ejemplos de código en C # o Java?" y preguntas más específicas sobre por qué algo no funciona como se esperaba.


EvolisElyctisSmart-51
Numero de letras973761

Tabla 2 - Comparación de la cantidad de correos electrónicos con soporte técnico

2.2. Codificación


La comunicación con el lector ocurre a través de comandos APDU. APDU (Application Protocol Data Unit) es un formato estándar para la comunicación entre una tarjeta y un lector. Este artículo describirá los equipos básicos APDU para MIFARE Classic y MIFARE DESFire.


TituloTamañoDescripción
CLA1 byteBytes de clase
Ins1 byteByte de instrucciones
P11 byteParámetro 1
P21 byteParámetro 2
Longitud de datos1 byteTamaño de datos transmitidos
Datos...Datos transmitidos
Longitud de datos esperada1 byteEl tamaño de los datos esperados en la respuesta.

Tabla 3 - Formato de los comandos APDU
TituloTamañoDescripción
SW11 byteCódigo de éxito o error común
SW21 byteCódigo de error detallado
Datos...Datos devueltos

Tabla 4 - Formato de respuesta APDU

Puede encontrar una descripción de todos los códigos de respuesta posibles aquí [6]. Puede encontrar un dispositivo para comunicar tarjetas con un lector en [7].


Un breve algoritmo de codificación es el siguiente:


  1. Obtenga el UID de la tarjeta. Este es un número único, es actualizado por el proveedor y no cambia.
  2. Leer datos de cada sector:
    2.1 Inicie sesión en el sector utilizando la clave predeterminada (0x00 o 0xFF)
    2.2 Leer datos de tres bloques de datos
  3. Si los datos leídos están vacíos, vaya al registro de datos
    3.1 Inicie sesión en el sector utilizando la clave predeterminada (0x00 o 0xFF)
    3.2 Escribir datos en bloques de datos de tres sectores
    3.3 Crear una nueva clave basada en el UID de la tarjeta
    3.4 Reemplace la clave de autorización en el bloque de remolque con una nueva clave.

2.2.1. Elyctis


La impresora Evolis utiliza un lector ELYCTIS CL . Usando la biblioteca WinSCard (C ++ y C #) y jnasmartcardio (java), puede interactuar fácilmente con el lector. Para crear rápidamente software con una interfaz bastante simple, se decidió escribir código en C # . Principalmente, nuestro equipo escribe código en Java, lo que hizo que la transición a C # fuera menos dolorosa. También a favor de C # fue el hecho de que Windows es más adecuado para trabajar con impresoras.


La siguiente tabla muestra ejemplos de comandos APDU nativos que son aceptados por el lector Elyctis.


DescripciónDatosAPDU
Obtener una tarjeta UID-0xFF 0xCA 0x00 0x00 0x00
Carga de clave de autorización en la memoria del lectorClave de 6 bytesUn ejemplo de carga de una clave predeterminada. 0xFF 0x82 0x20 0x00 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Iniciar sesiónNúmero de bloque de autorización del sector (bloque del tercer sector) y tipo de clave (A - 0x60 o B - 0x61)Un ejemplo de autorización para el sector 1. Los números de bloque de este sector son 4-7, el bloque de tráiler es el número 7. 0xFF 0x86 0x00 0x00 0X05 0x01 0x00 0x07 0X60 0x00 0x00
Leer datos de un bloque-Un ejemplo de lectura de datos del bloque 4 (primer bloque del sector 1). El número de sector se ingresa en el parámetro 2. 0xFF 0xB0 0x00 0x04 0x00 0x10
Escribir datos en el bloque16 bytes de datosUn ejemplo de escritura de datos en el bloque 4. 0xFF 0xD6 0x00 0x04 0x10 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 0x00

Tabla 5 - Ejemplos de comandos APDU para Mifare Classic

Después de asegurarnos de que la codificación de tarjetas como Mifare Classic fue exitosa, cambiamos a comandos para DESFire . Por referencia [8] puede encontrar ejemplos simples de comandos con explicaciones. Sin embargo, ya en el equipo de autorización, nos encontramos con un comportamiento interesante del lector. En resumen, el lector realizó la autorización completa. Resultó que el soporte técnico de Elyctis nos proporcionó un firmware especial que incluía la inteligencia easyDESFire . Solo es necesario determinar qué algoritmo de cifrado usa el lector. En nuestro caso, fue 3DES.


En casos normales, la autorización se lleva a cabo intercambiando varios mensajes.


  1. Enviamos el comando APDU para autorización: 0x90 0x0A 0x00 0x00 0x00 0x00 .
  2. Dependiendo del algoritmo, una matriz de 8 bytes aleatorios codificados por la clave de la tarjeta viene en respuesta al comando; lo denotamos por RandBEnc .
  3. Desciframos RandBEnc y hacemos un cambio de byte a la izquierda. Denota el resultado por RandBLeft .
  4. Generamos de nuestro lado una matriz de 8 bytes aleatorios, RandA .
  5. Agrupamos RandA y RandBLeft , encriptamos con la clave de la tarjeta y enviamos la matriz resultante de 16 bytes.
  6. En respuesta, obtenemos la clave de sesión, iniciando sesión en la aplicación en el mapa.

Puede encontrar más detalles sobre el proceso de autorización aquí [9]. El código del github también es muy útil [10].


Durante la codificación, surgieron problemas con el uso de comandos de la fuente [8]. Con la ayuda del soporte técnico de Elyctis, recibimos los comandos necesarios adecuados para la inteligencia easyDESFire .


Durante la codificación en Elyctis, se reveló un gran problema del lector: el retraso de la comunicación . Muy a menudo, las señales no llegan al lector, por lo que a veces es necesario enviar el mismo comando varias veces. Este comportamiento es menos común, pero aún se nota al enviar comandos para imprimir. Como resultado, el envío de todos los comandos se realiza en un bucle, hasta la ejecución exitosa.


2.2.2. DUALi


El fabricante entrega su SDK para trabajar con un codificador DUALi. En la etapa de trabajar con Mifare Classic, los comandos para leer y escribir podrían tomarse del código de plantilla que nos dieron los distribuidores. Ejemplos fueron en C ++, Visual Basic, Java. Sin embargo, fue posible compilar completamente el código solo en C ++. La primera solicitud para un ejemplo de código C #, nos rechazaron, o más bien, el distribuidor no tiene uno. No hay programadores seguros de C ++ en nuestro equipo, por lo que escribir todo el código fue muy complicado por cosas bastante simples. Por ejemplo:


  1. Trabajar con matrices
    Al pasar una matriz como parámetro a una función, no pasamos el tamaño de la matriz. Para determinar la longitud de la matriz, se utilizó la función sizeOf (). Sin embargo, la función constantemente devolvió un tamaño de 4, independientemente del tamaño real de la matriz. Este comportamiento no se registró de inmediato, ya que algunas matrices eran de tamaño 4.
  2. Configurar todas las bibliotecas
    Se experimentó mucho dolor al instalar todo el entorno necesario. Estamos demasiado acostumbrados a cosas como maven y apt (en Ubuntu). Se suponía que nuestro programa llamaría a la API de back-end a través de solicitudes HTTP y encriptaría los datos en Base64. Para esto, se decidió utilizar las bibliotecas libcurl y openssl. La escritura del programa en sí tuvo lugar en el entorno de Microsoft Visual Studio. Mayor alboroto con la instalación de libcurl.

El SDK en sí es una biblioteca dll escrita en C ++. Gracias al ejemplo de código, escribimos relativamente rápido un programa para interactuar con la tarjeta Mifare Classic. Como se mencionó anteriormente, los comandos APDU para DUALi fueron muy específicos, es decir, los dos primeros bytes no coincidían con los que se pueden encontrar en Internet. Debido a esto, tuve que copiarlos a ciegas, porque, en principio, todo funciona como se esperaba. Los problemas comienzan con las pruebas con tarjetas DESFire.


El principio de los comandos APDU para DESFire en DUALi es al menos comprensible. Hay dos bytes para {CLA, INS} , no cambian y, de hecho, dicen que el comando está destinado a tarjetas como DESFire. Los parámetros 1 y 2 tampoco cambian. Los datos transmitidos ya contienen parte del comando DESFire nativo, es decir, los bytes {INS, Data} . Durante aproximadamente una semana, no pudimos obtener las respuestas esperadas a comandos simples, por ejemplo, el comando "seleccionar aplicación". Al comienzo del código, dejamos la ejecución APDU del comando GetCardStatus, que no era un formato de comando para DESFire. Sin embargo, ella trabajó y emitió tarjetas UID. Al final resultó que, después de la ejecución de GetCardStatus, los equipos DESFire dejaron de funcionar. Esta omisión fue determinada por nuestras fuerzas, después de un diálogo de una semana con el proveedor, que no condujo a nada.


Después de un mes de operación estable de nuestro programa, llegamos a la necesidad de reescribir el programa en C #. La razón principal fue la configuración de CI. El programa C ++ se compiló con Microsoft Visual Studio. Todos nuestros servidores se ejecutan en Linux, por lo que no fue posible iniciar la ventana acoplable con Windows y el Visual Studio ToolKit necesario. Por supuesto, podría crear una máquina virtual con Windows y aún configurar todo para C ++, pero realmente no quería hacerlo. Después de solicitar repetidamente un código C # de muestra al fabricante, se nos proporcionó un ejemplo. Puede escribirlo usted mismo, según las definiciones de método en el ejemplo de interfaz de C ++, pero resultó que no se describieron todas las funciones. El ejemplo ayudó mucho y al final reescribimos el programa en C # y configuramos CI.


2.3. Imprimir


A primera vista, parece que la impresión no debería causar problemas, porque en primer lugar usamos impresoras de impresión. , , .


. , , .


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 . , .


, .. . , .


Referencias


  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/481734/


All Articles