Mifare Classic 1K的锁定机制

Md.*_*rim 5 java rfid nfc mifare contactless-smartcard

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 }
Run Code Online (Sandbox Code Playgroud)

验证命令

new byte[] { (byte) 0xFF, (byte) 0x86, (byte) 0x00,
                (byte) 0x00, (byte) 0x05, (byte) 0x01,(byte) 0x00, (byte) 0x04, 
                                    (byte) 0x60,(byte) 0x00 };
Run Code Online (Sandbox Code Playgroud)

这里"(字节)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};
Run Code Online (Sandbox Code Playgroud)

这里

(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
Run Code Online (Sandbox Code Playgroud)

是在扇区1的块5上写入的数据.

从扇区1和块5命令读取

new byte[] { (byte) 0xFF, (byte) 0x00, (byte) 0x00,
                (byte) 0x00, (byte) 0x05, (byte) 0xD4, (byte) 0x40,
                (byte) 0x01, (byte) 0x30, (byte) 0x05 };
Run Code Online (Sandbox Code Playgroud)

我的相关完整代码在这里......

我的问题是如何从特定扇区"锁定/只读"块?

Mic*_*and 5

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)          |
+-----------------------------+--------------+----+-----------------------------+
Run Code Online (Sandbox Code Playgroud)

因此访问位位于字节 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 |
        +-------+-------+-------+-------+-------+-------+-------+-------+
Run Code Online (Sandbox Code Playgroud)

其中 nCx_y = not 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 数据表中找到可能的访问条件的详细列表:https : //www.nxp.com/docs/en/data-sheet/MF1S50YYX_V1.pdf