在众多NFC卡中最常见的是M1卡(Mifare Classic S50)。由资料得知,此类NFC卡的UID保存在第0扇区第0块的签四个字节。既然涉及到了扇区、块的知识,我马上想到的是像SD卡以及Flash存储器件的那种扇区、块知识了。常见的M1卡的存储空间是1KB(1024字节),被组织成一个规整的16扇区,每个扇区4块,每个块16字节的形式。
一、M1卡的存储结构
1、第0扇区的块0中在出厂时就被写入了唯一的厂商代码(UID),并且是固化、不可更改的,相当于这张卡的“身份证号。
2、在每个扇区中的第3块(物理顺序上的第四个块)存放着访问这个扇区的存取控制锁。其中:
2.1密码A(KeyA):6个字节
2.2存取控制(Access Bits):4个字节
2.3密码B(KeyA):6个字节
密码A和密码B可以由用户自己设置,分别用于读、写的控制。而存取控制的4个字节用于更加精细的读写控制,用来控制所在扇区的每个块的读写、加减值控制时使用哪个密码的控制。
3、每个扇区的前三个块(编号0、1、2)作为数据块使用。
二、M1卡的操作指令
在操作上,按照以下流程处理:
1、寻找到场内的卡片并选中它。
2、向目标扇区提供正确的Key A或Key B进行认证。
3、如果认证成功,可以对已认证扇区的数据块进行读(Read)、写(Write)等操作
常见的M1卡的APDU指令有:
功能 | APDU指令示例(十六进制) | 简要说明 |
获取UID | FF CA 00 00 00 | 读取卡片的唯一标识符(UID)。 |
认证扇区 (Key A) | FF 86 00 00 05 01 00 [块地址] 60 [6字节密钥] | 使用Key A认证指定扇区。[块地址]为扇区尾部块地址(如扇区0的尾部块地址是03),[密钥]为6字节密钥。 |
读取数据块 | FF B0 00 [块地址] 10 | |
写入数据块 | FF D6 00 [块地址] 10 [16字节数据] | 向指定[块地址]写入16字节数据。 |
如果数据块被配置为“数值块”(Value Block)格式,M1卡还支持专用的增量(Increment)、减量(Decrement)和恢复(Restore)指令,用于实现电子钱包等场景。
操作码 (Opcode):增量操作为C1,减量为C0,恢复为C2。
操作数 (Operand):一个4字节的有符号整数,用于指定增减的数值。
再次强调,这些操作指令是通过读卡器(例如RC522读卡器)使用射频通讯模式传递给NFC卡的指令,不是外部设备与读卡器之间的通讯指令。另外不同厂家出的读卡器不同,操作指令也会发生变化。
我要赚赏金
