MFCR522IC卡结构及读写控制

MFCR522是高度集成的非接触式读写芯片,工作频率为13.56MHZ。可以实现不同的接口方式。

1:UART 传输速率高达1228.8kbit/s

2:SPI 10Mbit/s

3:IIC 快速模式400kbit/s,高速模式3400kbit/s

支持的卡类型

1. mifare1 S50

2. mifare1 S70

3. mifare UltraLight

4. mifare Pro

5. mifare Desfire

 

S50 非接触式 IC 卡性能简介

0x1、 主要指标

1. 容量为 8K 位 EEPROM(这意味着M1卡支持数据的读写修改)

2. 分为 16 个扇区,每个扇区为 4 块,每块 16 个字节,以块为存取单位(这意味着M1卡可以承载多功能的IC卡,在不同的扇区分别存储不同目的的数据)

3. 每个扇区有独立的一组密码及访问控制

4. 每张卡有唯一序列号,为 32 位

5. 具有防冲突机制,支持多卡操作

6. 无电源,自带天线,内含加密控制逻辑和通讯逻辑电路

7. 数据保存期为 10 年,可改写 10 万次,读无限次

8. 工作温度" -20℃~50℃(湿度为 90%)

9. 工作频率: 13.56MHZ

10. 通信速率: 106 KBPS

11. 读写距离: 10 cm 以内(与读写器有关)

0x2: 存储结构

M1 卡分为 16 个扇区,每个扇区由 4 块(块0、块1、块2、块3)组成,(我们也将 16 个扇区的 64 个块按绝对地址编号为 0~63)

 

每张M1卡一定都有16个扇区

0 扇区的块 0(即绝对地址 0 块),它用于存放厂商代码,已经固化,不可更改(前4字节是卡序列号,第5字节是卡容量,6、7字节是卡类型、剩下是厂商定义的信息)。每个扇区的块0、块1、块2为数据块,可用于存贮数据,数据块可作两种应用

1. 用作一般的数据保存,可以进行读、写操作

2. 用作数据值,可以进行初始化值、加值、减值、读值操作

每个扇区的块 3 为控制块,包括了密码 A、存取控制、密码 B。具体结构如下

 

每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。存取控制为 4 个字节,共 32 位,扇区中的每个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的(类似于x86的内存读写管理r/w/rw),在存取控制中每个块都有相应的三个控制位,定义如下

三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如进行减值操作必须验证 KEY A,进行加值操作必须验证 KEY B,等等)

块0的存取控制位C10 C20 C30=1 0 0时,验证密码A或密码B正确后可读;验证密码B正确后可写;不能进行加值、减值操作

例如:当块3的存取控制位C13 C23 C33=0 0 1时,表示 

1. 密码A: 不可读,验证KEYA或KEYB正确后,可写(更改) 2. 存取控制: 验证KEYA或KEYB正确后,可读、可写 3. 密码B: 验证KEYA或KEYB正确后,可读、可写

也就是说,对任何一张M1卡,要想对它进行读写操作,需要KeyA、KeyB、存储控制位这3者综合判断的结果,而且大多数情况下存储控制位所在区块是不允许写操作的,这就像一个保险柜的钥匙放在保险柜里并加锁了,只提供外面的一些仅有的界面提供操作,无法直接拿到里面的钥匙

 

(一),以常用设置"08 77 8F 69"控制条件为例,先搞清楚它――具有的访问权限。

1、对"08 77 8F 69"值进行计算,该值定位于各区块3的6,7,8,9四个字节内,字节6=08,字节7=77, 字节8=8F,   字节9=69(默认值,不予计算)。

2、例如:字节6=08,对应其二进制值=00001000, 则对6,7,8这三个字节进行二进制转换结果见下表:

字节6 = 0 0 0 0 1 0 0 0

字节7 = 0 1 1 1 0 1 1 1

字节8 = 1 0 0 0 1 1 1 1

 

3、参照表2及表4算法,字节6的全部二进制值取反,字节7的低四位二进制值取反,字节8不变,得到:

字节号

对应二进制值

位置

高4位

位置

低4位

字节6 

字节7 

字节8

0 0 0 0 1 0 0 0

0 1 1 1 0 1 1 1

1 0 0 0 1 1 1 1

C2Y

C1Y

C3Y

1 1 1 1

0 1 1 1

1 0 0 0

C1Y

C3Y

C2Y

0 1 1 1

1 0 0 0

1 1 1 1

所 属 块 位

块3 块2 块1 块0

 

块3 块2 块1 块0

4、对以上6,7,8字节的存取/控制二进制已取反值如下表:

块3位

字节7,字节6,字节8 = C13,C23,C33 = C1Y,C2Y,C3Y = 0 1 1

块2位

块1位

块0位

字节7,字节6,字节8 = C12,C22,C32 = C1Y,C2Y,C3Y = 1 1 0

字节7,字节6,字节8 = C11,C21,C31 = C1Y,C2Y,C3Y = 1 1 0

字节7,字节6,字节8 = C10,C20,C30 = C1Y,C2Y,C3Y = 1 1 0

注意: 高4位的各块值=低4位的各块值时,其值可用。高4位值≠低4位值时,其值不可用!

5、查对访问权限(数据存取控制依照表3,块3存取控制依照表5),该例"08 77 8F 69"的访问权限为:

◆ 块3 = 011:权限为:KeyA,KeyB均不可读,验证KeyB正确后可改写KeyA和KeyB,验证KeyA或KeyB正确后可读"控制位"。在此可见密钥KeyB的重要性,KeyB不正确是无法看到块3控制值,更无法修改密钥。

◆ 块2 = 块1 = 块0 = 110:权限为:验证KeyA或KeyB后可读该块数据,减值以及初始化值,只有验证KeyB 正确后才可改写该块数据,在此可以看到密钥KeyB对改写数据块也起着关键性作用。

(二)、"08 77 8F 69" 控制条件设置步骤:

由(一)可知:KeyB设置后为不可读,并且改写数据和改写控制位都需要正确验证它,故KeyB设置后程序

操作员必须妥善保管KeyB值,否则以后改写数据和控制位时,不正确的KeyB值将无法实现卡的任何操作!!!

1、修改块3控制位的值:最初的各区块3内的KeyA,KeyB都是厂商12个"F"默认值(KeyA在任何条件下均为不可读,大部分读写机程序表现KeyA为未知的12个"0" ),在修改控制值时,先不要修改默认密码KeyA和KeyB,在控制位修改成功后,再去更改新密码值。即先对块3的控制位进行修改(默认值FF 07 80 69改为新值08 77 8F 69)并执行写操作。控制位写成功后,KeyB亦为12个"0"不可读了,但仍是隐藏的12个"f"默认值。

2、修改块3的KeyA和KeyB值:控制位08 77 8F 69值写成功后,验证KeyB正确后方可改写KeyA和KeyB新密码。在密码操作模式键入要改写区块之先前密码B(先前密码为默认值时,则不需改动和加载),加载后反回数据操作模式,再进行读值,KeyA和KeyB值的改写。

3、修改块0~块2中数据:由新的控制条件08778F69可知,要修改数据,必须先验证KeyB,故先设置密码操作为KeyB认证方式,加载后再返回数据操作模式,对要修改的数据块进行值的改写操作。

4、上例中分析了"08 77 8F 69"的访问条件及其改写步骤,对用户的其它控制条件亦可参照应用。

0x3: 三次握手密钥认证过程

这其实是一种典型的认证双方预分配(协商)好一对相同的密钥,通过各自生成的随机种子,并使用该密钥加密并发送给对方,向对方证明自己是可信的

卡片的电气部分只由一个天线和 ASIC 组成

1. 天线: 卡片的天线是只有几组绕线的线圈,很适于封装到 IS0 卡片中

2. ASIC: 卡片的 ASIC 由一个高速(106KB 波特率)的 RF 接口,一个控制单元和一个 8K 位 EEPROM 组成

RFID卡本身也可以看作是一个微型的单片机读写器向 M1 卡发一组固定频率的电磁波,卡片内有一个 LC 串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC 谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到 2V 时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据

1. 复位应答(Answer to request) M1 射频卡的通讯协议(类似于TCP/IP在不同的bit区间内保存不同目的的数据)和通讯波特率是定义好的,当有卡片进入读写器的操作范围时,读写器以特定的协议与它通讯,从而确定该卡是否为 M1 射频卡,即验证卡片的卡型

2. 防冲突机制(Anticollision Loop) 当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作,未选中的则处于空闲模式等待下一次选卡,该过程会返回被选卡的序列号

3. 选择卡片(Select Tag) 选择被选中的卡的序列号,并同时返回卡的容量代码

4. 三次互相确认(3 Pass Authentication) 选定要处理的卡片之后,读写器就确定要访问的扇区号,并对该扇区密码进行密码校验,在三次相互认证之后就可以通过加密流进行通讯(在选择另一扇区时,则必须进行另一扇区密码校验) //这里必须明白的,RFID卡不是二维码,不是随便谁都能读取到卡中的数据,读卡器只能通过协议发送指令码,经过验证后,RFID卡会根据读写控制位决定是否返回指定区块的数据(RFID本身是一个单片机)

5. 对数据块的操作 1) 读 (Read): 读一个块 2) 写 (Write): 写一个块 3) 加 (Increment): 对数值块进行加值 4) 减 (Decrement): 对数值块进行减值 5) 存储 (Restore): 将块中的内容存到数据寄存器中 6) 传输 (Transfer): 将数据寄存器中的内容写入块中

6. 中止(Halt): 将卡置于暂停工作状态

0x4: MIFARE卡的读写操作步骤

1. 激活MCM

2. MCM软复位

3. 向MCM下载密码(LOAD KEY),校验传输密码正确后可向MCM的KEY-RAM写入用户自己设定的密码 //以上操作与卡无关

4. 请求应答(ANSWER TO REQUEST): 寻卡

5. 防冲突(ANTICOLLISION): 选择唯一一张卡

6. 选择标记(SELECT): 激活所选择的卡

7. 认证(AUTHENTICATION): 安全性

8. 读写操作(读、写、加值、减值): 交换数据 (READ/WRITE/INCREAMENT/DECREMENT)

9. 停止(HALT): 置卡为停止模式,防止重复操作

读写器与M1卡交换数据的过程

1. 由读写器MCU(微控制器)发送指令给MCM

2. MCM执行指令并将其转换为射频信号发送给卡

3. 卡接收到来自MCM的指令后,按指令完成其内部的各种处理,并回送应答信号/数据给MCM

4. MCM接收卡回送的射频信号并将其转换为数字信号输出给MCU,读写器MCU读取MCM接收到的应答/数据,即可完成与M1卡的数据交换

0x5: 指令时序

每个指令由7个基本步骤组成,必须按此时序编程才能完成该指令,这是MFRC522硬件对上位机发送指令的时序要求

1. 初始化,设置各寄存器,特别是BCNTS和BCNTR

2. 送指令码到DATA,由MCM发送指令

3. 设置TOC,MCM准备接收来自卡的应答或数据

4. 检查DV标志,查询数据接收是否完成 1) DV标志为"1"表明MCM与MIFARE卡片之间的传输已经完成,并且主处理机可能 已 经从MCM中收到数据,可以进行下一步操作 2) DV=0表示数据接收尚未完成或未能接收到数据,则程序循环检测DV标志直至DV=1。有一种情况例外,既当定时器溢出时,无论接收是否完成DV都将被设置为1,同样将进行下一步操作

5. 清零TOC

6. 检查出错标志(类似于x86架构的错误处理机制) 1) 若有标志被设置,则进行相应的出错处理,例如设置出错标志等,并返回主程序 2) 若没有标志被设置,表示接收正确,将进行下一步操作

7. MCU从DATA读出MCM接收到的应答或数据

在编写向M1卡写入数据的代码之前需要首先明白的是,M1卡的每个扇区都有独立的验证密码,在写入数据之前之前需要先通过密码验证,方可进行进行后续的指令操作,类似于WEB的login界面。M1卡总共有16个扇x区,每个扇区的默认密码都是6 bytes 的0xFF

总结:

刷卡流程如下图所示

 

每张卡有0 ---63 共64个块,分成了16个扇区,每个扇区的第四块为控制块,保存秘钥和控制值,0 扇区的块 0(即绝对地址 0 块),它用于存放厂商代码,已经固化,不可更改(前4字节是卡序列号,第5字节是卡容量,6、7字节是卡类型、剩下是厂商定义的信息)。

如果你要操作该扇区必须进行密码的验证,只有通过密码验证才能对该扇区的数据块和控制块进行读写操作(通过该扇区任意一块的秘钥验证,便可对该扇区的所有块进行读写操作)

每个扇区的控制块的控制字节,控制着该扇区每个数据块的读写权限,通过改写控制字节可以改变该扇区的读写权限(要想改变控制字节也必须通过该扇区的秘钥验证)。控制字节同时也控制其本身的读写权限

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值