Запорный механизм Mifare Classic 1K

Процедура Mifare Classic 1K является

  1. Опрос на теги
  2. Аутентифицировать эти теги
  3. Если аутентификация прошла успешно, тогда читайте / пишите.

Я уже выполнил эти процедуры, а также прочитал и записал данные из определенных секторов.

Команда для опроса тегов

new byte[] { (byte) 0xFF, (byte) 0x00, (byte) 0x00,
                (byte) 0x00, (byte) 0x04, (byte) 0xD4, (byte) 0x4A,
                (byte) 0x01, (byte) 0x00 }

Команда аутентификации

new byte[] { (byte) 0xFF, (byte) 0x86, (byte) 0x00,
                (byte) 0x00, (byte) 0x05, (byte) 0x01,(byte) 0x00, (byte) 0x04, 
                                    (byte) 0x60,(byte) 0x00 };

Здесь "(byte) 0x01" это Сектор 1

И написать в секторе 1, блок 5

new byte[] { (byte) 0xFF, (byte) 0x00, (byte) 0x00,(byte) 0x00, (byte) 0x15, (byte) 0xD4,
             (byte)    0x40,(byte) 0x01, (byte) 0xA0, (byte) 0x05,(byte) 0x01, (byte) 0x02, 
             (byte) 0x03,(byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07,(byte) 0x08, 
             (byte) 0x09,(byte) 0x0A,(byte) 0x0B, (byte) 0x0C, (byte) 0x0D,(byte) 0x0E, 
             (byte) 0x0F, (byte) 0x10};

Вот

(byte) 0x01, (byte) 0x02, (byte) 0x03,(byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07,(byte) 0x08,(byte) 0x09,(byte) 0x0A,(byte) 0x0B, (byte) 0x0C, (byte) 0x0D,(byte) 0x0E,(byte) 0x0F,(byte) 0x10

это данные, которые пишутся в блоке 5 в секторе 1.

Командачтения из сектора 1 и блока 5

new byte[] { (byte) 0xFF, (byte) 0x00, (byte) 0x00,
                (byte) 0x00, (byte) 0x05, (byte) 0xD4, (byte) 0x40,
                (byte) 0x01, (byte) 0x30, (byte) 0x05 };

Мой соответствующий полный код здесь...

Моя проблема в том, как я могу "заблокировать / сделать только для чтения" блок из определенного сектора?

1 ответ

Решение

Ключи аутентификации и условия доступа для каждого сектора карты MIFARE находятся в последнем блоке этого сектора (трейлер сектора). Вы можете обновить этот блок новыми условиями доступа и ключами аутентификации, используя обычную команду записи.

Секторный трейлер выглядит так:

+-----------------------------+--------------+----+-----------------------------+
|  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 | 10 | 11 | 12 | 13 | 14 | 15 |
+-----------------------------+--------------+----+-----------------------------+
|            Key A            | Access Bits  | GP |            Key B            |
|          (6 bytes)          |  (3 bytes)   | B  |          (6 bytes)          |
+-----------------------------+--------------+----+-----------------------------+

Таким образом, биты доступа расположены в байте 6-8 и выглядят так:

        +-------+-------+-------+-------+-------+-------+-------+-------+
        | Bit 0 | Bit 1 | Bit 2 | Bit 3 | Bit 4 | Bit 5 | Bit 6 | Bit 7 |
        +-------+-------+-------+-------+-------+-------+-------+-------+
Byte 6: | nC2_3 | nC2_2 | nC2_1 | nC2_0 | nC1_3 | nC1_2 | nC1_1 | nC1_0 |
        +-------+-------+-------+-------+-------+-------+-------+-------+
Byte 7: |  C1_3 |  C1_2 |  C1_1 |  C1_0 | nC3_3 | nC3_2 | nC3_1 | nC3_0 |
        +-------+-------+-------+-------+-------+-------+-------+-------+
Byte 8: |  C3_3 |  C3_2 |  C3_1 |  C3_0 |  C2_3 |  C2_2 |  C2_1 |  C2_0 |
        +-------+-------+-------+-------+-------+-------+-------+-------+

Где nCx_y = не Cx_y, а "C1_x, C2_x, C3_x" - условие доступа для блока x:

  • C1_3, C2_3, C3_3: секторный трейлер (блок 3 в этом секторе)
  • C1_2, C2_2, C3_2: блок 2 в этом секторе
  • C1_1, C2_1, C3_1: блок 1 в этом секторе
  • C1_0, C2_0, C3_0: блок 0 в этом секторе

Вы можете найти подробный список возможных условий доступа в спецификации MIFARE 1K: http://www.nxp.com/documents/data_sheet/MF1S503x.pdf

Другие вопросы по тегам