本文为小白入门RFID安全方面的小记,大佬勿喷。
简述
此处为对RFID,M1卡,NFC的整体介绍
RFID
射频识别,即RFID是Radio Frequency Identification的缩写,又称无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触。
一套完整RFID硬件统由 Reader 与 Transponder 两部份组成,其动作原理为由 Reader 发射一特定频率之无限电波能量给 Transponder,用以驱动 Transponder 电路将内部的 ID Code 送出,此时 Reader 便接收此 ID Code。
RFID读写器由射频模块,控制处理模块,天线组成。RFID电子标签可按供电方式分为有源、无源和半有源;按工作频率分为低频、高频、超高频和微波;按封装形式分为卡片、线形、纸状、玻璃管、圆形及异形等多种类型。RFID标签一般由RDFID晶片、天线(包裹RFID晶片的铜丝)、电力来源(主动式:由标签内部的所附电源提供;被动式:由读写器发射的无线电波提供)组成。读写器与电子标签之间的通信协议一般为ISO 14443协议,它规定了 物理层特性、通信方式和防碰撞机制。
RFID读写器在正常情况下一个时间点只能对一张卡进行读写操作,当多张卡片同时进入读写器的射频场时,读写器会采用防碰撞机制来解决多个卡的冲突问题使得读卡器不能同时对不同卡进行读写等操作,具体的防冲突机制不在此处展开。
此处以MFRC522为例来展示读写器结构,可以从图中看到主机与芯片之间的通信需要先经过FIFO缓冲区:
以下是MFRC522的一组通用命令说明,它解释了芯片内部如何通过寄存器命令来控制通信过程,此处有一种命令是控制MFRC522本身的,还有一种命令是控制tag的。
- IDLE 命令,MFRC522 处于空闲模式。该命令也用来终止实际正在执行的命令;
- CALCCRC 命令,FIFO 的内容被传输到 CRC 协处理器并执行 CRC 计算。这个命令必须通过向命令寄存器写入任何一个命令(如空闲命令)来进行清除;
- TRANSMIT 命令,发送 FIFO 的内容。在发送 FIFO 的内容之前必须对所有相关的寄存器进行设置。该命令在 FIFO 变成空后自动终止;
- RECEIVE 命令,该命令在接收到的数据流结束时自动终止;
- TRANSCEIVE 命令,该循环命令会重复发送 FIFO 的数据,并不断接收 RF 场的数据。第一个动作是发送,发送结束后命令变为接收数据流;
- MFAUTHENT 命令 (P69,17),该命令用来处理 Mifare 认证以便到任何 Mifare 普通卡的安全通信。在命令激活前以下数据必须被写入 FIFO:认证命令码、块地址、秘钥、序列号。该命令在 Mifare 卡被认证且 Status2Reg 寄存器的 MFCrypto1On 位置位时自动终止;
- SOFTRESET 命令,所有寄存器都设置成复位值。命令完成后自动终止。
寻卡、防冲突、选卡协议:
寻卡为0x26 或者 0x52,协议内容一个寻卡命令就可以了,接着就可以发送,它的返回是2byte 卡类型 (4, 0)
防冲突为0x93,协议内容为防冲突命令 + 0x20,并返回4byte 卡ID,1byte 校验 (异或) (62 A8 2B B EA)
选卡协议内容为命令字 + 0x70 + 4byte 卡号 + 1byte 校验 + 2byte CRC16 校验,返回卡校验 0x08。
在这里实际唤醒流程将ISO14443-A协议的0x26(0x52)写入FIFO,然后使用TRANSCEIVE发出,最终来唤醒卡片。
阅读器和电子标签之间的射频信号的耦合类型有两种:
- 电感耦合
变压器模型,通过空间高频交变磁场实现耦合,依据的是电磁感应定律。电感耦合方式一般适合于中、低频工作的近距离射频识别系统。典型的工作频率有:125kHz、225kHz 和 13.56MHz。识别作用距离小于 1m,典型作用距离为 10~20cm。 - 电磁反向散射耦合
雷达原理模型,发射出去的电磁波,碰到目标后反射,同时携带回目标信息,依据的是电磁波的空间传播规律。
电磁反向散射耦合方式一般适合于高频、微波工作的远距离射频识别系统。典型的工作频率有:433MHz、915MHz、2.45GHz、5.8GHz。识别作用距离大于 1m,典型作用距离为 3~10m。
M1卡
下图为M1卡结构图:
RF-Interface(射频接口):和读写器“空中对话”的物理层,把无线电变成比特,又从比特变回无线电
- Modulator / Demodulator(调制器/解调器):
读写器→卡用 ASK(幅移键控)+ Miller 编码(位编码方式);卡→读写器用 负载调制(load modulation,用副载波在读写器场里“轻微扰动”)+ Manchester 编码。这块把射频信号和数字数据互相转换。 - Clock / Data(时钟/数据):把还原出的时钟与数据送往数字逻辑区。
- Voltage Regulator(稳压器):从读写器磁场取能并稳压,整片芯片就靠它“吃电”(卡片本身没电池)。
- POR / E²POR(上电复位/EEPROM 上电复位):上电时把逻辑与存储拉到安全初始态,防止乱跑。
- Energy(能量):说明供电来自 RF 前端耦合的能量。
Digital Section(数字逻辑区):协议、选择、防碰撞、认证、加密、控制 - ATR / ATQA(Answer to Request,唤起响应):读写器发 REQA/WUPA(唤醒/查询命令) 后,卡首先回一个 ATQA 告诉“我是谁、属于 Type A”之类的基本信息。
- Anti-Collision(防碰撞):多卡同场时按 级联级别(cascade level,CL1/CL2/CL3) 逐步“点名”,最终唯一选中一张卡(防止同时说话)。
- Select Application(选择):把被选中的卡置为 Active(活动)状态,进入会话。
- Authentication & Access Control(认证与访问控制):
MIFARE Classic 用 三次握手(three-pass) 与 KeyA/KeyB(两套密钥/每扇区)做认证。认证成功后建立会话密钥,后续读写按 访问位(access bits) 判定权限。 - Crypto Unit(加密单元):
实现 Crypto1(流密码,stream cipher(按位生成密钥流加解密)),在 RF 链路上对数据(含 CRC、奇偶)做加/解密,抵抗窃听与重放。 - Control & Arithmetic Unit(控制与运算单元):
状态机与微运算(如 INCREMENT/DECREMENT/RESTORE/TRANSFER(值块增减与搬移) 指令),统一调度“收发 → 认证 → 访问 EEPROM”。
E²-Memory(EEPROM,电可擦可编程存储器):扇区/块组织的永久存储
容量 1 KB:16 扇区 × 每扇区 4 块 × 每块 16 字节。
每扇区最后一块是 Sector Trailer(扇区尾块):存 KeyA(6B)+ 访问位(4B)+ KeyB(6B)。
其它块存放用户数据或 Value Block(值块)。
通过 E²-Interface(存储接口) 与数字逻辑区连接,只有认证通过且权限允许时才可读写。
操作流程如下:
此处读卡流程为先复位,然后进行请求,防冲突,选卡,认证,读写充值操作
此处S50读卡示例命令:
请求:0x26
防冲突:0x93,0x70
A认证0x60(B认证为0x61),addr,keyA,ID
读0x30,addr,CRC16
在这里需要注意的是上文的MFAUTHENT 命令,该命令用于处理 Mifare 认证,以使得任何 Mifare 普通卡的安全通信。在命令激活前以下数据必须被写入 FIFO:
认证命令代码 (0x60, 0x61)
块地址
扇区密钥字节 0
扇区密钥字节 1
扇区密钥字节 2
扇区密钥字节 3
扇区密钥字节 4
扇区密钥字节 5
卡序列号字节 0
卡序列号字节 1
卡序列号字节 2
卡序列号字节 3
以上总共12字节必须写入FIFO中
NFC
而NFC (Near Field Communication) 近场通信是从RFID演变而来,由飞利浦半导体(现恩智浦半导体公司)、诺基亚和索尼共同研制开发,其基础是 RFID 及互连技术。它是一种短距离高频的无线电技术,在 13.56Mhz 频率运行于 20cm 距离内,也就是在高频范围内。其传输速度有 106Kbit/s、212Kbit/s 或者 424Kbit/s 三种。NFC 采用主动和被动两种读写模式。
下图就是 读写器与卡进行交互的展示图,展示了 读卡器端(PCD, Proximity Coupling Device) 和 卡片端(PICC, Proximity Integrated Circuit Card) 之间的关系,此处读卡器与标签之间的射频信号耦合为电感耦合。
NFC 技术的三种主要工作模式:卡模式、读写器模式、点对点模式
卡模式:这个模式其实是相当于一张采用 RFID 技术的 IC 卡,可以替代大量的 IC 卡(包括信用卡、公交卡、门禁管理、车票、门票等)。
读写器模式:这个模式可以模拟读卡器功能,读取 MIFARE 和 FeliCa 卡的信息。
点对点模式:这个模式和红外线差不多,可用于数据交换,只是传输距离较短,传输速度可稍低,功能便捷。将两个具有 NFC 功能的设备链接,能实现数据点对点传输,如下载音乐、交换图片或通讯录等。一次通过这种 NFC,多台设备如数码相机、PDA、计算机和手机之间都可以交换资料或服务。
这里以PN532芯片为例进行介绍,它是一款高度集成的非接触式通讯模块,基于 8051 单片机核心。它支持 6 个不同的操作模式:ISO/IEC 14443A/MIFARE 读/写器FeliCa 读/写器,ISO/IEC 14443B 读/写器,ISO/IEC 14443A MIFARE 卡模拟模式,FeliCa 卡模拟模式,ISO/IEC 18092 ECMA 340 点对点。这款芯片提供 3 种和主机通信的接口zSPI/I²C/USART。下图为PN532结构图示:
很多 NFC 芯片(例如 NXP PN532、复旦 FM 系列)都支持多种接口(I²C(两线制接口,常用于低速、简单连接)、SPI(四线制接口,速度快,常用于 MCU 通信)、HSU(High Speed UART,高速串口接口)),而具体用哪一种,需要通过 硬件引脚 I0 和 I1 来配置。
下图为PN532的请求包与应答包格式图
当数据超过256使用该数据包
从手册可以看出,唤醒命令要在原有的数据包之前加入唤醒头,这个比较特殊一点,0xd4 代表主机向 PN532 写入数据,0x14,0x01 代表选择了普通模式
//唤醒头如下:
0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x03,0xFD,0xD4,0x14,0x01,0x17,0x00
唤醒后读卡流程如下:
第一部分:扫描并初始化两张卡
Command
4A # 命令码: InListPassiveTargets
02 # 需要初始化的卡片数(这里要求最多 2 张)
00 # 通信速率 = 106 kbps
Response
4B # 响应命令码
02 # 发现 2 张卡
01 # Target number = 1
04 00 # SENS_RES(2字节):卡1的类型信息
08 # SEL_RES:选择响应(卡片类型附加信息)
04 # NFCID1 长度 = 4
12 67 58 32 # 卡1的UID(序列号)
02 # Target number = 2
44 00 # SENS_RES of card 2
00 # SEL_RES of card 2
08 # NFCID1 长度 = 8
88 04 B6 E4 00 00 00 00 # 卡2的UID(8字节)
00 00 # 结束标志
- PN532 成功检测到两张卡:
- 卡1:Mifare Standard 卡,UID 长度 4 字节 → 12 67 58 32
- 卡2:Mifare Ultralight 卡,UID 长度 8 字节 → 88 04 B6 E4 00 00 00 00
第二部分:对 Mifare Standard 卡(卡1)进行认证
Action
- 使用默认密钥对卡1进行认证。
Command
40 # 命令码: InDataExchange
01 # 目标卡编号 = 1(即卡1)
60 # Mifare 命令:认证块 (0x60 = Key A, 0x61 = Key B)
07 # 认证的区块地址
FF FF FF FF FF FF # 默认密钥 (6字节全FF)
12 67 58 32 # 卡的 UID(NFCID1,来自扫描阶段)
Response
41 # 响应命令码
00 # 状态码 = 0(认证成功)
第三部分 读卡(Read out card 1 memory)
Command
40 # Command code: InDataExchange
01 # 目标卡号 = 1
30 # Mifare 指令:读块 (0x30 = Read 16 bytes)
04 # 要读取的块地址
Response
41 # 响应命令码
00 # Status = 0(成功,无错误)
EE EE EE EE EE EE EE EE # 读取到的 16字节数据(这里只是例子)
EE EE EE EE EE EE EE EE
PN532的充值与扣款使用的是Value Blocks(数值块)
Value Blocks 主要用于 电子钱包(Electronic Purse)功能,比如读余额、充值(increment)、扣款(decrement)、转账(transfer)、恢复(restore)等操作。
value:32 位有符号二进制补码(2’s complement)表示,存储三次。芯片会自动检查三者是否一致,再进行计算。
address:一个 8 位地址重复存储 4 次(虽然不会被芯片内部使用)。
MIFARE MF1ICS50 芯片中 Value Block(数值块)运算的内部工作流程如上
- Value Block 的生成
- 一个数值块第一次出现,是通过 WRITE 指令写入芯片存储器(chip memory)里的某个地址。
- 之后,这个数值块就可以被用来进行 递增(Increment)、递减(Decrement)、恢复(Restore) 等操作。
类比:就像你第一次往电子钱包里“充值”一个初始余额,之后你就能对它进行加钱、扣钱或恢复操作。
- 主要组成部分
- chip memory(芯片存储器):存放数值块的地方。
- source value(源值):从内存中取出的数值。
- ALU(算术逻辑单元, Arithmetic Logic Unit):用来执行加法、减法等运算的电路。
- result(结果寄存器):保存 ALU 运算后的结果。
- DATA register(数据寄存器):用于临时保存数据,方便后续的传输或写回存储器。
- 操作流程
- mif_increment / mif_decrement / mif_restore
- 输入参数有 源地址(SOURCE_ADR) 和 操作值(DECR_VALUE 或 INCR_VALUE)。
- 芯片会从存储器里取出对应的 source value,交给 ALU 进行加/减/恢复操作,结果写回存储器。
- mif_transfer
- 输入参数是 目标地址(DEST_ADR)。
- 将 ALU 计算后的结