IC卡之权限管理

基本概念

扇区:

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 字节的值)

  1. 0-2 块数据区
  2. KeyA区,块3的 0-6 字节
  3. KeyB区,块3的 10-15 字节
  4. 控制位,块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)的存取控制如下:

S50(M1)存储控制

例如:当块 0 的存取控制位 C10 C20 C30 = 1 0 0 时,表示:
验证密码 A 或密码 B 正确后 可读
验证密码 B 正确后 可写
不能进行加值、减值操作。

控制块的存取控制

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

例如:当块 3 的存取控制位 C13 C23 C33=0 0 1 时,表示:
密码 A:不可 ,验证 KEYA 或 KEYB 正确后 可写
存取控制:验证 KEYA 或 KEYB 正确后,可读、可写
密码 B:验证 KEYA 或 KEYB 正确后,可读、可写

实例:存取控制解析

以控制位 FF078069 为例

  1. 首先把控制位的 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
  1. 将以上数据套入完存取控制结构图中,(带_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访问条件说明(参照控制块存取控制图):

  1. KeyA区(0-5字节)

    • KeyA 不可读,验证 KeyA 或 KeyB 后可写。
  2. 存取控制区(6-9字节):

    • 验证 KEYA 或 KEYB 正确后,可读、可写。
  3. KeyB区(10-15字节):

    • 验证 KEYA 或 KEYB 正确后,可读、可写。

实操:权限管理中的细节

  1. 密码 AB 读不出来的表现是: 12个0
  2. 对于 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

卡片测试 通过修改控制位的方式测试水卡
  1. 是读金额值成功后出水

  2. 还是写卡扣钱/增减值 后出水

  3. 还是额外需要验证控制位正确/正常。

注解与参考

参考

前人栽树后人乘凉…

S50非接触式IC卡存储控制浅谈(M1)
M1卡区块控制位详解

注解

在线乞讨😋,Donate comment here.

欢迎关注我的其它发布渠道