M1卡信息
- 一张M1卡的存储量为1KB( 16扇区 * 4块 * 16字节 = 1024字节 = 1KB);
- 一张卡有16个扇区,每个扇区有4个块,每个块有16个字节的存储量。
- 1字节 = 8个二进制 = 2个16进制,
所以一个块的存储量为:16个字节 = 128个二进制 = 32个16进制。 - 第0扇区的块0为厂商代码,已经固化。
每个扇区的块3为控制块,用来存放密码和控制权限 ,不能用来存储数据。
每个扇区的块0,块1,块2可以用来存储数据(扇区0的块0除外)。 - 每个扇区都有独立的密码和存取权限(存储在块3)。
读写卡流程
- 上电:使用卡片前需要上电,上电成功后可获取到卡的序列号,卡的类型等相关信息。
- 认证:认证需要:
A. 选择KeyA或者KeyB;
B. 认证的块;
C. SNR序列号:即Byte数组类型的卡序列号(上电后即可获取);
D. KeyA或者KeyB的值(默认12个F); - 读写块。
读写卡相关
理论部分
- 在认证过密码之后,可以对每个扇区的块0,块1,块2进行数据存储(扇区0的块0除外)。每个块能存储32个16进制的字符。
- 块3用来存储该扇区的密码和存储权限。
- 块3的前6个字节为KeyA,后6个字节为KeyB。中间的4个字节为存储控制。
- 存取控制的4个字节:
- 数据块(块0,块1,块2)的存取控制如下:
(计算出C10,C20,C30即可在下表中找出块0对应的权限) - 控制块(块3)的存取控制如下:
(计算出C13,C23,C33即可在下表中找出块0对应的权限)
实践部分
- 如果一个扇区的块3的存储控制字节为: 08 77 8F 69
- 转为二进制即
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为备用字节,可忽略。 - 参照理论部分第4条,字节6全部取反, 字节7的低4位取反,得到:
C2Y:1111 C1Y:0111
C1Y:0111 C3Y:1000
C3Y:1000 C2Y:1111
对应块:3210 对应块:3210 - 高4位的各块值=低4位的各块值时,其值可用。高4位值≠低4位值时,其值不可用!
- C10 C20 C30 = C1Y C2Y C3Y = 1 1 0
所以块0的权限为:验证KeyA或者KeyB可读,可减值,可初始化,验证KeyB后可写,可加值。
C13 C23 C33 = C1Y C2Y C3Y = 0 1 1
所以块3的权限为:验证KeyA或者KeyB可读,验证KeyB后可写
所以扇区KeyA的权限为:KeyA 不可读,验证KeyB后可写
所以扇区KeyB的权限为:KeyB 不可读,验证KeyB后可写