Artikel ini akan berguna bagi mereka yang mulai bekerja dengan printer kartu ( Evolis Primacy dan Smart-51 ) dan kartu berkode NFC seperti Mifare Classic dan Mifare DESFire EV2 . Pada bagian pertama kita akan menggambarkan kesan umum bekerja dengan printer kartu, serta masalah yang harus kita hadapi. Pada bagian kedua, direncanakan untuk menunjukkan bagian yang lebih praktis: kode, kiat pengoperasian.
1. Bagaimana tugas itu muncul
Kami sedang mengembangkan sistem tiket elektronik, yang mencakup bekerja dengan kartu NFC. Setiap kartu NFC memiliki Nomor yang mudah digunakan , dan ID individual. Nomor tersebut harus dicetak pada kartu, dan ID ditulis dalam chip NFC. Salah satu tugasnya adalah membangun produksi kartu transportasi yang stabil.
Pada tahap pertama, masalah diselesaikan dengan cara paling sederhana - cetakan dengan Angka dicetak oleh penyedia kartu NFC, dan ID direkam oleh kami menggunakan pembaca desktop, perangkat lunak khusus dan seseorang. Setelah menerima kartu dari pemasok, Anda harus mendaftarkan kartu ke dalam sistem dan menghubungkan ID dan Nomor satu sama lain. Sebagai pembaca desktop, kami menggunakan Z-2 Reader [1].
Prosesnya terlihat seperti ini:
- Operator mengambil kartu. Nomor kartu sudah dicetak pada kartu, tetapi pendaftaran kartu dalam sistem dan pencatatan ID dalam chip NFC diperlukan
- Operator meletakkan kartu pada Pembaca Z-2 dan mendaftarkan Nomor dalam sistem tiket elektronik dengan memasukkan Nomor Kartu secara manual. Untuk bundling dan pendaftaran, panggilan API HTTPS dibuat
- Operator mengambil kartu berikutnya dan melakukannya lagi.
Solusi sederhana dan cepat dengan satu kelemahan kecil . Pengaruh faktor manusia menghasilkan kartu hantu yang Nomor yang tercetak di kartu tidak sesuai dengan ID tautan - Nomor dalam basis data sistem.
Maka lahirlah pernyataan masalah berikut: Diperlukan untuk mencetak Nomor , menuliskan ID dan mendaftarkan kartu NFC dalam sistem secara atom dan dengan keterlibatan manusia yang minimal.
Dalam artikel ini kami akan menjelaskan semua peralatan yang kami gunakan, dan semua perangkap. Pada akhirnya, kami akan mencoba mengatakan peralatan mana yang lebih baik bagi kami.
1.1. Kartu nfc
Kami meninjau kartu NFC MIFARE Classic 1K dan MIFARE DESFire EV2. MIFARE Classic adalah yang paling umum dan paling rentan disalin. Namun, mereka terus menjadi populer di tempat-tempat seperti universitas dan transportasi umum. Saat menangani arus kas, solusi yang lebih andal dibutuhkan. Karenanya, kartu MIFARE DESFire EV2 menjadi alternatif. Ini adalah salah satu jenis kartu terakhir yang menggunakan DES, TDES (2KTDES, 3KTDES), algoritma enkripsi AES [2, 3]. Secara singkat tentang setiap peta:
MIFARE Classic
Kartu memori adalah sektor dan blok. Unit memori pertama adalah sektor. Ada 16 sektor di peta, yang masing-masing memiliki 4 blok data. Memori setiap blok adalah 16 byte. Untuk membaca dan / atau menulis data, pembaca harus masuk ke sektor ini. Satu blok khusus di setiap sektor, blok trailer, dirancang untuk menyimpan kunci. Pertama-tama, untuk bekerja dengan sektor ini, Anda harus masuk ke blok trailer. Blok trailer juga menyimpan 16 byte: 6 byte per kunci tipe A, 4 byte per hak akses, 6 byte per tipe kunci B.
Gambar 1 [4] dengan jelas menunjukkan sektor, balok dan kunci.

Gambar 1 - Perangkat memori di Mifare Classic
MIFARE DESFire
Perangkat kartu menyerupai sistem file. Kartu terdiri dari aplikasi dan file. Di peta ada aplikasi utama (aplikasi) dengan id - 000000 (0x00, 0x00, 0x00). Di dalam aplikasi utama, Anda dapat membuat aplikasi baru dan membuat file data di dalamnya.
Karakteristik kartu DESFire disajikan pada Gambar 2 [5]. Setiap aplikasi diberi kunci aksesnya sendiri ke file aplikasi.

Gambar 2 - Karakteristik kartu Mifare DESFire
1.2. Printer sebagai solusi
Untuk menyelesaikan tugas ini, printer kartu khusus digunakan. Saat ini ada banyak perusahaan yang memasok printer ini. Misalnya: Evolis, Smart, Zebra, Datacard, dll. Kami menggunakan printer Evolis Primacy dan Smart-51 . Printer ini memiliki banyak kesamaan di jantung pekerjaan: mereka berdua menggunakan kartrid tape untuk mencetak dan memiliki prinsip pembersihan yang serupa. Ada juga perbedaan - encoders NFC yang berbeda. Kedua printer dapat ditambah atau diganti tergantung pada kebutuhan pelanggan.
Programmer untuk kartu NFC didasarkan pada standar ISO / IEC 14443A dan ISO / IEC 7816-4 untuk DESFire, ISO / IEC 14443 Tipe A untuk Classic. Namun, tergantung pada pabrikan, pemrogram dapat menerima perintah asli sesuai dengan standar, atau membungkus perintah asli secara khusus untuk pemrogram tertentu. Kita berhadapan dengan satu dan lainnya.
Tabel 1 - Perbandingan Evolis Primacy dan Smart-51
2. Eksperimen
Secara umum, bekerja dengan printer dapat dibagi menjadi beberapa bagian: komunikasi dengan dukungan teknis, mempelajari interaksi kartu dan encoders, pencetakan.
2.1. Kesan dukungan teknis
Bekerja dengan printer termasuk komunikasi yang konstan dengan dukungan teknis, karena kami perlu menulis perangkat lunak kami sendiri. Dalam kedua kasus tersebut, kami lebih banyak berbicara dengan distributor perusahaan di negara kami dan negara tetangga.
Distributor Evolis sebagian besar selalu berhubungan. Namun, segera masalah spesifik menunjukkan perlunya komunikasi dengan perwakilan Evolis. Sayangnya, mereka tidak memberi kami kontak mereka dan harus bertukar pesan melalui distributor. Namun, ini hanya menyangkut masalah cetak, pada masalah pengkodean kami diberi surat perwakilan Elyctis. Komunikasi langsung dengan Elyctis sangat menyederhanakan proses pengkodean. Secara teknis murni, kami segera saling memahami dan tidak ada kesalahpahaman. Dalam hal pencetakan dan contoh kode untuk Evolis Primacy, komunikasi di beberapa titik terhenti. Pada dasarnya, kesan negatif dibuat oleh saat-saat ketika contoh-contoh pencetakan dua sisi tidak bekerja untuk kita dan butuh waktu lama untuk membuktikannya. Saya sampai pada rekaman proses cetak pada video, setelah itu tips yang lebih produktif dari Evolis diikuti.
Salah satu pertanyaan dukungan teknologi Evolis terbaru adalah bagaimana menghubungkan printer melalui Ethernet. Saat ini, kami menghubungkan printer melalui USB ke laptop, yang dapat ditoleransi di hadapan 1-2 printer. Jawaban masih menunggu. Namun, jawaban dari Elyctis telah diterima bahwa pembuat enkode mereka untuk printer Evolis Primacy tidak menyediakan koneksi jaringan.
Berkomunikasi dengan dukungan teknologi Smart-51 juga dilakukan dengan berkomunikasi dengan perwakilan perusahaan melalui distributor. Pada awalnya, semuanya berjalan lancar. Ketika datang ke kartu encoding seperti Mifare DESFire, masalah dimulai. Kesulitan disebabkan oleh tim khusus yang tidak akan Anda temukan di Internet. Untuk alasan ini, Anda hanya perlu menyalin beberapa bagian dari kode kerja yang disediakan oleh pabrikan sebagai contoh. Namun, menyalin sembarangan tidak mengarah pada kebaikan. Akibatnya, dua minggu dihabiskan untuk menjelaskan kesalahan kepada produsen, di pihak siapa lelaki itu jelas duduk, tidak terlalu dekat dengan seluk-beluk sistem, tetapi membawa dokumentasi umum bersamanya. Endapan yang tidak menyenangkan tetap ada, tetapi itu dimulai dengan sangat baik.
Komunikasi melalui distributor tidak memiliki plus, minus yang solid. Sebagai contoh:
- Respons tertunda, karena orang yang bertanggung jawab di pihak distributor mungkin sibuk dengan hal-hal lain atau pergi berlibur.
- Ketika distributor berada di negara lain, ini adalah hari libur tambahan, oleh karena itu, bukan hari kerja. Dalam kasus Smart-51, komunikasi terjadi dengan partisipasi orang-orang dari 3 negara.
- Balasan tidak diteruskan. Teks respons dimasukkan ke dalam surat baru dari distributor. Karena alasan ini, kadang-kadang file yang dilampirkan hilang dan tidak dapat segera dijangkau.
- Tidak ada kepastian yang jelas bahwa pesan Anda telah mencapai pabrikan tidak berubah.
Di bawah ini adalah tabel dengan jumlah surat yang dibuat komunikasi dengan dukungan teknis. Pada dasarnya, pertanyaan untuk Evolis dan Smart hampir sama. Misalnya, "Mengapa mencetak bukan warna yang seragam? Apakah Anda memiliki contoh kode dalam C # atau Java?" dan pertanyaan yang lebih spesifik tentang mengapa sesuatu tidak berfungsi seperti yang diharapkan.
Tabel 2 - Perbandingan jumlah email dengan dukungan teknis
2.2. Pengkodean
Komunikasi dengan pembaca terjadi melalui perintah APDU. APDU (Application Protocol Data Unit) adalah format standar untuk komunikasi antara kartu dan pembaca. Artikel ini akan menjelaskan tim APDU dasar untuk MIFARE Classic dan MIFARE DESFire.
Tabel 3 - Format perintah APDU
Tabel 4 - Format respons APDU
Deskripsi semua kode respons yang mungkin dapat ditemukan di sini [6]. Perangkat untuk berkomunikasi kartu dengan pembaca dapat ditemukan di [7].
Algoritma pengodean singkat adalah sebagai berikut:
- Dapatkan UID kartu. Ini adalah nomor unik, ini di-flash oleh pemasok dan tidak berubah.
- Baca data dari masing-masing sektor:
2.1 Masuk ke sektor menggunakan kunci default (0x00 atau 0xFF)
2.2 Membaca data dari tiga blok data - Jika data yang dibaca kosong, maka pergi ke catatan data
3.1 Masuk ke sektor menggunakan kunci default (0x00 atau 0xFF)
3.2 Menulis data ke tiga blok data sektor
3.3 Buat kunci baru berdasarkan UID kartu
3.4 Ganti kunci otorisasi di blok trailer dengan kunci baru.
2.2.1. Elykis
Printer Evolis menggunakan pembaca CL ELYCTIS . Menggunakan perpustakaan WinSCard (C ++ dan C #) dan jnasmartcardio (java), Anda dapat dengan mudah berinteraksi dengan pembaca. Agar dapat dengan cepat membuat perangkat lunak dengan antarmuka yang cukup sederhana, diputuskan untuk menulis kode dalam C # . Sebagian besar tim kami menulis kode di Jawa, yang membuat transisi ke C # kurang menyakitkan. Juga mendukung C # adalah kenyataan bahwa Windows lebih cocok untuk bekerja dengan printer.
Tabel di bawah ini menunjukkan contoh perintah APDU asli yang diterima oleh pembaca Elyctis.
Tabel 5 - Contoh Perintah APDU untuk Mifare Classic
Setelah memastikan pengodean kartu seperti Mifare Classic berhasil, kami beralih ke perintah untuk DESFire . Dengan referensi [8] Anda dapat menemukan contoh-contoh sederhana dari perintah dengan penjelasan. Namun, sudah berada di tim otorisasi, kami menemukan perilaku pembaca yang menarik. Singkatnya, pembaca membuat otorisasi penuh sendiri. Ternyata dukungan teknis Elyctis memberi kami firmware khusus yang mencakup kecerdasan easyDESFire . Hanya diperlukan untuk menentukan algoritma enkripsi yang digunakan pembaca. Dalam kasus kami, itu adalah 3DES.
Dalam kasus normal, otorisasi dilakukan dengan bertukar beberapa pesan.
- Kami mengirim perintah APDU untuk otorisasi: 0x90 0x0A 0x00 0x00 0x00 0x00 .
- Bergantung pada algoritma, array 8 byte acak yang dikodekan oleh kunci kartu datang sebagai respons terhadap perintah, kami menyatakannya dengan RandBEnc .
- Kami mendekripsi RandBEnc dan melakukan byte byte ke kiri. Nyatakan hasilnya oleh RandBLeft .
- Kami menghasilkan di sisi kami sebuah array 8 byte acak, RandA .
- Kami mengelompokkan RandA dan RandBLeft , mengenkripsi dengan kunci kartu dan mengirim array yang dihasilkan 16 byte.
- Kami mendapatkan kunci sesi sebagai respons, sehingga masuk ke aplikasi di peta.
Rincian lebih lanjut tentang proses otorisasi dapat ditemukan di sini [9]. Kode dari github juga sangat berguna [10].
Selama pengkodean, masalah muncul dengan penggunaan perintah dari sumber [8]. Dengan bantuan dukungan teknis Elyctis, kami menerima perintah yang diperlukan yang sesuai untuk kecerdasan easyDESFire .
Selama penyandian pada Elyctis, satu masalah besar pembaca terungkap - keterlambatan komunikasi . Seringkali, sinyal tidak mencapai pembaca, sehingga perintah yang sama kadang-kadang perlu dikirim beberapa kali. Perilaku ini kurang umum, tetapi masih diperhatikan saat mengirim perintah untuk dicetak. Akibatnya, mengirim semua perintah berlangsung dalam satu lingkaran, hingga eksekusi berhasil.
2.2.2. DUALi
Pabrikan memberikan SDK-nya untuk bekerja dengan encoder DUALi. Pada tahap bekerja dengan Mifare Classic, perintah untuk membaca dan menulis dapat diambil dari kode templat yang diberikan distributor kepada kami. Contohnya dalam C ++, Visual Basic, Java. Namun, itu mungkin untuk mengkompilasi kode sepenuhnya hanya dalam C ++. Permintaan pertama untuk contoh kode C #, kami ditolak, atau lebih tepatnya, distributor tidak memilikinya. Tidak ada programmer C ++ yang percaya diri di tim kami, jadi menulis semua kode sangat rumit dengan hal-hal yang sangat sederhana. Sebagai contoh:
- Bekerja dengan array
Saat meneruskan array sebagai parameter ke suatu fungsi, kami tidak meneruskan ukuran array. Untuk menentukan panjang array, fungsi sizeOf () digunakan. Namun, fungsi terus-menerus mengembalikan ukuran 4, terlepas dari ukuran sebenarnya dari array. Perilaku ini tidak segera direkam, karena beberapa array memang berukuran 4. - Konfigurasikan semua perpustakaan
Banyak rasa sakit yang dialami saat memasang semua lingkungan yang diperlukan. Kami terlalu terbiasa dengan hal-hal seperti maven dan apt (di Ubuntu). Program kami seharusnya memanggil API backend melalui permintaan HTTP dan mengenkripsi data di Base64. Untuk ini, diputuskan untuk menggunakan libcurl dan openssl libraries. Penulisan program itu sendiri terjadi di lingkungan Microsoft Visual Studio. Repotnya terpanjang dengan menginstal libcurl.
SDK itu sendiri adalah perpustakaan dll yang ditulis dalam C ++. Berkat contoh kode, kami relatif cepat menulis sebuah program untuk berinteraksi dengan kartu Mifare Classic. Seperti disebutkan di atas, perintah APDU untuk DUALi sangat spesifik, yaitu dua byte pertama tidak cocok dengan yang dapat ditemukan di Internet. Karena itu, saya harus menyalinnya secara membabi buta, karena, pada prinsipnya, semuanya berfungsi seperti yang diharapkan. Masalah dimulai dengan tes dengan kartu DESFire.
Prinsip perintah APDU untuk DESFire di DUALi setidaknya dapat dimengerti. Ada dua byte untuk {CLA, INS} , mereka tidak berubah, dan sebenarnya mereka mengatakan bahwa perintah ini ditujukan untuk kartu seperti DESFire. Parameter 1 dan 2 juga tidak berubah. Data yang dikirimkan sudah berisi bagian dari perintah DESFire asli, yaitu byte {INS, Data} . Selama sekitar satu minggu, kami tidak dapat memperoleh jawaban yang diharapkan untuk perintah sederhana, misalnya, perintah "pilih aplikasi". Di awal kode, kami meninggalkan eksekusi APDU dari perintah GetCardStatus, yang bukan format perintah untuk DESFire. Namun, dia bekerja dan mengeluarkan kartu UID. Ternyata, setelah eksekusi GetCardStatus, tim DESFire berhenti bekerja. Kelalaian ini ditentukan oleh pasukan kami, setelah dialog selama seminggu dengan pemasok, yang tidak mengarah pada apa pun.
Setelah satu bulan beroperasi dengan stabil pada program kami, kami sampai pada kebutuhan untuk menulis ulang program dalam C #. Alasan utamanya adalah pengaturan CI. Program C ++ dikompilasi menggunakan Microsoft Visual Studio. Semua server kami berjalan di Linux, jadi meluncurkan docker dengan Windows dan Visual Studio ToolKit yang diperlukan tidak dimungkinkan. Tentu saja, Anda dapat meningkatkan mesin virtual dengan Windows dan masih mengkonfigurasi semuanya untuk C ++, tetapi saya tidak benar-benar menginginkannya. Setelah berulang kali meminta kode sampel C # dari pabrikan, kami diberikan sebuah contoh. Anda dapat menulis sendiri, berdasarkan definisi metode pada contoh antarmuka C ++, tetapi ternyata tidak semua fungsi dijelaskan. Contohnya banyak membantu dan pada akhirnya kami menulis ulang program dalam C # dan mengatur CI.
2.3. Cetak
Sepintas, sepertinya pencetakan seharusnya tidak menimbulkan masalah, karena pada awalnya kita menggunakan printer cetak. , , .
. , , .
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 . , .
, .. . , .
Referensi
- 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/
- Lembar Data Mifare DESFire http://neteril.org/files/M075031_desfire.pdf
- Proyek GitHub untuk DESFire https://github.com/EsupPortail/esup-nfc-tag-server/blob/master/src/main/java/nfcjlib/core/DESFireEV1.java