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》