M1卡片相关(读卡,写卡,加密等)

M1卡信息

  1. 一张M1卡的存储量为1KB( 16扇区 * 4块 * 16字节 = 1024字节 = 1KB);
  2. 一张卡有16个扇区,每个扇区有4个块,每个块有16个字节的存储量。
  3. 1字节 = 8个二进制 = 2个16进制,
    所以一个块的存储量为:16个字节 = 128个二进制 = 32个16进制。
  4. 第0扇区的块0为厂商代码,已经固化。
    每个扇区的块3为控制块,用来存放密码和控制权限 ,不能用来存储数据。
    每个扇区的块0,块1,块2可以用来存储数据(扇区0的块0除外)。
  5. 每个扇区都有独立的密码和存取权限(存储在块3)。

读写卡流程

  1. 上电:使用卡片前需要上电,上电成功后可获取到卡的***,卡的类型等相关信息。
  2. 认证:认证需要:
    A. 选择KeyA或者KeyB;
    B. 认证的块;
    C. SNR***:即Byte数组类型的卡***(上电后即可获取);
    D. KeyA或者KeyB的值(默认12个F);
  3. 读写块。

读写卡相关

理论部分

  1. 在认证过密码之后,可以对每个扇区的块0,块1,块2进行数据存储(扇区0的块0除外)。每个块能存储32个16进制的字符。
  2. 块3用来存储该扇区的密码和存储权限。
  3. 块3的前6个字节为KeyA,后6个字节为KeyB。中间的4个字节为存储控制。
  4. 存取控制的4个字节:
    M1卡片相关(读卡,写卡,加密等)

  5. 数据块(块0,块1,块2)的存取控制如下:
    (计算出C10,C20,C30即可在下表中找出块0对应的权限)
    M1卡片相关(读卡,写卡,加密等)

  6. 控制块(块3)的存取控制如下:
    (计算出C13,C23,C33即可在下表中找出块0对应的权限)
    M1卡片相关(读卡,写卡,加密等)

实践部分

  1. 如果一个扇区的块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后可写