Experiência com impressoras de cartões, parte 1

Este artigo será útil para quem começa a trabalhar com impressoras de cartões ( Evolis Primacy e Smart-51 ) e cartões codificados por NFC, como o Mifare Classic e o Mifare DESFire EV2 . Na primeira parte, descreveremos a impressão geral de trabalhar com impressoras de cartões, bem como os problemas que tivemos que enfrentar. Na segunda parte, está planejado mostrar partes mais práticas: código, dicas de operação.


1. Como a tarefa apareceu


Estamos desenvolvendo um sistema de bilhetagem eletrônica, que inclui o trabalho com cartões NFC. Cada cartão NFC possui um número fácil de usar e um ID individual. O número deve ser impresso no cartão e o ID está escrito no chip NFC. Uma das tarefas era estabelecer uma produção estável de cartões de transporte.


Na primeira etapa, o problema foi resolvido da maneira mais simples - as impressões com Numbers são impressas pelo fornecedor do cartão NFC e as IDs são gravadas por nós usando leitores de mesa, software especial e uma pessoa. Após receber os cartões do fornecedor, é necessário registrar o cartão no sistema e associar o ID e o Número um ao outro. Como leitor de mesa, usamos o Z-2 Reader [1].


O processo ficou mais ou menos assim:


  • O operador pega um cartão. O número do cartão já está impresso no cartão, mas o registro do cartão no sistema e a gravação do ID no chip NFC
  • O operador coloca o cartão no leitor Z-2 e registra o número no sistema de bilhetes eletrônicos, inserindo manualmente o número do cartão. Para empacotamento e registro, é feita uma chamada da API HTTPS
  • O operador pega o próximo cartão e faz de novo.

Uma solução simples e rápida com uma pequena desvantagem. A influência do fator humano gera cartões fantasmas para os quais o Número impresso no cartão não corresponde ao ID - Número do link no banco de dados do sistema.


Assim, nasceu a seguinte declaração do problema: É necessário imprimir o número , anotar o ID e registrar os cartões NFC no sistema atomicamente e com o mínimo envolvimento humano.


Neste artigo, descreveremos todos os equipamentos com os quais trabalhamos e todas as armadilhas. No final, tentaremos dizer qual equipamento nos parece melhor.


1.1 Cartões NFC


Analisamos os cartões NFC MIFARE Classic 1K e MIFARE DESFire EV2. O MIFARE Classic é o mais comum e mais vulnerável a cópia. No entanto, eles continuam a ser populares em lugares como universidades e transporte público. Ao lidar com fluxos de caixa, é necessária uma solução mais confiável. Portanto, os cartões MIFARE DESFire EV2 se tornaram uma alternativa. Este é um dos últimos tipos de cartões que usam algoritmos de criptografia DES, TDES (2KTDES, 3KTDES), AES [2, 3]. Brevemente sobre cada mapa:


MIFARE Classic


O cartão de memória é um setor e bloqueia. A primeira unidade de memória é um setor. Existem 16 setores no mapa, cada um com 4 blocos de dados. A memória de cada bloco é de 16 bytes. Para ler e / ou gravar dados, o leitor deve efetuar login no setor. Um bloco especial em cada setor, o bloco de reboque, foi projetado para armazenar chaves. Primeiro de tudo, para trabalhar com o setor, é necessário fazer login no bloco de reboque. O bloco de reboque também armazena 16 bytes: 6 bytes por tipo de chave A, 4 bytes por direitos de acesso, 6 bytes por tipo de chave B.


A figura 1 [4] mostra claramente os setores, blocos e chaves.




Figura 1 - Dispositivo de memória no Mifare Classic


MIFARE DESFire


O dispositivo do cartão se parece com um sistema de arquivos. O cartão consiste em aplicativos e arquivos. No mapa, há um aplicativo principal (aplicativo) com o ID - 000000 (0x00, 0x00, 0x00). Dentro do aplicativo principal, você pode criar um novo aplicativo e criar arquivos de dados dentro dele.
As características dos cartões DESFire são apresentadas na Figura 2 [5]. Cada aplicativo recebe suas próprias chaves de acesso nos arquivos do aplicativo.



Figura 2 - Características dos cartões Mifare DESFire


1.2 Impressoras como solução


Para realizar essa tarefa, impressoras de cartões especiais são usadas. No momento, existem muitas empresas diferentes fornecendo essas impressoras. Por exemplo: Evolis, Smart, Zebra, Datacard, etc. Usamos as impressoras Evolis Primacy e Smart-51 . Essas impressoras têm muito em comum no centro do trabalho: ambas usam cartuchos de fita para impressão e têm um princípio de limpeza semelhante. Também existem diferenças - codificadores NFC diferentes. Ambas as impressoras podem ser complementadas ou substituídas, dependendo das necessidades do cliente.


Os programadores para cartões NFC são baseados nos padrões ISO / IEC 14443A e ISO / IEC 7816-4 para DESFire, ISO / IEC 14443 Tipo A para Classic. No entanto, dependendo do fabricante, os programadores podem aceitar comandos nativos de acordo com os padrões ou agrupar os comandos nativos em específico para um programador específico. Estamos diante de um e de outro.


Evolis primacySmart-51
ImpressãoA fita é usada para impressão (colorida ou monocromática). Uma fita cassete inteira é fornecida.A fita é usada para impressão (colorida ou monocromática). Somente a fita é fornecida, um cartucho e vem com a própria impressora. Um rolo de limpeza está incluído com a fita.
CodificadorCodificador Elyctis. Fácil de usar porque suporta interação com bibliotecas padrão do Windows para comunicação com placas NFC, winscard.Codificador DUALi. O suporte técnico fornece um SDK especial para trabalhar com o codificador.
LimpezaPara manter a impressora em condições de funcionamento, é necessário limpeza constante. Existem dois tipos de limpeza: periódica (após cada 1000 cartões) e estendida (após 5000 cartões). A conformidade com o cronograma de limpeza é um pré-requisito no contrato de garantia.A limpeza é necessária após o uso da fita impressa. Dependendo do tipo de fita e do tamanho da imagem para impressão, a limpeza será necessária após 2 a 4 mil cartões.
HabitaçãoA caixa de plástico permite que a impressora seja bastante leve. Os interiores podem ser facilmente alcançados, porque as paredes da impressora se abrem dos dois lados.A caixa de metal torna a impressora confiável para operação. Algumas entranhas só podem ser vistas abrindo a tampa superior.
De softwareVem com o software especial “Evolis Print Center” e CardPresso. O primeiro é necessário para as configurações da impressora, equipadas com vários auxiliares. O segundo software permite testar rapidamente os recursos da impressora para impressão e codificação.Não é necessário software separado para controlar a impressora. Propriedades de impressora suficientes na lista de dispositivos Windows. Vem com o software SmartID para impressão e codificação.

Tabela 1 - Comparação entre Evolis Primacy e Smart-51

2. Experiências


Em geral, o trabalho com impressoras pode ser dividido em várias partes: comunicação com suporte técnico, estudo da interação de cartões e codificadores, impressão.


2.1 Impressão de suporte técnico


O trabalho com impressoras incluía comunicação constante com suporte técnico, pois precisávamos escrever nosso próprio software. Nos dois casos, conversamos mais com distribuidores de empresas em nosso país e nos países vizinhos.


Os distribuidores da Evolis sempre estiveram sempre em contato. No entanto, quase imediatamente as especificidades das questões mostraram a necessidade de comunicação com os representantes da Evolis. Infelizmente, eles não nos deram seus contatos e tiveram que trocar mensagens através de um distribuidor. No entanto, isso dizia respeito apenas a questões de impressão; em questões de codificação, recebemos o correio de um representante da Elyctis. A comunicação direta com a Elyctis simplificou bastante o processo de codificação. Puramente tecnicamente, nós imediatamente nos entendemos e não houve mal-entendidos. No caso de exemplos de impressão e código para o Evolis Primacy, a comunicação em algum momento parou. Basicamente, a impressão negativa foi causada pelos momentos em que exemplos de impressão em frente e verso não funcionaram para nós e demorou muito tempo para provar isso. Cheguei às gravações dos processos de impressão em vídeo, depois das dicas mais produtivas da Evolis.


Uma das mais recentes questões de suporte técnico da Evolis foi como conectar a impressora via Ethernet. No momento, estamos conectando a impressora via USB ao laptop, o que é tolerável na presença de 1-2 impressoras. As respostas ainda estão esperando. No entanto, uma resposta já foi recebida da Elyctis de que o codificador da impressora Evolis Primacy não fornece uma conexão de rede.


A comunicação com o suporte técnico do Smart-51 também se reduziu à comunicação com os representantes da empresa por meio de um distribuidor. No início, tudo correu bem. Quando se tratava de cartões de codificação como o Mifare DESFire, os problemas começaram. As dificuldades foram causadas por equipes específicas que você não encontrará na Internet. Por esse motivo, basta copiar algumas partes do código de trabalho fornecido pelo fabricante como exemplo. No entanto, a cópia impensada não leva ao bem. Como resultado, duas semanas foram gastas explicando o erro ao fabricante, do lado do qual o homem estava claramente sentado, não muito próximo dos meandros do sistema, mas mantendo a documentação geral com ele. Um precipitado desagradável permaneceu, mas começou muito bem.


A comunicação através de um distribuidor não possui vantagens, desvantagens sólidas. Por exemplo:


  1. Respostas atrasadas, porque a pessoa responsável do lado do distribuidor pode estar ocupada com outras coisas ou sair de férias.
  2. Quando o distribuidor está em outro país, são feriados adicionais, portanto, não dias úteis. No caso do Smart-51, a comunicação ocorreu com a participação de pessoas de 3 países.
  3. As respostas não são encaminhadas. O texto da resposta é inserido em uma nova carta do distribuidor. Por esse motivo, às vezes os arquivos anexados são perdidos e não chegam imediatamente.
  4. Não há uma clara certeza de que sua mensagem chegou ao fabricante inalterada.

Abaixo está uma tabela com o número de letras que compunham a comunicação com o suporte técnico. Basicamente, as perguntas para Evolis e Smart eram praticamente as mesmas. Por exemplo, "Por que a impressão não é uma cor uniforme? Você tem exemplos de código em C # ou Java?" e perguntas mais específicas sobre por que algo não funciona conforme o esperado.


EvolisElyctisSmart-51
Número de letras9737.61

Tabela 2 - Comparação do número de emails com suporte técnico

2.2 Codificação


A comunicação com o leitor ocorre através de comandos APDU. APDU (Application Protocol Data Unit) é um formato padrão para comunicação entre um cartão e um leitor. Este artigo descreve as equipes básicas da APDU para o MIFARE Classic e o MIFARE DESFire.


TítuloTamanhoDescrição do produto
CLA1 byteBytes de classe
Ins1 byteByte de instrução
P11 byteParâmetro 1
P21 byteParâmetro 2
Comprimento dos dados1 byteTamanho dos dados transmitidos
Dados...Dados transmitidos
Comprimento esperado dos dados1 byteO tamanho dos dados esperados na resposta

Tabela 3 - Formato dos comandos do APDU
TítuloTamanhoDescrição do produto
SW11 byteCódigo comum de sucesso ou erro
SW21 byteCódigo de erro detalhado
Dados...Retornar dados

Tabela 4 - Formato de resposta do APDU

Uma descrição de todos os códigos de resposta possíveis pode ser encontrada aqui [6]. Um dispositivo para comunicar cartões com um leitor pode ser encontrado em [7].


Um breve algoritmo de codificação é o seguinte:


  1. Obtenha o UID do cartão. Este é um número único, é exibido pelo fornecedor e não é alterado.
  2. Leia os dados de cada setor:
    2.1 Faça logon no setor usando a chave padrão (0x00 ou 0xFF)
    2.2 Ler dados de três blocos de dados
  3. Se os dados lidos estiverem vazios, vá para o registro de dados
    3.1 Efetue login no setor usando a chave padrão (0x00 ou 0xFF)
    3.2 Gravar dados em três blocos de dados do setor
    3.3 Crie uma nova chave com base no UID do cartão
    3.4 Substitua a chave de autorização no bloco de reboque por uma nova chave.

2.2.1 Elyctis


A impressora Evolis usa um leitor ELYCTIS CL . Usando a biblioteca WinSCard (C ++ e C #) e jnasmartcardio (java), você pode interagir facilmente com o leitor. Para criar rapidamente software com uma interface bastante simples, foi decidido escrever código em C # . Principalmente, nossa equipe escreve código em Java, o que tornou a transição para o C # menos dolorosa. Também a favor do C # foi o fato de o Windows ser mais adequado para trabalhar com impressoras.


A tabela abaixo mostra exemplos de comandos APDU nativos que são aceitos pelo leitor Elyctis.


Descrição do produtoDadosAPDU
Obtendo um cartão UID-0xFF 0xCA 0x00 0x00 0x00
Carregando chave de autorização na memória do leitorChave de 6 bytesUm exemplo de carregamento de uma chave padrão. 0xFF 0x82 0x20 0x00 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x00
EntrarNúmero do bloco de autorização do setor (bloco do terceiro setor) e tipo de chave (A - 0x60 ou B - 0x61)Um exemplo de autorização para o setor 1. Os números de bloco desse setor são 4-7, o bloco de reboque é o número 7. 0xFF 0x86 0x00 0x00 0X05 0x01 0x00 0x07 0X60 0x00 0x00
Lendo dados de um bloco-Um exemplo de leitura de dados do bloco 4 (1º bloco do setor 1). O número do setor é inserido no parâmetro 2. 0xFF 0xB0 0x00 0x04 0x00 0x10
Gravando dados no bloco16 bytes de dadosUm exemplo de gravação de dados no bloco 4. 0xFF 0xD6 0x00 0x04 0x10 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 0x11 0x22 0x22 0x33 0x44 0x55 0x66 0x77 0x88 0x00

Tabela 5 - Exemplos de comandos APDU para o Mifare Classic

Depois de garantir que a codificação de cartões como o Mifare Classic fosse bem-sucedida, mudamos para os comandos do DESFire . Por referência [8], você pode encontrar exemplos simples de comandos com explicações. No entanto, já na equipe de autorização, encontramos um comportamento interessante do leitor. Em suma, o leitor fez a própria autorização completa. Verificou-se que o suporte técnico da Elyctis nos forneceu um firmware especial que incluía a inteligência easyDESFire . É necessário apenas determinar qual algoritmo de criptografia o leitor usa. No nosso caso, foi o 3DES.


Em casos normais, a autorização é realizada trocando várias mensagens.


  1. Enviamos o comando APDU para autorização: 0x90 0x0A 0x00 0x00 0x00 0x00 .
  2. Dependendo do algoritmo, uma matriz de 8 bytes aleatórios codificados pela chave do cartão vem em resposta ao comando, que é designado por RandBEnc .
  3. Descriptografamos RandBEnc e fazemos um desvio de byte para a esquerda. Indique o resultado por RandBLeft .
  4. Geramos do nosso lado uma matriz de 8 bytes aleatórios, RandA .
  5. Agrupamos RandA e RandBLeft , criptografamos com a chave do cartão e enviamos a matriz resultante de 16 bytes.
  6. Recebemos a chave da sessão em resposta, efetuando login no aplicativo no mapa.

Mais detalhes sobre o processo de autorização podem ser encontrados aqui [9]. O código do github também é muito útil [10].


Durante a codificação, surgiram problemas com o uso de comandos da fonte [8]. Com a ajuda do suporte técnico da Elyctis, recebemos os comandos necessários para a inteligência easyDESFire .


Durante a codificação em Elyctis, um grande problema do leitor foi revelado - atraso na comunicação . Muitas vezes, os sinais não chegam ao leitor, portanto, o mesmo comando às vezes precisa ser enviado várias vezes. Esse comportamento é menos comum, mas ainda é percebido ao enviar comandos para impressão. Como resultado, o envio de todos os comandos ocorre em um loop, até a execução bem-sucedida.


2.2.2 DUALi


O fabricante fornece seu SDK para trabalhar com um codificador DUALi. No estágio de trabalho com o Mifare Classic, os comandos de leitura e gravação podem ser obtidos a partir do código do modelo que os distribuidores nos deram. Exemplos foram em C ++, Visual Basic, Java. No entanto, foi possível compilar completamente o código apenas em C ++. A primeira solicitação de um exemplo de código C #, fomos recusados, ou melhor, o distribuidor não possui um. Não há programadores C ++ confiantes em nossa equipe, portanto, escrever todo o código foi muito complicado por coisas bastante simples. Por exemplo:


  1. Trabalhar com matrizes
    Ao passar um array como parâmetro para uma função, não passamos o tamanho do array. Para determinar o comprimento da matriz, a função sizeOf () foi usada. No entanto, a função retornava constantemente um tamanho de 4, independentemente do tamanho real da matriz. Esse comportamento não foi registrado imediatamente, porque algumas matrizes eram realmente de tamanho 4.
  2. Configurar todas as bibliotecas
    Muita dor foi sentida ao instalar todo o ambiente necessário. Estamos muito acostumados a coisas como maven e apt (no Ubuntu). Nosso programa deveria chamar a API de back-end por meio de solicitações HTTP e criptografar os dados em Base64. Para isso, foi decidido usar as bibliotecas libcurl e openssl. A gravação do próprio programa ocorreu no ambiente Microsoft Visual Studio. O maior problema com a instalação do libcurl.

O SDK em si é uma biblioteca DLL escrita em C ++. Graças ao exemplo de código, escrevemos relativamente rápido um programa para interagir com o cartão Mifare Classic. Como mencionado acima, os comandos APDU para o DUALi eram muito específicos, ou seja, os dois primeiros bytes não correspondiam aos que podem ser encontrados na Internet. Por causa disso, tive que copiá-los cegamente, porque, em princípio, tudo funciona como esperado. Os problemas começam com os testes com cartões DESFire.


O princípio dos comandos APDU para DESFire no DUALi é pelo menos compreensível. Existem dois bytes para {CLA, INS} , eles não mudam e, na verdade, eles dizem que o comando é destinado a cartões como DESFire. Os parâmetros 1 e 2 também não são alterados. Os dados transmitidos já contêm parte do comando DESFire nativo, a saber, os bytes {INS, Data} . Por cerca de uma semana, não conseguimos obter as respostas esperadas para comandos simples, por exemplo, o comando "selecionar aplicativo". No início do código, deixamos a execução de APDU do comando GetCardStatus, que não era um formato de comando para o DESFire. No entanto, ela trabalhou e emitiu cartões UID. Como se viu, depois que a execução das equipes GetCardStatus DESFire parou de funcionar. Essa omissão foi determinada por nossas forças, após um diálogo de uma semana com o fornecedor, que não levou a nada.


Após um mês de operação estável de nosso programa, chegamos à necessidade de reescrever o programa em C #. O principal motivo foi a criação do IC. O programa C ++ foi compilado usando o Microsoft Visual Studio. Todos os nossos servidores são executados no Linux, portanto, não foi possível iniciar a janela de encaixe com o Windows e o Visual Studio ToolKit necessário. Claro, você pode criar uma máquina virtual com o Windows e ainda configurar tudo para C ++, mas eu realmente não queria. Depois de solicitar repetidamente um exemplo de código C # do fabricante, fomos fornecidos com um exemplo. Você mesmo pode escrever, com base nas definições de método no exemplo da interface C ++, mas descobriu-se que nem todas as funções foram descritas. O exemplo ajudou muito e, no final, reescrevemos o programa em C # e configuramos o CI.


2.3 Impressão


À primeira vista, parece que a impressão não deve causar problemas, porque em primeiro lugar usamos impressoras. , , .


. , , .


2.3.1. Evolis Primacy


JSON , HTTP . Evolis Services Provider, . 8 :


  1. : , , . .

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



  1. .

  2. .

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


desenho

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

desenho

)


desenho

)
4 — : — , —


4.


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


, .. . , .


Referências


  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. Folha de dados Mifare DESFire http://neteril.org/files/M075031_desfire.pdf
  10. Projeto GitHub para DESFire https://github.com/EsupPortail/esup-nfc-tag-server/blob/master/src/main/java/nfcjlib/core/DESFireEV1.java

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


All Articles