作者:陈广 日期:2019-1-24
ISO 14443 协议是 Contactless Card Standards(非接触式 IC 卡标准)协议。ISO 14443 协议由四个部分组成:
ISO 14443 定义了 TYPE A、TYPE B 两种类型协议,通信速率为 106kbit/s,它们的不同主要在于载波的调制深度及位的编码方式。TYPE A 采用开关键控( On-Off keying)的曼切斯特编码, TYPE B 采用 NRZ-L 的 BPSK 编码。 TYPEB 与 TYPE A 相比,具有传输能量不中断、速率更高、抗干扰能力列强的优点。 RFID 的核心是防冲撞技术,这也是和接触式 IC 卡的主要区别。 ISO 14443-3 规定了TYPEA 和 TYPE B 的防冲撞机制。二者防冲撞机制的原理不同,前者是基于位冲撞检测协议,而 TYPE B 通信系列命令序列完成防冲撞。 ISO 15693 采用轮询机制、分时查询的方式完成防冲撞机制。防冲撞机制使得同时处于读写区内的多张卡的正确操作成为可能,既方便了操作,也提高了操作的速度。
Mifare S50 和 Mifare S70 又常被称为 Mifare Standard、Mifare Classic、MF1,是遵守 ISO14443A 标准的卡片中应用最为广泛、影响力最大的的一员。而 Mifare S70 的容量是 S50 的4倍,S50 的容量是1K字节,S70 的容量为4K字节。读写器对卡片的操作时序和操作命令,二者完全一致。
Mifare S50 和 Mifare S70 的每张卡片都有一个4字节的全球唯一序列号,卡上数据保存期为10年,可改写10万次,读无限次。一般的应用中,不用考虑卡片是否会被读坏写坏的问题,当然暴力硬损坏除外。
Mifare S50 和 Mifare S70 的区别主要有两个方面。一是读写器对卡片发出请求命令,二者应答返回的卡类型(ATQA)字节不同。Mifare S50 的卡类型(ATQA)是 0004H,Mifare S70 的卡类型(ATQA)是 0002H。另一个区别就是二者的容量和内存结构不同。
Mifare S50 把 1K 字节的容量分为 16 个扇区(Sector0-Sector15),每个扇区包括 4 个数据块(Block0-Block3,我们也将16个扇区的64个块按绝对地址编号为0~63),每个数据块包含16个字节(Byte0-Byte15),64*16=1024字节。如下表所示:
扇区号 | 块号 | 内容 | 块类型 | 总块号 |
---|---|---|---|---|
扇区0 | 块0 | 厂商代码 | 厂商块 | 0 |
块1 | 数据块 | 1 | ||
块2 | 数据块 | 2 | ||
块3 | 密码A 存取控制 密码B | 控制块 | 3 | |
扇区1 | 块0 | 数据块 | 4 | |
块1 | 数据块 | 5 | ||
块2 | 数据块 | 6 | ||
块3 | 密码A 存取控制 密码B | 控制块 | 7 | |
... | ... | ... | ... | ... |
扇区15 | 块0 | 数据块 | 60 | |
块1 | 数据块 | 61 | ||
块2 | 数据块 | 62 | ||
块3 | 密码A 存取控制 密码B | 控制块 | 63 |
Mifare S70 把 4K 字节的容量分为40个扇区(Sector0-Sector39),其中前32个扇区(Sector0-Sector31)的结构和 Mifare S50 完全一样,每个扇区包括4个数据块(Block0-Block3),后8个扇区每个扇区包括16个数据块(Block0-Block15)。我们也将40个扇区的256个块按绝对地址编号为 0~255,每个数据块包含16个字节(Byte0-Byte15),256*16=4096。如下表所示:
扇区号 | 块号 | 内容 | 块类型 | 总块号 |
---|---|---|---|---|
扇区0 | 块0 | 厂商代码 | 厂商块 | 0 |
块1 | 数据块 | 1 | ||
块2 | 数据块 | 2 | ||
块3 | 密码A 存取控制 密码B | 控制块 | 3 | |
... | ... | ... | ... | ... |
扇区31 | 块0 | 数据块 | 124 | |
块1 | 数据块 | 125 | ||
块2 | 数据块 | 126 | ||
块3 | 密码A 存取控制 密码B | 控制块 | 127 | |
扇区32 | 块0 | 数据块 | 128 | |
块1 | 数据块 | 129 | ||
... | ... | 数据块 | ... | |
块14 | 数据块 | 142 | ||
块15 | 密码A 存取控制 密码B | 控制块 | 143 | |
... | ... | ... | ... | ... |
扇区39 | 块0 | 数据块 | 240 | |
块1 | 数据块 | 241 | ||
... | ... | 数据块 | ... | |
块14 | 数据块 | 254 | ||
块15 | 密码A 存取控制 密码B | 控制块 | 255 |
每个扇区都有一组独立的密码及访问控制,放在每个扇区的最后一个 Block,这个 Block 又被称为区尾块,S50 是每个扇区的 Block3,S70 的前32个扇区也是 Block3,后8个扇区是 Block15。
S50 和 S70 的0扇区0块(即绝对地址0块)用于存放厂商代码,已经固化,不可更改,卡片序列号就存放在这里。其结构如下图所示:
其中:
除了厂商块和控制块,卡片中其余的块都是数据块,可用于存贮数据。数据块可作两种应用:
数据块和值块有什么区别呢?无论块中的内容是什么,你都可以把他看成普通数据,即使它是一个值块。但是并不是任何数据都可以看成是值,因为值块有一个比较严格的格式要求。值块中值的长度为4个字节的补码,其表示的范围(-2147483648~2147483647),值块的存储格式如下:
通过以上解释,您应该明白了为什么明明是 16 字节长的数据块为何只能保存 4 个字节的数据。
每个扇区的区尾块为控制块,包括了6字节密码 A、4 字节存取控制、6字节密码 B。例如一张新出厂的卡片控制块内容如下:
新卡的出厂密码一般是密码A为 A0A1A2A3A4A5,密码B为 B0B1B2B3B4B5,或者密码A和密码B都是6个 FF。存取控制用以设定扇区中各个块(包括控制块本身)的存取条件,这部分有点复杂。
存取控制指符合什么条件才能对卡片进行操作。S50 和 S70 的块分为数据块和控制块,对数据块的操作有“读”、“写”、“加值”、“减值(含传输和转存)”四种,对控制块的操作只有“读”和“写”两种。
S50 和 S70 的每个扇区有两组密码 KeyA 和 KeyB,所谓的“条件”就是针对这两组密码而言,包括四种条件:
这些“条件”和“操作”的组合被分成8种情况,正好可以用3位二进制数(C1、C2、C3)来表示。数据块(每个扇区除区尾块之外的块)的存取控制如下表所示:
从表中可以看出:
控制块(每个扇区的区尾块)的存取控制如下表所示:
密码A是永远也读不出来的,如果用户的数据块指定了验证密码A却忘了密码A,也就意味着这个数据块作废了,但本扇区其他数据块和其他扇区的数据块不受影响;
存取控制总是可以读出来的,只要别忘了密码A或密码B;存取控制的写控制在设置时一定要小心,一旦弄成了“Never”,则整个扇区的存取条件再也无法改变。
C1C2C3=001(出厂默认值)时最宽松,除了密码A不能读之外,验证了密码A其他读写操作都可以进行。
还有一个有意思的现象是当 C1C2C3=000、C1C2C3=010 和 C1C2C3=001 时,所有的操作都不使用密码B,这时候密码B占据的6个字节可以提供给用户作为普通数据存储用,相当于每个扇区增加了6字节的用户可用存储容量。
由于卡片出厂的默认值 C1C2C3=001,所以对于新买来的卡片,不要使用密码B进行认证,否则会导致区尾块和数据块都无法进行任何操作。部分厂家的新卡片验证密码B后确实扇区内的所有块都无法操作,但有的卡片不能操作区尾块,却可以操作数据块。当然用户可以放心,新卡不让你验证密码B而你却验证了,不会对卡照成什么伤害,改回用密码A验证,卡片还是可以正常使用的。
S50 的每个扇区有4个块,这四个块的存取控制是相互独立的,每个块需要3个bit,四个块共使用12个bit。在保存的时候,为了防止控制位出错,同时保存了这12个bit的反码,这样一个区的存储控制位在保存时共占用24bit的空间,正好是3个字节。我们前面说存取控制字有四个字节(区尾块的Byte6~Byte9),实际上只使用的 Byte6、Byte7和Byte8,Byte9 没有用,用户可以把 Byte9 作为普通存储空间使用。各块控制位存储格式如下:
由于出厂时数据块控制位的默认值是 C1C2C3=000,控制块的默认值是 C1C2C3=001,而 Byte9 一般是 69H,所以出厂白卡的控制字通常是 FF078069H。
S70 的前32个数据块结构和 S50 完全一致。后8个数据块每块有15个普通数据块和一个控制块。显然如果每个数据块块单独控制将需要8字节的控制字,控制块中放不下这么多控制字。解决的办法是这15个数据块分为三组,块0~4为第一组,块5~9为第二组,块10~15为第三组,每组共享三个控制位,也就是说每组控制位 C1C2C3 控制5个数据块的存取权限,从而与前32个扇区兼容。
读写器与S50和S70的通讯流程如下图所示:
读写器呼叫磁场内的卡片,卡片对呼叫做出应答。对刚进入磁场得到电复位处于休闲状态的卡片,卡请求(REQA,0x26);对于已进行过读写操作并进入休眠状态的卡片,卡唤醒(WAKE-UP,0x52)。其中卡请求(REQA)只能呼叫处于休闲(Idle)状态的卡片,卡唤醒(WAKE-UP)可以呼叫所有卡片,包括处于休眠(Halt)和休闲状态的卡片。
收到卡呼叫命令后,卡片将对命令做出应答(Answer To Request,ATQA), 读写器以特定的协议与它通讯,从而确定该卡是否为 M1 射频卡,即验证卡片的卡型。ATQA 有两个字节,第一个字节的值没有规定(RFU),第二个字节的高两位 b7、b6 表示卡序列号长度 (00
为4字节,01
为7字节,10
为10字节), b5位的值没有规定(RFU),b4-b0表示是否遵守面向比特的防冲突机制,如果遵守,b4-b0必须有且仅有1位为1。通常情况下,Mifare S50 的 ATQA 是 0004H,Mifare S70 的 ATQA 是 0002H。
当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作,未选中的则处于空闲模式等待下一次选卡,该过程返回一个被选中的卡的序列号。序列号 Serial Number 存储在卡片的 Block 0 中,共有5个字节,实际有用的为4个字节,另一个字节为序列号 Serial Number 的校验字节。智能的反冲突功能允许同一工作区域中有不止一张卡同时工作。反冲突算法每次只选择一张卡确保对被选中的卡正确执行操作,而且同一区域中的其他卡不会破坏数据。
选择被选中卡的序列号,并同时返回卡的容量代码 Tag Size(前08
,代表容量返回值,现已改88
,无特殊意义)。RWD 使用选择卡命令选中其中一张卡进行确认和存储器相关操作,卡返回 Answer To Select ATS码=08h, RWD 通过 ATS 可以确定被选中的卡的类型。
Mifare 系列产品不仅卡片要认证读写器的身份,读写器也要认证卡片的身份,这种认证称为相互认证。常见的认证方法是使用密码或者叫口令。口令一旦被听到,就会泄露。而密码没有规律性,而且可通过随机数加密,所以相互认证是利用随机数加密验证的。Mifare 系列所采用的相互认证机制被称为**三次相互认证*,如下图所示。
在第一个随机数传送之后,卡与读写器之间的通讯都是加密的。认证的过程中多次提到“事先约定的算法”,到底是什么样的算法呢。这个没有具体规定,但有一个要求是必须的,就是这个算法一定要有密钥和随机数的参与。认证过程中的任何一环出现差错,整个认证将告失败。必须从新开始。
三次相互认证后可执行下列操作:
事实上加值和减值操作并不是直接在 Mifare 的块中进行的。这两个命令先把 Block 中的值读出来,然后进行加或减,加减后的结果暂时存放在卡上的易失性数据寄存器(RAM)中,然后再利用命令传输(Transfer)将数据寄存器中的内容写入块中。与传输(Transfer)相对应的命令是转存(Restore),作用是将块中的内容存到数据寄存器中,不过这个命令很少用到。
;