前提知识:
#M1卡控制位对应操作权限:
M1卡即S50卡,存取控制(4字节,其中字节9为备用字节)结构如下所示:
数据块(块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可读则不可以使用其进行认证,也就不能进行读写,如手册中所说:
而为什么只有部分卡不行,应该是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》