基本概念
扇区:
1KB-M1 卡共有 16 个扇区 64 个块,每个扇区由 4 块(块 0、块 1、块 2、块 3)组成。通常会按绝对地址编号: 0~15扇区,0-63块。如下图所示:
0扇区0块
第 0 扇区的块 0(即绝对地址 0 块),一般用于存放厂商代码,已经固化,不可更改。
其他扇区块
其他扇区由 数据块、控制块 两部分组成。
数据块
每个扇区的块 0、块 1、块 2 为数据块,可以进行 读、写、初始化值、加值、减值、读值操作。
控制块
每个扇区的块 3 为控制块,包括了密码 A、存取控制、密码 B。具体结构如下:
权限管理
权限管理区域
每个扇区有 4 个访问条件 独立 的权限区,使用 密码A 还是 密码B 进行访问,是由该扇区块 3 的控制位决定(控制位 = 第 6-9 字节的值)
- 0-2 块数据区
- KeyA区,块3的 0-6 字节
- KeyB区,块3的 10-15 字节
- 控制位,块3的 6-9 字节
访问条件与存取控制
访问条件由存取控制决定。
存取控制为 4 个字节,共 32 位,扇区中的每个块(包括数据块和控制块)是使用密码A还是密码B进行访问由存取控制的值决定的。
每个块都有相应的 三个控制位。控制位定义如下:
块 0: C10 C20 C30
块 1: C11 C21 C31
块 2: C12 C22 C32
块 3: C13 C23 C33
存取控制结构图
三个控制位以正和反两种形式存在于存取控制字节中,决定着该块的访问权限,存取控制结构如下所示:
字节9为备用字节,并没有参与到控制中,取反的位也没有参与权限控制,可不算出其值
数据块的存取控制
- 数据块X(块 0、块 1、块 2)的存取控制如下:
例如:当块 0 的存取控制位 C10 C20 C30 = 1 0 0 时,表示:
验证密码 A 或密码 B 正确后 可读。
验证密码 B 正确后 可写。
不能进行加值、减值操作。
控制块的存取控制
- 控制块块 3 的存取控制与 数据块(块 0、1、2)不同,它的存取控制如下:
例如:当块 3 的存取控制位 C13 C23 C33=0 0 1 时,表示:
密码 A:不可 读,验证 KEYA 或 KEYB 正确后 可写。
存取控制:验证 KEYA 或 KEYB 正确后,可读、可写。
密码 B:验证 KEYA 或 KEYB 正确后,可读、可写。
实例:存取控制解析
以控制位 FF078069
为例
-
首先把控制位的 Hex(十六进制) 转为 Bin(二进制)
字节9为备用字节,并没有参与到控制中,取反的位也没有参与权限控制,可不算出其值
字节 | Hex | Bin |
---|---|---|
字节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 |
- 将以上数据套入完存取控制结构图中,(带_b的表示控制位的值取反)
结构 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
字节6 | <1>[C23_b] | <1>[C22_b] | <1>[C21_b] | <1>[C20_b] | <1>[C13_b] | <1>[C13_b] | <1>[C11_b] | <1>[C10_b] |
字节7 | <0>[C13] | <0>[C12] | <0>[C11] | <0>[C10] | <0>[C33_b] | <1>[C32_b] | <1>[C31_b] | <1>[C30_b] |
字节8 | <1>[C33] | <0>[C32] | <0>[C31] | <0>[C30] | <0>[C23] | <0>[C22] | <0>[C21] | <0>[C20] |
整理后可以得到
数据块
块 0 存储控制为 : C10 | C20 | C30,控制码=000
块 1 存储控制为:C11 | C21 | C31,控制码=000
块 2 存储控制为:C12 | C22 | C32,控制码=000
它们的控制码都是 000 ,参照数据块存取控制图,可知:块0、块1、块2 都可以在验证KeyA或KeyB后,进行读、写、增|减值操作
控制块
块3 存储控制为:C13 | C23 | C33,控制码为=001
块3访问条件说明(参照控制块存取控制图):
-
KeyA区(0-5字节)
- KeyA 不可读,验证 KeyA 或 KeyB 后可写。
-
存取控制区(6-9字节):
- 验证 KEYA 或 KEYB 正确后,可读、可写。
-
KeyB区(10-15字节):
- 验证 KEYA 或 KEYB 正确后,可读、可写。
实操:权限管理中的细节
- 密码 AB 读不出来的表现是: 12个0
- 对于
keyA|keyB
都不能读,只能读数据和控制位的控制位:- 读出数据说明密钥正确。
- 可以通过改写 控制位 的方式可以读出 key 值。
- PM3 读块指令读出密钥
hf mf rdbl 3 B 112233445566
;用 keyB 读块 3
存取控制常用值
FF 07 80 69
权限最高,一般是IC卡的默认值
数据块
- 012块的权限都为000,keyA和keyB都可读可写
控制块
块3为001
-
密码A:为任何时候不可读出,可以通过AB写。
-
密码B:可以通过AB读写。
-
控制字节:可以通过AB读写。
08 77 8F 69
适合实际使用,权限控制相对较好。
数据块
-
012块的权限都为110,密码AB都可读,只有密码B可写、增减。
可在实际业务中密码A用于消费,密码B用于充值。降低高权限密码B的使用频率,防止泄露。
控制块
- 块3控制码为011,密码A和密码B 都不能读,只能用密码B写AB密码,控制字节AB都可读,只有B可写。
07 8F 0F 69
冰冻,永远只可读不可写
00 F0 FF 69
自杀,永远不可读不可写。
自杀模式还有很多,把控制字节写的不认识也无法使用(实操中新手经常干的事,所以一定要控制好)。
附录:数据块操作的英文名称
- 读 (Read):读一个块;
- 写 (Write):写一个块;
- 加(Increment):对数值块进行加值;
- 减(Decrement):对数值块进行减值;
- 存储(Restore):将块中的内容存到数据寄存器中;
- 传输(Transfer):将数据寄存器中的内容写入块中;
- 中止(Halt):将卡置于暂停工作状态;
To do list
卡片测试
通过修改控制位的方式测试水卡-
是读金额值成功后出水
-
还是写卡扣钱/增减值 后出水
-
还是额外需要验证控制位正确/正常。
注解与参考
参考
前人栽树后人乘凉…
S50非接触式IC卡存储控制浅谈(M1)
M1卡区块控制位详解