zoukankan      html  css  js  c++  java
  • M1卡的工作原理【转】

    本文转载自:https://blog.csdn.net/zmq5411/article/details/52042457

    M1卡的工作原理

    本篇对M1卡的编程是利用上述第二种方法。
    M1卡最为重要的优点是可读可写并且安全性高的多功能卡。这些优点与其自身的结构密不可分。
     
    M1结构:
    M1卡分为16个扇区,每个扇区4块(块0~3),共64块,按块号编址为0~63。第0扇区的块0(即绝对地址0块)用于存放厂商代码,已经固化,不可更改。其他各扇区的块0、块1、块2为数据块,用于存贮数据;块3为控制块,存放密码A、存取控制、密码B。每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。
    M1卡运作机理:
    连接读写器→寻卡→识别卡(获取卡序列号)→从多卡中选一张卡→向卡中缓冲区装载密码→验证密码→进行读写→关闭连接
    即(代码说明)
    Open_USB→rf_request→rf_anticoll→rf_select→rf_load_key→rf_authentication→(/a_hex)→rf_read/rf_write→(hex_a)→Close_USB
    如果概括来说的话,主要也就四部分 开关连接、寻卡、验证密码、读取。
    (至于详细程序代码,相信大家自己看过dll说明文档后,自己会明白的,这里就不写了,因为内容多)
     
    M1卡功能模式:
    1.寻卡模式:
    寻卡模式分三种情况:IDLE模式、ALL模式及指定卡模式(0,1,2 均是int类型,是方法参数,下同)。
         0——表示IDLE模式,一次只对一张卡操作;
         1——表示ALL模式,一次可对多张卡操作;
         2——表示指定卡模式,只对序列号等于snr的卡操作(高级函数才有)【不常用】
    也就是说,我们一次也可以同时操作多张卡。
    对于多卡操作,其实际真正执行操作的还是一张卡。读写器能识别多张卡的序列号(但注意识别出的顺序是不定的,并且最多也就能识别4张卡,因为卡叠放的厚度太厚,会超出读写器的识别范围),并一一进行操作。
    所以由此看出,多卡操作的意义并不大。但我建议大家还是设置为1好了(原因不说了,自己感受吧,其实无所谓)。
    2.密码验证模式:
         0——KEYSET0的KEYA
         4——KEYSET0的KEYB
    M1卡可以在验证密码时选择密码类型(A/B)。【其实M1卡有3套密码(KEYSET0、KEYSET1、KEYSET2),共6个密码(用0~2、4~6来表示这六个密码),目的是为了适应不同读写器。而这里我们用的是KEYSET0的2个密码】
     
    M1卡密码机制:
    这可以说是M1卡的精髓了,也是M1卡最为复杂的地方,希望大家耐心看完。
    (请先看明白M1卡结构)如上所说,在存取控制中每个块都有相应的三个控制位,它们的定义如下:
         块0:   C10   C20   C30
         块1:   C11   C21   C31
         块2:   C12   C22   C32
         块3:   C13   C23   C33
    一个扇区的三个数据块,我们可以利用密码机制对它们分别进行权限控制。数据块(块0、块1、块2)的存取控制如下:
    M1卡编程
    例如:当块0的存取控制位C10 C20 C30=100时,验证密码A或密码B正确后可读;验证密码B正确后可写;不能进行加值、减值操作。
    那么M1卡修改密码的方法是rf_changeb3
    参数:
         icdev:通讯设备标识符
         _SecNr:扇区号(0~15)
         KeyA:密码A
         _B0:块0控制字,低3位(D2D1D0)对应C10、C20、C30
         _B1:块1控制字,低3位(D2D1D0)对应C11、C21、C31
         _B2:块2控制字,低3位(D2D1D0)对应C12、C22、C32
         _B3:块3控制字,低3位(D2D1D0)对应C13、C23、C33
         _Bk:保留参数,取值为0
         _KeyB:密码B
    由上我们看出_B0、_B1、_B2、_B3分别控制块0、块1、块2、块3。
    由图我们可知_B0、_B1、_B2的可取值为 0、10、100、110、1、11、101、111。
    这里大家一定要注意一点:
    不能装载密码到M1卡某一扇区后再更改那扇区的密码(最好连接完读写器后直接更改密码),否则更改密码会失败而冻结扇区。如果不慎这样了,解决的办法是完成一次读写操作,再更改密码。
    控制块(块3)的存取控制与数据块(块0、1、2)不同,它的存取控制如下:
    M1卡编程
    _B3的取值与_B0相同。
     
    一、主要指标
    容量为8K位EEPROM
    分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位
    每个扇区有独立的一组密码及访问控制
    每张卡有唯一序列号,为32位
    具有防冲突机制,支持多卡操作
    无电源,自带天线,内含加密控制逻辑和通讯逻辑电路
    数据保存期为10年,可改写10万次,读无限次
    工作温度:-20℃~50℃(温度为90%)
    工作频率:13.56MHZ
    通信速率:106KBPS
    读写距离:10mm以内(与读写器有关)
    二、存储结构
    1、M1卡分为16个扇区,每个扇区由4块(块0、块1、块2、块3)组成,(我们也将16个扇区的64个块按绝对地址编号为0~63,存贮结构如下图所示:
     
    块0
        
    数据块
    0
    扇区0 
    块1
     
    数据块
    1
     
    块2
     
    数据块
    2
     
    块3
    密码A   存取控制   密码B
    控制块
    3
    块0
     
    数据块
    4
    扇区1
    块1
     
    数据块
    5
     
    块2
     
    数据块
    6
     
    块3
    密码A   存取控制   密码B
    控制块
    7
     
     
                ∶
          ∶
          ∶
     
     
     
      0
     
    数据块
    60
    扇区15 
      1
     
    数据块
    61
     
      2
     
    数据块
    62
     
      3
    密码A    存取控制   密码B
    控制块
    63
    2、第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。
    3、每个扇区的块0、块1、块2为数据块,可用于存贮数据。
    数据块可作两种应用:
    用作一般的数据保存,可以进行读、写操作。
    用作数据值,可以进行初始化值、加值、减值、读值操作。
    4、每个扇区的块3为控制块,包括了密码A、存取控制、密码B。具体结构如下:
              密码A(6字节)  存取控制(4字节) 密码B(6字节) 
    5、每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有相应的三个控制位,定义如下:
    进行减值操作必须验证KEY A,进行加值操作必须验证KEY B,等等:
     三、工作原理
    卡片的电气部分只由一个天线和ASIC组成。
    天线:卡片的天线是只有几组绕线的线圈,很适于封装到IS0卡片中。
    ASIC:卡片的ASIC由一个高速(106KB波特率)的RF接口,一个控制单元和一个8K位EEPROM组成。
    工作原理:读写器向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与讯写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2V时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。
    复位应答(Answer to request)
    M1射频卡的通讯协议和通讯波特率是定义好的,当有卡片进入读写器的操作范围时,读写器以特定的协议与它通讯,从而确定该卡是否为M1射频卡,即验证卡片的卡型。
    防冲突机制 (Anticollision Loop)
    当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作,未选中的则处于空闲模式等待下一次选卡,该过程会返回被选卡的序列号。
    选择卡片(Select Tag)
    选择被选中的卡的序列号,并同时返回卡的容量代码。
    三次互相确认(3 Pass Authentication)
    选定要处理的卡片之后,读写器就确定要访问的扇区号,并对该扇区密码进行密码校验,在三次相互认证之后就可以通过加密流进行通讯。(在选择另一扇区时,则必须进行另一扇区密码校验。)
    对数据块的操作
    读 (Read):读一个块;
    写 (Write):写一个块;
    加(Increment):对数值块进行加值;
    减(Decrement):对数值块进行减值;
    存储(Restore):将块中的内容存到数据寄存器中;
    传输(Transfer):将数据寄存器中的内容写入块中;
    中止(Halt):将卡置于暂停工作状态;

  • 相关阅读:
    jsp下载文件方法
    关于java控制台输入(转载)
    java数据结构表的学习
    一个简单的java读取网页图片并保存图片的程序
    (转)Java中toArray的用法探究(java数组与list转换)
    点击空白处隐藏div
    H5页面IOS将数字识别成蓝色
    css的公共样式(移动端使用rem做单位)
    HTML5 虚拟键盘出现挡住输入框的解决办法
    解决ios下不兼容keyup,keydown等事件
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/9117303.html
Copyright © 2011-2022 走看看