在以前,RFID还是一个很高端的词,而且读写器也相当的贵,一般的极客很少接触的到。但是现在,随着物联网的发展,电子标签识别技术显得就尤为重要,现在,淘宝上已经有低价的RFID读写模块出现,相比以前的几百一个的读写器,现在读写模块可谓是相当便宜了。
RFID技术简介:
射频识别即RFID(Radio Frequency IDentification)技术,又称电子标签、无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。常用的有低频(125k~134.2K)、高频(13.56Mhz)、超高频,无源等技术。RFID读写器也分移动式的和固定式的,目前RFID技术应用很广,如:图书馆,门禁系统,食品安全溯源等。
工作原理
RFID技术的基本工作原理并不复杂:标签进入磁场后,接收解读器发出的射频信号,凭借感应电流所获得的能量发送出存储在芯片中的产品信息(Passive Tag,无源标签或被动标签),或者由标签主动发送某一频率的信号(Active Tag,有源标签或主动标签),解读器读取信息并解码后,送至中央信息系统进行有关数据处理。
一套完整的RFID系统, 是由阅读器(Reader)与电子标签(TAG)也就是所谓的应答器(Transponder)及应用软件系统三个部份所组成,其工作原理是Reader发射一特定频率的无线电波能量给Transponder,用以驱动Transponder电路将内部的数据送出,此时Reader便依序接收解读数据, 送给应用程序做相应的处理。
以RFID 卡片阅读器及电子标签之间的通讯及能量感应方式来看大致上可以分成:感应耦合(Inductive Coupling) 及后向散射耦合(BackscatterCoupling)两种。一般低频的RFID大都采用第一种式,而较高频大多采用第二种方式。
阅读器根据使用的结构和技术不同可以是读或读/写装置,是RFID系统信息控制和处理中心。阅读器通常由耦合模块、收发模块、控制模块和接口单元组成。阅读器和应答器之间一般采用半双工通信方式进行信息交换,同时阅读器通过耦合给无源应答器提供能量和时序。在实际应用中,可进一步通过Ethernet或WLAN等实现对物体识别信息的采集、处理及远程传送等管理功能。应答器是RFID系统的信息载体,应答器大多是由耦合原件(线圈、微带天线等)和微芯片组成无源单元。
所以,Z就入手了一个RFID读写器模块,以及一些M1卡(较为常用,加密等级一般的一种RFID标签卡)
M1卡总的来说,分成16个扇区,每个扇区有4个块,一共有64个块,采用16进制编码块的序号。每一个扇区的前三个块为数据块,可以存放一个16字节的数据,而第四个块为密码控制块,由KEYA(6字节),控制序列(4字节),KEYB(6字节)组成。这也就是我们常说的ISO14443A标准。
重点:
S50和S70的块分为数据块和控制块,对数据块的操作有“读”、“写”、“加值”、“减值(含传输和存储)”四种,对控制块的操作只有“读”和“写”两种。 S50和S70的每个扇区有两组密码KeyA和KeyB,所谓的“条件”就是针对这两组密码而言,包括“验证密码A可以操作(KeyA)”、“验证密码B可以操作(KeyB)”、“验证密码A或密码B都可以操作(KeyA|B)”、“验证哪个密码都不可以操作(Never)”四种条件。 这些“条件”和“操作”的组合被分成8种情况,正好可以用3位二进制数(C1、C2、C3)来表示。 数据块(每个扇区除区尾块之外的块)的存取控制如下表所示:
控制位 | 访 问 条 件 (验证哪个密码) | C1 | C2 | C3 | 读 | 写 | 加值 | 减值(含传输和存储) | 0 | 0 | 0 | KeyA|B | KeyA|B | KeyA|B | KeyA|B | 0 | 1 | 0 | KeyA|B | Never | Never | Never | 1 | 0 | 0 | KeyA|B | KeyB | Never | Never | 1 | 1 | 0 | KeyA|B | KeyB | KeyB | KeyA|B | 0 | 0 | 1 | KeyA|B | Never | Never | KeyA|B | 0 | 1 | 1 | KeyB | KeyB | Never | Never | 1 | 0 | 1 | KeyB | Never | Never | Never | 1 | 1 | 1 | Never | Never | Never | Never |
从表中可以看出, C1C2C3=000(出厂默认值)时最宽松,验证密码A或密码B后可以进行任何操作; C1C2C3=111无论验证哪个密码都不能进行任何操作,相当于把对应的块冻结了; C1C2C3=010和C1C2C3=101都是只读,如果对应的数据块写入的是一些可以给人看但不能改的基本信息,可以设为这两种模式; C1C2C3=001时只能读和减值,电子钱包一般设为这种模式,比如用S50做的公交电子车票,用户只能查询或扣钱,不能加钱,充值的时候先改变控制位使卡片可以充值,充完值再改回来。
控制块(每个扇区的区尾块)的存取控制如下表所示:
控制位 | 密码A | 存取控制 | 密码B | C1 | C2 | C3 | 读 | 写 | 读 | 写 | 读 | 写 | 0 | 0 | 0 | Never | KeyA | KeyA | Never | KeyA | KeyA | 0 | 1 | 0 | Never | Never | KeyA | Never | KeyA | Never | 1 | 0 | 0 | Never | KeyB | KeyA|B | Never | Never | KeyB | 1 | 1 | 0 | Never | Never | KeyA|B | Never | Never | Never | 0 | 0 | 1 | Never | KeyA | KeyA | KeyA | KeyA | KeyA | 0 | 1 | 1 | Never | KeyB | KeyA|B | KeyB | Never | KeyB | 1 | 0 | 1 | Never | Never | KeyA|B | KeyB | Never | Never | 1 | 1 | 1 | Never | Never | KeyA|B | Never | Never | Never |
从表中可以看出, 密码A是永远也读不出来的,如果用户的数据块指定了验证密码A却忘了密码A,也就意味着这个数据块作废了,但本扇区其他数据块和其他扇区的数据块不受影响; 存取控制总是可以读出来的,只要别忘了密码A或密码B; 存取控制的写控制在设置时一定要小心,一旦弄成了“Never”,则整个扇区的存取条件再也无法改变,后悔都找不到地方,只能仰天长叹了; C1C2C3=001(出厂默认值)时最宽松,除了密码A不能读之外,验证了密码A其他读写操作都可以进行; 还有一个有意思的现象是当C1C2C3=000、C1C2C3=010和C1C2C3=001时,所有的操作都不使用密码B,这时候密码B占据的6个字节可以提供给用户作为普通数据存储用,相当于每个扇区增加了6字节的用户可用存储容量。 由于卡片出厂的默认值C1C2C3=001,所以对于新买来的卡片,不要使用密码B进行认证,否则会导致区尾块和数据块都无法进行任何操作。我测试过不同厂家的新卡片,有的验证密码B后确实扇区内的所有块都无法操作,但有的卡片不能操作区尾块,却可以操作数据块,本文以NXP的原装卡为准。当然用户可以放心,新卡不让你验证密码B而你却验证了,不会对卡照成什么伤害,改回用密码A验证,卡片还是可以正常使用的。 S50的每个扇区有4个块,这四个块的存取控制是相互独立的,每个块需要3个bit,四个块共使用12个bit。在保存的时候,为了防止控制位出错,同时保存了这12个bit的反码,这样一个区的存储控制位在保存时共占用24bit的空间,正好是3个字节。我们前面说存取控制字有四个字节(区尾块的Byte6~Byte9),实际上只使用的Byte6、Byte7和Byte8,Byte9没有用,用户可以把Byte9作为普通存储空间使用。各块控制位存储格式如下:
|
| 块3(区尾块) | 块2 | 块1 | 块0 | Byte6 | b3 b2 b1 b0 | 块3-C1-反 | 块2-C1-反 | 块1- C1-反 | 块0-C1-反 | b7 b6 b5 b4 | 块3-C2-反 | 块2-C2-反 | 块1- C2-反 | 块0-C2-反 | Byte7 | b3 b2 b1 b0 | 块3-C3-反 | 块2-C3-反 | 块1- C3-反 | 块0-C3-反 | b7 b6 b5 b4 | 块3-C1 | 块2-C1 | 块1- C1 | 块0-C1 | Byte8 | b3 b2 b1 b0 | 块3-C2 | 块2-C2 | 块1- C2 | 块0-C2 | b7 b6 b5 b4 | 块3-C3 | 块2-C3 | 块1- C3 | 块0-C3 |
由于出厂时数据块控制位的默认值是C1C2C3=000,控制块的默认值是C1C2C3=001,而Byte9一般是69H,所以出厂白卡的控制字通常是FF078069H. S70的前32个数据块结构和S50完全一致。后8个数据块每块有15个普通数据块和一个控制块。显然如果每个数据块块单独控制将需要8字节的控制字,控制块中放不下这么多控制字。解决的办法是这15个数据块分为三组,块0~4为第一组,块5~9为第二组,块10~15为第三组,每组共享三个控制位,也就是说每组控制位C1C2C3控制5个数据块的存取权限,从而与前32个扇区兼容。
这一部分对于新手来说可能很难读懂,但其实理解了就很简单,前面我们说到,每一个扇区的第四个块有一个控制序列,为4个字节,其中又只有3个是有效控制字节。实际上每一个字节,例如FF为字节6,转换成二进制以后就=1111 1111,那么对照下面这个表,可以看到每一个区域都有了对照,再和上文所说的控制序列码表分别对应,就可以知道了每一个表的读写权限。就一目了然了~
今天在这里只是做一个RFID的初探和协议的理解,具体的应用和PC端操作,请关注下文~,下面是Z做的一个小的读写器~嘿嘿~
|