除了支付/刷卡还能干嘛?三分钟教你玩转RFID

作者: 恒小发
2017-01-03
2521
原创

常见的RFID的应用场景就是各种门卡,水卡,饭卡等。网上常见的所谓RFID破解都是用工具读数据,改金额。但通信的过程,攻击原理,crypto1的缺陷点等的干货真是跟在辣子鸡里找鸡一样难。这里我希望通过几篇文章,把这些都捋一下,博各位看官一乐。


话说,到底什么是RFID呢?


 ▪ 射频识别(英文:Radio Frequency IDentification,缩写:RFID)是一种无线通信技术,可以通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或者光学接触。(摘自维基百科)。


说到RFID,必须得多一句说说现在很火的NFC。


 ▪ 近场通信(英语:Near Field Communication,缩写:NFC),又称近距离无线通信,是一种短距离的高频无线通信技术,允许电子设备之间进行非接触式点对点数据传输,在十厘米(3.9英寸)内交换数据。


这两者的关系可以类比于爸爸和儿子,当然RFID是爸爸。RFID频段宽,有低频,高频,超高频等等,频段不同,功率不同(当然也部分取决于读卡器的天线),有效通信距离不同;NFC只限于13.56mhz,有效通信距离也限于10公分左右。RFID通信是单向的;NFC可以双向。NFC可以支持类似 p2p的模式;RFID却是一对多的形式等等。


一般我们生活中能遇到的有ID和IC卡,IC卡全称集成电路卡(Integrated Circuit Card),又称智能卡(Smart Card),可读写,容量大,有加密功能,数据记录可靠,使用更方便,如一卡通系统,消费系统等。目前主要有PHILIPS的Mifare系列卡。属一般高频。


ID卡全称身份识别卡(Identification Card),是一种不可写入的感应卡,含固定的编号,主要有台湾SYRIS的EM格式,美国HID,TI,MOTOROLA等各类ID卡。属一般低频。



◤入门普及
既然要讲原理,首先得讲一下一些名词,加深印象:
1. mifare, nxp半导体公司在非接触式智能卡及近场感应卡领域注册的商标,他们家的s50卡是我要拿出来当栗子举的;
2. s50卡,s70卡:mifare家族中遵守ISO14443A标准的卡片中应用最为广泛、影响力最大的两位。S50容量1k,s70容量4k。这俩货基本没啥区别,除了应答读卡器时返回的ATQA不同,另外当然容量显然也不同。
3. ISO/IEC 14443:Contactless card standards(非接触式IC卡标准)协议,协议就是用来遵守的,不用多说,包括4部分:
         第一部分:物理特性
         第二部分:频谱功率和信号接口
         第三部分:初始化和防冲突算法
         第四部分:通讯协议



卡与读卡器的交互流程



协议重点在卡片的防冲突算法(防冲突简单地来说就是多张卡一起刷时如何识别每一张卡),3次验证,卡片的具体操作及访问控制等部分,我们将一点点梳理。


防冲突算法部分
卡片在响应时使用曼彻斯特编码

一种利用电平跳变来表示0,和1的同步时钟编码方式,提供了同步机制,保证发送端和接收端信号同步。

由上图data部分,内容为10100111001,编码后变成了,1001100101101010010110,由此也可见,缺点是传输的内容增加了一倍。(一种简单理解方式就是1变成了10,0变成了01)。

当同一时间读卡器与多张卡一起通信时,如果在同一时间传输的数据有异,比如10010010与11011100同时传输时,就会有冲突位出现,接收到的信号可以理解为1x00xxx0(这些是为了解释防冲突的算法做铺垫)。


防冲突机制所使用的二进制搜索算法描述(假定uid号为8bit)
1) 首先读卡器向所有的卡发一个默认最大值的uid号(EPC)11111111,
2) 卡接收到这个uid号,判断和自身uid号的大小关系,如果大于uid号,卡片不应答;如果小于或者等于则将自身uid发还给读卡器;
3) 根据曼彻斯特编码,读卡器解码,根据上文介绍的冲突位的原理,查找是否有冲突位;如果有,找到最高位的冲突位,将其置0,其余冲突位置1,将其作为EPC,执行1);如果没有冲突,说明识别出了一张卡,(因为各卡的uid都不相同,没有冲突位说明只接收了一个uid)执行4);
4) 选中了卡,就可以进行后续各种操作(见图1 );
5) 回到1)直至识别出所有的卡;


举例,有卡1,卡2两张卡(都是经过曼彻斯特编码以后的):

卡2不应答:

卡1被识别出来,然后重复第一步操作,卡2 被识别出来:


◤三次验证详解
接着我们来说下三次验证,说三次验证,先得讲明白卡片的数据存储方式:
Mifare S50把1K字节的容量分为16个扇区(Sector0-Sector15)

▪ 每个扇区包括4个数据块(Block0-Block3)

▪ 将16个扇区的64个块按绝对地址编号为(0~63)

 每个数据块包含16个字节(Byte0-Byte15)。

扇区0块0只读,出厂就写好了,包含卡片uid,校验,卡片类型,uid长度等一系列信息。全球唯一(uid卡不在这个讨论范围内)。


块0的解读:
BC7A5DC65D0804000125920D540C6C1D
红色的BC7A5DC6是uid号,黄色的5d是前四位异或所得的校验位,绿色的08是SAK(Select Acknowledge)字面意思就是读卡器进行选卡操作时,卡对读卡器的回应,iso文件中关于SAK的定义如下图2:

SAK表示卡片告诉读卡器UID是否完整,从而是否需要下一次的防冲突选择循环(防冲突机制规定需要四字节也就是32bit的uid进行,如果uid长度超过4字节,则需要进行多次防冲突选择循环)以及是否遵守ISO14443-4。

同时在mifare的实现中,使用了图2中的“x”的值,达到了mifare卡类型判断的效果,如下图3:

又sak=08结合上图可知,这是张mifare 1k卡,不需要进行下一次防冲突循环。
蓝色0400(little ending的缘故)是ATQA(Answer To reQuest, Type A ),定义如下图4:

b8,b7位决定uid长度,”00”代表4字节,“01”代表7字节, “10”代表10字节;b1-b5,只能有且只有一个是1,则表明遵循面向比特的防冲突机制。

b9-b16可认为是RFU,默认为0。所以我们这个卡是uid长度为4的,遵循面向比特的防冲突机制。扇区块0真正有用的就这些。

接下来说下一般情况下mifare 1k s50卡各扇区内各块的组成。
一般块,(除了上面我们单独拎出来讲的扇区0的块0是出厂时已生成,且只读的)可以分成两种,数据块和控制块(Sector trailor,包含俩秘钥和一种类似acl的机制)。


数据块细分又可以分成两类:
▲ 读写块:可以进行读写操作;
▲ 值块:可进行读,写,运算等一系列操作;
一般没必要分的那么清楚。具体能进行什么操作,是什么类型的,控制块里都能体现。拉出来单讲的原因是,值块有自己的存储格式:比如一个值value,占4个字节;地址是adr,占一个字节;存储的方式如图5:


上部带横线的表示原值取反。(进行增,减,传递,恢复等操作,adr及其反值都不会改变,只有write操作能改变这部分的值)。

然后是最重要的控制块

有两个6字节的密码:KeyA,KeyB,及4字节的Access Bits组成。重点是这个Access Bits,这个包含了所在扇区内包括其自身块的访问条件(准确的来说是6-8,9可以用来存储一般的数据,同样,如果KeyB不需要,也可以用来放数据,KeyA只能写,不能读,读了返回0)。

来个真实的数据:


KeyA为默认的FF FF FF FF FF FF;KeyB为53 EF D3 75 B3 52;08 77 8F是访问控制位。

结构如下图7所示:

每个块都有属于自己的访问控制位,结构如下:
块0 : C10 C20 C30
块1 : C11 C21 C31
块2 : C12 C22 C32
块3 : C13 C23 C33

数据块的访问控制如下图8:

(KeyA,表示需要A秘钥操作,KeyB同理,KeyA|B表示A或B皆可,Never表示咋都不行,操作不了)

111无论验证哪个密码都不能进行任何操作,相当于块没用了;

010和101都是只读,可以存放点不能变的信息,比如身份识别信息啥的;

001时只能读和减值,和钱相关的可以设成这样,只能减和查询,充值时通过修改控制位,充完钱再改回来。


块3各部分的访问如下图:

KeyA永远无法读,像前文所说,读的时候,返回0;Access bits始终可以通过KeyA或KeyB或者组合读出,这块操作必须小心,一旦限制了写入,永远无法改变了;当选择了000,010,001时,KeyB所在的位置可以用来存储数据(只用KeyA来验证操作)。
用之前那个真实的数据来加深下理解:

控制字节是08 77 8F,相当于:

真正有用的就是蓝色部分:

块0,1,2 都是110,块3是011,对应图9和10可以得出相应块的访问控制及Key的情况;

由上述卡内容及访问控制方面知识积累,我们现在讲3次认证的过程:
1) 读卡器向卡发出请求:指定需要操作哪个扇区,哪个块,用KeyA或者KeyB验证;
2) 卡片根据读卡器发过来的信息,读取相应块的访问控制条件,如果指定的操作没有权限,或者相应操作需要的Key不对,则停止;如果符合访问控制条件,则卡片向读卡器发送一个随机数n1(明文);
3) 读写器用事先约定的加密算法(很明显是对称加密算法,同时第一步也约定了秘钥)对随机数n1进行运算生成n1r,然后自己生个一个随机数n2,将n1r和n2同时发回卡片;
4) 卡片使用相同的加密算法对n1进行运算,并对比n1r,如果不同,则停止验证,终止后续操作,如果相同,验证通过,则使用相同的加密算法和秘钥对n2进行运算,生成n2r,并将其发回读卡器;
5) 读卡器对n2r进行验证,如果不通过则停止交互,终止后续操作;如果通过,则3次认证完毕,可对卡进行1)中约定的操作。

OK,到这里我们基本上对RFID有了一定的了解,由于篇幅所限,诸如传输的数据帧的格式,数据完整性校验,mifare1k系列卡的一些缺陷和安全性方面的问题,如crypto1算法的缺陷,darkside,nested authentication等攻击的一些分析暂时不在这篇里面讲了。


版权所有 侵权必究

如需转载请联系

0571-28829811

恒生技术之眼