前提知识:
#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》