前面我们已经学习M1卡的存储方面的知识,M1卡的存储空间是1KB(1024字节),被组织成一个规整的16扇区,每个扇区4块,每个块16字节的形式。对于0号扇区,第0块已经被固化为UID,不能被修改。而每个块的3号块内保存的是存取锁,用来决定存取这个扇区的所有块的控制信息,只有前三个块是作为数据块使用的。

存取控制为4个字节,扇区中的每个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有相应的三个控制位(C1、C2、C3),定义如下:
块0: C10 C20 C30
块1: C11 C21 C31
块2: C12 C22 C32
块3: C13 C23 C33


以最常见的默认存取控制字节 FF 07 80 69 为例,
字节位置 | 十六进制 | 二进制 (Bit 7-0) | 说明 |
字节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 | 部分控制位的正码 |
字节9 | 69 | (通常为备用,不参与控制位计算) |
因此:
C10 = 0000,C10_b = 1111:C1_0=0,C1_1=0,C1_2=0,C1_3=0
C20 = 0000,C20_b = 1111:C2_0=0,C2_1=0,C2_2=0,C2_3=0
C30 = 1000,C30_b =0111:C3_0=0,C3_1=0,C3_2=0,C3_3=1
将关键位提取并还原后,就能得到每个块真实的控制位组合:
块0 (数据块): C1_0=0, C2_0=0, C3_0=0
块1 (数据块): C1_1=0, C2_1=0, C3_1=0
块2 (数据块): C1_2=0, C2_2=0, C3_2=0
块3 (控制块): C1_3=0, C2_3=0, C3_3=1
可以看到,块0、1、2的控制位都是0 0 0,而块3(尾块)是0 0 1,它的权限规则完全不同。
接下来看下权限的设置。权限的设置上,对于数据块(0、1、2)和控制块(3),是不同的。

操作说明:
读 (Read):读一个块;
写 (Write):写一个块;
加(Increment):对数值块进行加值;
减(decr):对数值块进行减值;
存储(restore):将块中的内容存到数据寄存器中;
传输(transfer):将数据寄存器中的内容写入块中;

这样的话,
1)对于前面的块0、1、2的权限均为000,表示使用KeyA或KeyB可以进行读写,可以进行加减等处理。
2)对于前面的块3的权限为001,表示禁止读取KeyA,可以使用KeyA或KeyB进行写;可以使用KeyA或KeyB对keyB进行读写。
这个控制字很重要,一旦写错了,可能会造成后续再也无法操作这个扇区。
我要赚赏金
