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

    继续上次的M1卡课题,这次做一次详细的讲解教程,新手勿喷。所谓的M1芯片,是指菲利浦下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50及S70两种型号。

M1卡的基本信息

  1.      容量为8K位EEPROM
  2.      分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位
  3.      每个扇区有独立的一组密码及访问控制 l  每张卡有唯一序列号,为32位
  4.      具有防冲突机制,支持多卡操作
  5.      无电源,自带天线,内含加密控制逻辑和通讯逻辑电路
  6.      数据保存期为10年,可改写10万次,读无限次
  7.      工作温度:-20℃~50℃(湿度为90%) l  工作频率:13.56MHZ
  8.      通信速率:106 KBPS
  9.      读写距离:10 cm以内(与读写器有关)

M1卡的存储结构 :

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

 

 

 

 

 

 

块0

    

数据块

0

扇区0 

块1

 

数据块

1

 

块2

 

数据块

2

 

块3

密码A   存取控制   密码B

控制块

3

 

块0

 

数据块

4

扇区1

块1

 

数据块

5

 

块2

 

数据块

6

 

块3

密码A   存取控制   密码B

控制块

7

 

 

 

                      ∶

      ∶

      ∶

 

 

 

 

  0

 

数据块

60

扇区15 

  1

 

数据块

61

 

  2

 

数据块

62

 

  3

密码A    存取控制   密码B

控制块

63

 

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

 

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

           数据块可作两种应用:

  •            用作一般的数据保存,可以进行操作。
  •            用作数据值,可以进行初始化值、加值、减值、读值操作。

        

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

 

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

            密码A(6字节)                                 存取控制(4字节)                                 密码B(6字节) 

 

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

è¿éåå¾çæè¿°

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

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

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

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

16进制转换表
0000 =00001=10010=20011=3
0100=40101=50110=60111=7
1000=81001=91010=101011=11
1100=121101=131110 =141111=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

字节8

C33

C32

C31

C30

C23

C22

C21

C20

 

1

0

0

0

0

0

0

0

字节9

 

 

 

 

 

 

 

 

                     ( 注: _b表示取反 )

三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如: 进行减值操作必须验证KEY A,进行加值操作必须验证KEY B,等等)。因为控制字是由部分控制位取反的来的,由上表C33_b就可知道,所以我们要再取反一次获取原来的控制位,就能得出下面的控制位_b为取反,比如:C33为1取反后为C33_b为0):

 

字节6——FF :  0 0 0 0    0 0 0 0                                        

字节7——07 :   0 0 0 0   1 0 0 0                                    

字节8——80 :  1 0 0 0    0 0 0 0     

字节9——69 :(这个一般不用) 

 

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

块0:  C10  C20  C30                                                      0      0      0

块1:  C11  C21  C31                                                       0      0      0

块2:  C12  C22  C32       对应上表数据可得——            0      0      0

块3:  C13  C23  C33                                                       0      0      1

 

块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.xzking.com/html/53519.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:  C10  C20  C30                                                                      1      1      0

块1:  C11  C21  C31                                                                       1      0      0

块2:  C12  C22  C32       对应控制位表数据可得——                     1      0      1

块3:  C13  C23  C33                                                                        0      0      1

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

存取控制(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

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的工具下输入我们各块的权限对应的控制位,再点击生成控制字,结果如下:

          完全正确!!这样我们就可以随心所欲的去设置自己想要的效果了,原理也是知道了。接下来就是把自己自定义的控制字写入M1卡了就行了,大大提高了M1卡的保密性。本篇涉及到了M1卡的基本原理和复制卡的基本原理,网络安全猿猿有责,本篇意在测试和提高M1卡的保密性。如有不当,请留言一起探讨。

          原创链接:https://blog.csdn.net/weixin_40600325/article/details/85250435

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值