Смарт-карты Mifare 1K в приложении .NET (C#, VB.NET)

В данной статье опишу как быстро интегрировать в свое приложение механизм авторизации при помощи бескотактных смарт-карт. Кстати такая есть в современных “биометрических” заграничных паспортах.

Исходные данные

  1. Считыватель смарт-карт ACR-122U.
  2. Карты, метки, брелоки, браслеты MIFARE 1K для хранения ключа.
  3. Готовый модуль из sdk-acr122 для отправки ADPU команд.

Первые две позиции в огромном количестве как на eBay, так и на Aliexpress. Так же в исходные данные хочу внести ясность, что этой статьи не достаточно чтобы стать гуру смарт-карт, а только для того чтобы через пол часа запустить механизм их использования в своем проекте.

Общая теория

У карты MIFARE 1К шестнадцать (0 – 15) секторов, в каждом секторе 4 (0 – 3) блока по 16 байт каждый. Последний, блок каждого сектора содержит информацию о ключах (их 2 – A и B) и маске доступа к блокам данных (1-3) по каждому из ключей.

Организация памяти карт MIFARE 1KНикакого сервиса по поводу сквозного доступа ко всей памяти карты которой у 1К = 15 * 3 * 16 = 720 байт памяти (остальное под ключами) – нет.

Битовая маска задает что можно делать ключом KEY_A и что KEY_B. Авторизовываться необходимо для каждого сектора, другими словами вы можете назначить свои KEY_A и KEY_B для каждого сектора и хранить там разные данные или взаимосвязанные и при дальнейшем использовании “раскрывать матрешку” по своему алгоритму.

В нашем примере, когда надо организовать авторизацию в нашем приложении, нам будет достаточно KEY_A. Думаю не надо объяснять, что второй ключ надо при этом сменить с значения по умолчанию (FFFFFFFFFF  или ноли) т.к. используя ключ KEY_B тоже можно “натворить делов”.

Сценарий чтения/записи

  1. Загрузка ключей (1 или 2) в память ридера. Обращу внимание, что ключи стираются из памяти ридера при отключении от USB порта.
  2. Авторизация любого блока из сектора, в котором планируется чтение/запись. Нет необходимости авторизации каждого блока внутри одного сектора.
  3. Чтение/запись.