M1卡存取控制字节规则详解

8/3/2022 9:07:42 PM
2487
0

IC卡具有1K的容量,分为16个扇区,扇区是从0-15,这样表示出来的,不是1-16,这个一定要注意,是细节问题。16个扇区其中0扇区是一个公共区,因为在这个扇区里含有厂商代码,这个是固定的数据,固化的,改变不了的

0扇区,第1块前4个字节是car id ,第5字节是校验位 ,第6、7、8位是卡片类型,最后8位为厂商代码(由卡片广家确定)

所谓的M1芯片,是指菲利浦下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50S70两种型号。

M1卡的基本信息

容量为8K位EEPROM

分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位

每个扇区有独立的一组密码及访问控制 l每张卡有唯一序列号,为32位

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

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

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

工作温度:-20℃~50℃(湿度为90%) l工作频率:13.56MHZ

通信速率:106 KBPS

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

M1卡的存储结构

1.M1卡分为16个扇区,每个扇区由4块(块0、块1、块2、块3)组成,(我们也将16个扇区的64个块按绝对地址编号为0~63,存贮结构如下图所示:

扇区0 数据块0

存放卡片的卡号数据和厂商代码只可读取,不能写入

0

数据块1 用户可自行读取或写入数据到数据块 1
数据块2 2
数据块3 存放访问扇区的密钥数据和控制访问权限的字节 3
. . . . . . .......
扇区15 数据块0            用户可自行读取或写入数据到数据块    60
数据块1 61
数据块2 62
数据块3 存放访问扇区的密钥数据和控制访问权限的字节 63

2.第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。

3.每个扇区的块0、块1、块2为数据块,可用于存贮数据。

数据块可作两种应用:

用作一般的数据保存,可以进行操作。

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

4.每个扇区的块3为控制块,包括了密码A、存取控制、密码B。具体结构如下:密码A(6字节)、 存取控制(4字节)C、  密码B(6字节)

A0 A1 A2 A3 A4 A5 FF 07 80 69 B0 B1 B2 B3 B4 B5

而卡片出厂默认每个扇区的数据块3中的数据都是:FF FF FF FF FF FF FF 07 80 69 FF FF FF FF FF FF

每个扇区最后一块的存储控制结构,一共4个字节,例如:(FF 07 80 69) 。 这些数字是16进制的数字,然后一个1byte(字节)=8bits,所以他们的结构如下:

我们知道如果要读取一个扇区的每一块的数据都需要通过KeyA或者KeyB的验证,而厂家生产出来的M1卡默认的控制位为

(FF 07 80 69),默认的KeyA和KeyB为(FFFFFFFFFFFF)。但是这样是非常的不安全的,所以我们需要修改原始密码。原始密码的修改是非常的简单的,因为默认的控制位是(FF 07 80 69),对应的每一块的权限表达为:

首先按照16进制,把控制位解析出来:

16进制转换详解->我们先列出转换表

0000 =0 0001=1 0010=2 0011=3
0100=4 0101=5 0110=6 0111=7
1000=8 1001=9 1010=10 1011=11
1100=12 1101=13 1110 =14 1111=15

现在我们就对照上面的表就能知道默认的控制位转换后是个什么数:

字节6->FF 1 1 1 1 1 1 1 1
字节7->07 0 0 0 0 0 1 1 1
字节8->80 1 0 0 0 0 0 0 0
字节9->69 (这个一般不用)

存取控制(4个字节,其中字节9为备用字节),把数据填入到存取控制结构如下所示

bit 7 6 5 4 3 2 1 0
字节6 C23_b C22_b C21_b C20_b C13_b C12_b C11_b C10_b
  1 1 1 1 1 1 1 1
字节7 C13 C12 C11 C10 C33_b C32_b C31_b C30_b
  0 0 0 0 0 1 1 1
字节8 C33 C32 C31 C30 C23 C22 C21 C20
  1 0 0 0 0 0 0 0
字节9                

( 注: _b表示取反 ) 

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

存取控制中每个块都有相应的三个控制位,定义如下:

块0:C10C20C30 ->000

块1:C11C21C31 ->000

块2:C12C22C32 对应上表数据可得->000

块3:C13C23C33 ->001

块0,1,2控制位权限参照下面权限表可知:

块0控制位为:0 0 0 权限为: 通过A或者B密码认证后可读,可写,可进行加值和减值操作。

块1控制位为:0 0 0 权限为: 通过A或者B密码认证后可读,可写,可进行加值和减值操作。

块2控制位为:0 0 0 权限为: 通过A或者B密码认证后可读,可写,可进行加值和减值操作。

块3和其他的权限参照表是不一样的,块3对应的权限表为下表:

块3控制位为: 0 0 1权限为:A密码不可读,验证A或者B密码后可改写A密码。验证A或者B密码后,可读可改写存取控制 。 验证A密码或者B密码后,可读可改写B密码。

这个就是M1卡出厂默认控制位各块的权限,那么如果我们要改写厂家的默认控制位自定义自己的控制位要怎么做呢?

有两个方法:

1.通过上面的步骤,根据自己的需求,逆推出控制位。(当然这个比较难,下面我会讲解

2.通过下载一些转换工具进行转换。(相对简单,但是知其然不知其所以然

先说一下简单的吧,毕竟开发都是以效率为先的。

方法2:

我们先去下载一个转换工具:https://www.msrfid.com/download/3.html

解压后打开界面,如下图:

根据自己的需求,对应0,1,2块权限对照表获取对应块的控制位,进行修改数据块。然后根据块3权限对照表获取对应块的控制位,进行修改密码块。接下来就是点击生成控制字,就可以得到你想要的控制字,把它替换默认的控制字就可以了。这个就是使用工具来直接生成控制字的方法,非常的简单迅速。满足了开发需求了,那我们就可以去深究一下这个软件到底是怎么根据我们的权限选择进行逆推我们的控制字。

方法1:

首先根据我们的需求,对应块0,1,2权限表获取我们想要的权限的控制位,比如:

块0控制位为:1 1 0 权限为: 验证A密码或者B密码可读,验证B密码可写,验证B密码可进行加值操作,验证A密码或者B密码可进行减值操作。

块1控制位为:1 0 0 权限为: 验证A密码或者B密码可读,验证B密码可写,不可进行加值和减值操作。

块2控制位为:1 0 1 权限为: 验证A密码可读,不可写,不可进行加值和减值操作。

接着根据我们的需求,对应块3权限表获取我们想要的权限的控制位,比如:

块3控制位为:0 0 1权限为: A密码不可读,验证A密码或者B密码可以改写A密码。验证A密码或者B密码可读可改写控制字。验证A密码或者B密码可以读可以改写B密码。

这样我们自定义的权限的各块控制位就知道是什么值了,同时因为我们知道在存取控制中每个块都有相应的三个控制位,排列一下:

块0:C10C20C30110

块1:C11C21C31 100

块2:C12C22C32 对应控制位表数据可得-> 101

块3:C13C23C33001

根据存取控制字节对应填入下表后(_b为取反,比如:C33为1取反后为C33_b为0

存取控制(4字节,其中字节9为备用字节)结构如下所示:

bit765 4 3210

字节6 C23_b C22_b C21_b C20_b C13_b C12_b C11_b C10_b
  1 1 1 0 1 0 0 0
字节7 C13 C12 C11 C10 C33_b C32_b C31_b C30_b
  0 1 1 1 0 0 1 1
字节8 C33 C32 C31 C30 C23 C22 C21 C20
  1 1 0 0 0 0 0 1
字节9                

( 注: _b表示取反 )

然后根据上表我们就可以得到一个16进制数:

1 1 1 0 1 0 0 0 E8

0 1 1 1 0 0 1 1再把16进制转化10进制数 73

1 1 0 0 0 0 0 1 C1

再把备用的字节9(默认69)连接起来就可以得到我们想要的控制字:E8 73 C1 69。让我们检验一下我们转换的是不是正确的,在方法2的工具下输入我们各块的权限对应的控制位,再点击生成控制字,结果如下:

全部评论

要长脑子了
作者
7/31/2023 1:23:43 AM


提问