射频识别(RFID)技术

ISO 14443

作者:陈广 日期:2019-1-24


ISO 14443 协议简介

ISO 14443 协议是 Contactless Card Standards(非接触式 IC 卡标准)协议。ISO 14443 协议由四个部分组成:

  • ISO14443-1:定义了IC卡的物理特性。
  • ISO14443-2:定义了频率、射频能量、编码等内容。
  • ISO14443-3:定义了 TypeA/TypeB 的初始化和防冲突机制。其中 Mifare1 就只到这一层。
  • ISO14443-4:定义了卡片的数据传输协议。

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 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块)用于存放厂商代码,已经固化,不可更改,卡片序列号就存放在这里。其结构如下图所示:

图 0:0扇区0块存储格式

其中:

  • byte0-byte3 为标签的 UID,它以读写器读到的 UID 一致。
  • byte4 为验证字节 Check Byte,算法是将 UID 的 4 个字节进行异或运算。
  • byte5 和 byte6 为卡类型,Mifare S50 卡的 byte5 = 0x08,代表容量标志,byte6 = 0x04,表示 S50 卡。
  • byte7-byte15 为自定义厂商号,由厂商自行定义。

除了厂商块和控制块,卡片中其余的块都是数据块,可用于存贮数据。数据块可作两种应用:

  1. 用作一般的数据保存,可以进行读、写操作。例如用于非接触门禁管理。
  2. 用作数据值,可以进行初始化值、加值、减值、读值操作。例如用于电子钱包,可直接控制存储值,如增值、减值。

数据块和值块有什么区别呢?无论块中的内容是什么,你都可以把他看成普通数据,即使它是一个值块。但是并不是任何数据都可以看成是值,因为值块有一个比较严格的格式要求。值块中值的长度为4个字节的补码,其表示的范围(-2147483648~2147483647),值块的存储格式如下:

图 1:值块存储格式
  • VALUE :有符号 4 字节数值,其表示的范围(-2147483648~2147483647)。数值的最低字节存储在最低地址字节。负值以标准的2的补码形式存储。出于数据完整性和安全原因,一个数值重复存储三次,两次不取反,一次取反(下划线表示取反)。
  • addr :1 字节地址,当进行备份管理时,可用于保存块的地址。同一地址重复保存四次。两次取反(下划线表示取反),两次不取反。在increment、decrement、restore 和 transfer 操作中,地址保持不变。它只能通过write命令更改。

通过以上解释,您应该明白了为什么明明是 16 字节长的数据块为何只能保存 4 个字节的数据。

每个扇区的区尾块为控制块,包括了6字节密码 A、4 字节存取控制、6字节密码 B。例如一张新出厂的卡片控制块内容如下:

图 2:值块存储格式

新卡的出厂密码一般是密码A为 A0A1A2A3A4A5,密码B为 B0B1B2B3B4B5,或者密码A和密码B都是6个 FF。存取控制用以设定扇区中各个块(包括控制块本身)的存取条件,这部分有点复杂。

存取控制

存取控制指符合什么条件才能对卡片进行操作。S50 和 S70 的块分为数据块和控制块,对数据块的操作有“读”、“写”、“加值”、“减值(含传输和转存)”四种,对控制块的操作只有“读”和“写”两种。

S50 和 S70 的每个扇区有两组密码 KeyA 和 KeyB,所谓的“条件”就是针对这两组密码而言,包括四种条件:

  • 验证密码A可以操作(KeyA)
  • 验证密码B可以操作(KeyB)
  • 验证密码A或密码B都可以操作(KeyA|B)
  • 验证哪个密码都不可以操作(Never)

这些“条件”和“操作”的组合被分成8种情况,正好可以用3位二进制数(C1、C2、C3)来表示。数据块(每个扇区除区尾块之外的块)的存取控制如下表所示:

图 3:数据块存取控制

从表中可以看出:

  • C1C2C3=000:出厂默认值,最为宽松,验证密码A或密码B后可以进行任何操作;
  • C1C2C3=111:无论验证哪个密码都不能进行任何操作,相当于把对应的块冻结了;
  • C1C2C3=010 和 C1C2C3=101:都是只读,如果对应的数据块写入的是一些可以给人看但不能改的基本信息,可以设为这两种模式;
  • C1C2C3=001:只能读和减值,电子钱包一般设为这种模式,比如用 S50 做的公交电子车票,用户只能查询或扣钱,不能加钱,充值的时候先改变控制位使卡片可以充值,充完值再改回来。

控制块(每个扇区的区尾块)的存取控制如下表所示:

图 4:控制块存取控制

密码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 作为普通存储空间使用。各块控制位存储格式如下:

图 5:控制位存储格式

由于出厂时数据块控制位的默认值是 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的通讯流程如下图所示:

图 6:通讯流程

复位应答(Answer to request)

读写器呼叫磁场内的卡片,卡片对呼叫做出应答。对刚进入磁场得到电复位处于休闲状态的卡片,卡请求(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。

防冲突机制(Anticollision Loop)

当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作,未选中的则处于空闲模式等待下一次选卡,该过程返回一个被选中的卡的序列号。序列号 Serial Number 存储在卡片的 Block 0 中,共有5个字节,实际有用的为4个字节,另一个字节为序列号 Serial Number 的校验字节。智能的反冲突功能允许同一工作区域中有不止一张卡同时工作。反冲突算法每次只选择一张卡确保对被选中的卡正确执行操作,而且同一区域中的其他卡不会破坏数据。

选择卡片(Select Tag)

选择被选中卡的序列号,并同时返回卡的容量代码 Tag Size(前08,代表容量返回值,现已改88,无特殊意义)。RWD 使用选择卡命令选中其中一张卡进行确认和存储器相关操作,卡返回 Answer To Select ATS码=08h, RWD 通过 ATS 可以确定被选中的卡的类型。

三次相互认证(3 Pass Authentication)

Mifare 系列产品不仅卡片要认证读写器的身份,读写器也要认证卡片的身份,这种认证称为相互认证。常见的认证方法是使用密码或者叫口令。口令一旦被听到,就会泄露。而密码没有规律性,而且可通过随机数加密,所以相互认证是利用随机数加密验证的。Mifare 系列所采用的相互认证机制被称为**三次相互认证*,如下图所示。

图 7:三次相互认证
  1. 读写器向卡发指令,指定要访问的区,及密钥A或B。
  2. 卡从位块读取区密钥和访问条件。然后,卡向读写器发送随机数B。(第一轮)
  3. 读写器利用密钥和随机数计算回应值。回应值 A 连同读写器的随机数 B,发送给卡(第二轮)。
  4. 卡通过与自己的随机数比较,验证读写器的回应值A,再计算回应值并发送(第三轮)。
  5. 读写器通过比较,验证卡的回应值。

在第一个随机数传送之后,卡与读写器之间的通讯都是加密的。认证的过程中多次提到“事先约定的算法”,到底是什么样的算法呢。这个没有具体规定,但有一个要求是必须的,就是这个算法一定要有密钥和随机数的参与。认证过程中的任何一环出现差错,整个认证将告失败。必须从新开始。

存储器操作

三次相互认证后可执行下列操作:

  • 读(Read):读取一个块的内容,包括普通数据块和值块。
  • 写(Write):写数据到一个块,包括普通数据块和值块,值块中写入了非法格式的数据,值块就变成了普通数据块。
  • 减值(Decrement):减少数据块内的数值,并将结果保存在临时内部数据寄存器中。
  • 加值(Increment):增加数据块内的数值,并将结果保存在临时内部数据寄存器中。
  • 传输(Transfer):将数据寄存器中的内容写入块中。
  • 转存(Restore):将块中的内容存储到数据寄存器中。
  • 暂停(Halt ):将卡置于睡眠工作状态,只有使用 WAKE-UP 命令才能唤醒。

事实上加值和减值操作并不是直接在 Mifare 的块中进行的。这两个命令先把 Block 中的值读出来,然后进行加或减,加减后的结果暂时存放在卡上的易失性数据寄存器(RAM)中,然后再利用命令传输(Transfer)将数据寄存器中的内容写入块中。与传输(Transfer)相对应的命令是转存(Restore),作用是将块中的内容存到数据寄存器中,不过这个命令很少用到。

;

© 2018 - IOT小分队文章发布系统 v0.3