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

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qizewei123/article/details/80514083

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个字节:
    这里写图片描述

  5. 数据块(块0,块1,块2)的存取控制如下:
    (计算出C10,C20,C30即可在下表中找出块0对应的权限)

  6. 控制块(块3)的存取控制如下:
    (计算出C13,C23,C33即可在下表中找出块0对应的权限)
    这里写图片描述

实践部分

  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后可写
展开阅读全文

没有更多推荐了,返回首页