M1卡 不能使用KeyB进行读写的问题

时间:2024-04-10 11:53:25

前提知识:

#M1卡控制位对应操作权限:

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

M1卡 不能使用KeyB进行读写的问题

 数据块(块0、块1、块2)的存取控制如下:

 

  控制位(X=0..2)

  

         访 问 条 件 (对数据块 0、1、2)

C1X

C2X

C3X

 Read

 Write

Increment

Decrement, transfer,

Restore

0

0

0

KeyA|B

KeyA|B

KeyA|B

KeyA|B

0

1

0

KeyA|B

Never

Never

Never

1

0

0

KeyA|B

KeyB

Never

Never

1

1

0

KeyA|B

KeyB

KeyB

KeyA|B

0

0

1

KeyA|B

Never

Never

KeyA|B

0

1

1

KeyB

KeyB

Never

Never

1

0

1

KeyB

Never

Never

Never

1

1

1

Never

Never

Never

Never

     (KeyA|B 表示密码A或密码B,Never表示任何条件下不能实现)

 

  例如:当块0的存取控制位C10 C20 C30=1 0 0时,验证密码A或密码B正确后可读;

        验证密码B正确后可写;不能进行加值、减值操作。

 

    控制块块3的存取控制与数据块(块0、1、2)不同,它的存取控制如下:

 

 

 

 

密码A

存取控制

密码B

C13

C23

C33

Read

Write

Read

Write

Read

Write

0

0

0

Never

KeyA|B

KeyA|B

Never

KeyA|B

KeyA|B

0

1

0

Never

Never

KeyA|B

Never

KeyA|B

Never

1

0

0

Never

KeyB

KeyA|B

Never

Never

KeyB

1

1

0

Never

Never

KeyA|B

Never

Never

Never

0

0

1

Never

KeyA|B

KeyA|B

KeyA|B

KeyA|B

KeyA|B

0

1

1

Never

KeyB

KeyA|B

KeyB

Never

KeyB

1

0

1

Never

Never

KeyA|B

KeyB

Never

Never

1

1

1

Never

Never

KeyA|B

Never

Never

Never

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

           密码A:不可读,验证KEYA或KEYB正确后,可写(更改)。

         存取控制:验证KEYA或KEYB正确后,可读、可写。

           密码B:验证KEYA或KEYB正确后,可读、可写。

一、现象

对白卡进行操作,KeyA和KeyB都是FF FF FF FF FF FF ,控制字是FF 07 80 69。解析这组控制字的话,如下:

FF 07 80 69

         bit  7    6     5       4     3      2      1      0

字节6

1

1

1

1

1

1

1

1

字节7

0

0

0

0

0

1

1

1

字节8

1

0

0

0

0

0

0

0

字节9

0

1

1

0

1

0

0

1

C10 C20 C30 :0 0 0

C11 C21 C31 :0 0 0

C12 C22 C32 :0 0 0

C13 C23 C33 :0 0 1

 

分析操作权限可知,此时使用KeyA和KeyB,都应是可以对各块进行操作的。但实际情况是,部分卡使用KeyA可以正常读写,使用KeyB则不行。

二、原因

根据M1卡的规则,KeyA一直是不可读的,但KeyB是可以配置的,在FF 07 80 69这个配置下,KeyB是可见的。如果KeyB可读则不可以使用其进行认证,也就不能进行读写,如手册中所说:

M1卡 不能使用KeyB进行读写的问题

而为什么只有部分卡不行,应该是NXP原厂是有此限制,另外一些替代卡不一定有。

三、处理

将控制字修改为08 77 8F 00,如下:

08 77 8F 00

         bit  7    6     5       4     3      2      1      0

字节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

字节9

0

0

0

0

0

0

0

0

C10 C20 C30 :1 1 0

C11 C21 C31 :1 1 0

C12 C22 C32 :1 1 0

C13 C23 C33 :0 1 1

为控制真值表中红字部分,此后KeyB不可见,block3数据如下:

00000000000008778F00000000000000

此后可使用KeyB进行读写。

 

参考:

https://blog.csdn.net/robinson_911/article/details/12783897

《Mifare Classic 1K-S50.pdf》