zoukankan      html  css  js  c++  java
  • M1卡介绍

    本文整理自网络。

     

    M1卡是指菲利浦下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50及S70两种型号,目前都有国产芯片与其兼容,属于非接触式IC卡。最为重要的优点是可读可写并且安全性高的多功能卡。这些优点与其自身的结构密不可分。
     
    主要指标
    • 容量为8K位EEPROM(Electrically Erasable Programmable Read-Only Memory,带电可擦可编程只读存储器)
    • 分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位
    • 每个扇区有独立的一组密码及访问控制
    • 每张卡有唯一序列号,为32位
    • 具有防冲突机制,支持多卡操作
    • 无电源,自带天线,内含加密控制逻辑和通讯逻辑电路
    • 数据保存期为10年,可改写10万次,读无限次
    • 工作温度:-20℃~50℃(温度为90%)
    • 工作频率:13.56MHZ
    • 通信速率:106KBPS
    • 读写距离:10mm以内(与读写器有关)
     
    存储结构

    1、M1卡分为16个扇区,每个扇区4块(块0~3),共64块,按块号编址为0~63。第0扇区的块0(即绝对地址0块)用于存放厂商代码,已经固化,不可更改。其他各扇区的块0、块1、块2为数据块,用于存贮数据;块3为控制块,存放密码A、存取控制、密码B。每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。存贮结构如下表所示:

     
    块0
        IC卡厂家信息
    数据块
    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。具体结构如下:

    各区控制块3 结构 字节号 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
    控制值 FF FF FF FF FF FF  FF 07 80 69 FF FF FF FF FF FF
    说明  密码A(0~5字节)  存取控制(6~9字节) 密码B(10~15字节)

      密码A(6字节)  存取控制(4字节) 密码B(6字节) 

    5、每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。存取控制为4个字节,共32位,扇区中的每个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有相应的三个控制位,定义如下:

    :控制位定义"CXxy" (x=0~15扇区; y=块0,块1,块2) 

    块0 C1x0 C2x0  C3x0  用户数据块,(0区0块除外) 
    块1 C1x1 C2x1 C3x1 用户数据块
    块2  C1x2 C2x2 C3x2  用户数据块
    块3 C1x3 C2x3 C3x3 密匙存取控制块

    例如C1x0中的C代码这是控制位,1代表第一位,0代表是块0的控制位。

    三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如进行减值操作必须验证KEY A,进行加值操作必须验证KEY B,等等)。三个控制位在存取控制字节中的位置

    表:三个控制位在存取控制字节中的位置(注:" _b" 表示取反) 

    字节号 | 位号 bit 7 6 5 4 3 2 1 0
    字节6 C2x3_b C2x2_b C2x1_b C2x0_b C1x3_b C1x2_b  C1x1_b  C1x0_b 
    字节7 C1x3  C1x2  C1x1  C1x0  C3x3_b  C3x2_b  C3x1_b  C3x0_b 
    字节8 C3x3  C3x2  C3x1  C3x0  C2x3  C2x2  C2x1  C2x0 
    字节9 BX7  BX6  BX5  BX4  BX3  BX2  BX1  BX0 
    所属块 块3控制位 块2控制位 块1控制位 块0控制位 块3控制位 块2控制位 块1控制位 块0控制位



    以块0为例,对块0的控制:

    bit

    7

    6

    5

    4

    3

    2

    1

    0

    字节6

    C20_b

    C10_b

    字节7

    C10

    C30_b

    字节8

    C30

    C20

    字节9

    ( 注: C10_b表示C10取反 )

    存取控制(4字节,其中字节9为备用字节)结构如下所示:

    bit

    7

    6

    5

    4

    3

    2

    1

    0

    字节6

    C23_b

    C22_b

    C21_b

    C20_b

    C13_b

    C12_b

    C11_b

    C10_b

    字节7

    C13

    C12

    C11

    C10

    C33_b

    C32_b

    C31_b

    C30_b

    字节8

    C33

    C32

    C31

    C30

    C23

    C22

    C21

    C20

    字节9

     ( 注: _b表示取反 )

    6、数据块(块0、块1、块2)的存取控制如下:

      控制位(X=0..2)

             访 问 条 件 (对数据块 0、1、2)

    C1X

    C2X

    C3X

     Read

     Write

    Increment

    Decrement, transfer,

    Restore

    0

    0

    0

    KeyA|B

    KeyA|B

    KeyA|B

    KeyA|B

    0

    1

    0

    KeyA|B

    Never

    Never

    Never

    1

    0

    0

    KeyA|B

    KeyB

    Never

    Never

    1

    1

    0

    KeyA|B

    KeyB

    KeyB

    KeyA|B

    0

    0

    1

    KeyA|B

    Never

    Never

    KeyA|B

    0

    1

    1

    KeyB

    KeyB

    Never

    Never

    1

    0

    1

    KeyB

    Never

    Never

    Never

    1

    1

    1

    Never

    Never

    Never

    Never

    (KeyA|B 表示密码A或密码B,Never表示任何条件下不能实现)

     例如:当块0的存取控制位C10 C20 C30=1 0 0时,验证密码A或密码B正确后可读;验证密码B正确后可写;不能进行加值、减值操作。

     7、控制块(块3)的存取控制与数据块(块0、1、2)不同,它的存取控制如下:

    密码A

    存取控制

    密码B

    C13

    C23

    C33

    Read

    Write

    Read

    Write

    Read

    Write

    0

    0

    0

    Never

    KeyA|B

    KeyA|B

    Never

    KeyA|B

    KeyA|B

    0

    1

    0

    Never

    Never

    KeyA|B

    Never

    KeyA|B

    Never

    1

    0

    0

    Never

    KeyB

    KeyA|B

    Never

    Never

    KeyB

    1

    1

    0

    Never

    Never

    KeyA|B

    Never

    Never

    Never

    0

    0

    1

    Never

    KeyA|B

    KeyA|B

    KeyA|B

    KeyA|B

    KeyA|B

    0

    1

    1

    Never

    KeyB

    KeyA|B

    KeyB

    Never

    KeyB

    1

    0

    1

    Never

    Never

    KeyA|B

    KeyB

    Never

    Never

    1

    1

    1

    Never

    Never

    KeyA|B

    Never

    Never

    Never

    例如:当块3的存取控制位C13 C23 C33=1 0 0时,表示:

    密码A:    不可读,验证KEYB正确后可写(更改)。

    存取控制:不可写,验证KEYA或KEYB正确后可读。

    密码B:    不可读,验证KEYB正确后可写。

     

    工作原理

    卡片的电气部分只由一个天线和ASIC(Application Specific Integrated Circuit)组成。

    天线:卡片的天线是只有几组绕线的线圈,很适于封装到IS0卡片中。

    ASIC:卡片的ASIC由一个高速(106KB波特率)的RF接口,一个控制单元和一个8K位EEPROM(Electrically Erasable Programmable Read-Only Memory,带电可擦可编程只读存储器)组成。

    工作原理:读写器向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与讯写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2V时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。

     

    复位应答(Answer to request)

    M1射频卡的通讯协议和通讯波特率是定义好的,当有卡片进入读写器的操作范围时,读写器以特定的协议与它通讯,从而确定该卡是否为M1射频卡,即验证卡片的卡型。

    防冲突机制 (Anticollision Loop)

    当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作,未选中的则处于空闲模式等待下一次选卡,该过程会返回被选卡的序列号。

    选择卡片(Select Tag)

    选择被选中的卡的序列号,并同时返回卡的容量代码。

    三次互相确认(3 Pass Authentication)

    选定要处理的卡片之后,读写器就确定要访问的扇区号,并对该扇区密码进行密码校验,在三次相互认证之后就可以通过加密流进行通讯。(在选择另一扇区时,则必须进行另一扇区密码校验。)

    对数据块的操作

    读 (Read):读一个块;

    写 (Write):写一个块;

    加(Increment):对数值块进行加值;

    减(Decrement):对数值块进行减值;

    存储(Restore):将块中的内容存到数据寄存器中;

    传输(Transfer):将数据寄存器中的内容写入块中;

    中止(Halt):将卡置于暂停工作状态;

     

     

    M1卡运作机理

    连接读写器→寻卡→识别卡(获取卡序列号)→从多卡中选一张卡→向卡中缓冲区装载密码→验证密码→进行读写→关闭连接

    即(代码说明)

    Open_USB→rf_request→rf_anticoll→rf_select→rf_load_key→rf_authentication→(/a_hex)→rf_read/rf_write→(hex_a)→Close_USB

    如果概括来说的话,主要也就四部分:开关连接、寻卡、验证密码、读取。

     

    基本操作规则

    (1)程序开始,调用rf_init函数初始化串口。

    (2)寻卡,调用rf_card;

            相当于连续调用三个函数:

        rf_request

        rf_anticoll

          rf_select

        注:调用高级函数对卡进行操作时,无需此步骤。

    (3)对单个扇区操作,顺次执行A~D;

        对多个扇区操作,循环执行A~E;

        A、选定要操作的扇区;

        B、装载密码,调用rf_load_key;

        C、验证密码,调用rf_authentication;

        D、进行操作,包括读写及值操作。

        E、调用rf_halt。

    (4)关闭串口,调用rf_exit。程序正常退出或因错误退出之前,要使用函数;否则再次执行初始化串口时将出错。

    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)的存取控制如下:

    例如:当块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

    返 回:成功则返回 0

    由上我们看出_B0、_B1、_B2、_B3分别控制块0、块1、块2、块3。

    由图我们可知_B0、_B1、_B2的可取值为 0、10、100、110、1、11、101、111。

    这里大家一定要注意一点:

    不能装载密码到M1卡某一扇区后再更改那扇区的密码(最好连接完读写器后直接更改密码),否则更改密码会失败而冻结扇区。如果不慎这样了,解决的办法是完成一次读写操作,再更改密码。

    控制块(块3)的存取控制与数据块(块0、1、2)不同,它的存取控制如下:

    _B3的取值与_B0相同。

    存取控制举例
    例1:块3的初始化值为:
    KeyA=A0、A1、A2、A3、A4、A5
    控制块=FF、07、80、69
    KeyB=B0、B1、B2、B3、B4、B5
     
    字节  Bit 7  Bit 6 Bit 5   Bit 4  Bit 3  Bit 2  Bit 1  Bit 0 权限  二进制
    Byte6 C2X3_b C2X2_b C2X1_b C2X0_b C1X3_b C1X2_b C1X1_b C1X0_b FF 1 1 1 1 1 1 1 1
    Byte 7 C1X3 C1X2 C1X1 C1X0 C3X3_b C3X2_b C3X1_b C3X0_b 07 0 0 0 0 0 1 1 1
    Byte 8 C3X3 C3X2 C3X1 C3X0 C2X3 C2X2 C2X1 C2X0 80 1 0 0 0 0 0 0 0
    Byte 9 BX7 BX6 BX5 BX4 BX3 BX2 BX1 BX0 69 0 1 1 0 1 0 0 1


    得出存取控制位如下:
    块0 C1X0 C2X0 C3X0 0 0 0
    块1 C1X1 C2X1 C3X1 0 0 0
    块2 C1X2  C2X2 C3X2 0 0 0
    块3 C1X3 C2X3  C3X3 0 0 1
     
    例2:块3的初始化值为:
    KeyA=A0、A1、A2、A3、A4、A5
    控制块=08、77、8F、00
    KeyB=B0、B1、B2、B3、B4、B5
    字节 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 权限  二进制
    Byte 6 C2X3_b C2X2_b C2X1_b C2X0_b C1X3_b C1X2_b C1X1_b C1X0_b 08 0 0 0 0 1 0 0 0
    Byte 7 C1X3 C1X2 C1X1 C1X0 C3X3_b C3X2_b C3X1_b C3X0_b 77 0 1 1 1 0 1 1 1
    Byte 8 C3X3 C3X2 C3X1 C3X0 C2X3 C2X2 C2X1 C2X0 8F 1 0 0 0 1 1 1 1
    Byte 9 BX7 BX6 BX5 BX4 BX3 BX2 BX1 BX0 00 0 0 0 0 0 0 0 0
     
    得出存取控制位如下:
    块0 C1X0 C2X0 C3X0 1 1 0
    块1 C1X1 C2X1 C3X1 1 1 0
    块2 C1X2  C2X2 C3X2 1 1 0
    块3 C1X3 C2X3  C3X3 0 1 1



    M1卡使用注意事项

    快速识别EM卡,HID卡和MF卡

    如果是一面平,一面代坡并且底面有一排数字的为EM卡,剩下两张应该是平的,其中一张应该是另一张的二倍厚,那么厚的那张是HID卡,薄的是MF卡。M1卡写数据是直接向控制块里写,但能写的前提是扇区的密码已得到确认.向控制块中写数据时,首先要理解控制块中控制位的用途.避免写入无效数据后,扇区被锁死。每个控制块共16个字节,前6个和后6个字节是密码KeyA和KeyB,中间4个字节是控制位.如果写错控制位,即使你知道KeyA/KeyB,也再也不能访问这个扇区了。
     
    所谓三次互相认证是只在进行真正的数据交换前,卡和读写器之间会传输一些随机产生的密钥,在确认这一次通讯的密钥后,真正的数据才会使用这些密钥加密后进行通讯.密钥产生过程就是三次认证.由于每一次密钥不同,所以即使是进行相同数据的通讯,在卡和读卡器之间的每次通讯信号都是不同的,没法捕捉。这三次认证跟密钥KEYA或KEYB是有关的。的确需要事先设定读卡机和卡片的密钥一致才能认证。认证时通过随机数和KEYA或KEYB产生一个后续通信需要的流加密种子,当然读卡机和卡片的加密算法和该种子需保持一致。
     

    MF1卡常见问题及处理建议:

    • ① 盲目操作:造成某些区块误操作被锁死不能再使用。应当仔细参考表3表5的控制权限后,予先得出操作后的结果是否适合使用要求,并且列出操作顺序表单再操作。最好授权程序员对块3的设置作专人操作。
    • ② 丢失密码:再读写时造成密码认证出错而不能访问卡。特别要求在对MF卡进行块3编程操作时,必须及时记录相关卡号的控制值,KeyA,KeyB等,而且应当有专人管理密码档案。
    • ③ 错误设置:对MF1卡的块3控制块了解不透彻,错误的理解造成设置造成错误的设置。依照表2可知,目前Mf1卡的控制块仅只有8种数据块访问控制权限和8种控制块设置权限,超出这16种权限的其他代码组合,将直接引起错误设置而使卡片报废!
    • ④ 极端权限:当块3的存取控制位C13 C23 C33 = 110或者111时,称为极端权限。除特殊应用外一般不被使用!启用前认真权衡对密码读写,存取控制的锁死是否必要,否则,数据加密后即使有密码也无法读取被锁死的数据区块(看不见)!
    • ⑤ 设备低劣:低劣的设备将直接影响卡的读写性能。对MF卡进行块3编程操作的设备,特别要求其性能必须十分可靠,运行十分稳定!建议选用由飞利浦公司原装读写模块构建的知名读写机具!
    • ⑥ 编程干扰:在对块3进行编程操作时,不可以有任何的‘IO‘中断或打扰!包括同时运行两个以上程序干扰甚至PC机不良的开关电源纹波干扰等,否则,不成功的写操作将造成某个扇区被锁死的现象,致使该扇区再次访问时出错而报废。
    • ⑦ 数据出错:在临界距离点上读卡和写卡造成的。通常的读卡,特别是写卡,应该避免在临界状态(刚能读卡的距离)读卡。因为临界状态下的数据传送是很不稳定的!容易引起读写出错!
    • ⑧ 人为失误:例如,密码加载操作失误,误将KeyA加载为KeyB;或者是误将其他制卡厂约定的初始密码值如a0a1a2a3a4a5,b0b1b2b3b4b5加载到本公司生产的MF1卡内;或者在初始状态下(密码A=000000000000【隐藏状态,实际为ffffffffffff】,控制位=FF 07 80 69,密码B=ffffffffffff【可见】)若不经意地将KeyA=000000000000 删除后又重新输入12个‘0‘,并加载了它!这时无意中已将KeyA原来12个隐藏的‘f‘,修改成了12个‘0‘,其后果可想而知!
    • ⑨ 卡片失效:读写均无数据传送,读写器报告‘寻卡错误‘!卡片被超标扭曲,弯曲而造成内电路断裂。
    • ⑩ 读写距离过近:与用户使用的读写器性能有关。标准型MF1卡的读写距离可达10cm(在飞利浦公司的标准读写机具上测试的最大距离),国产知名品牌读写器一般可达5-10cm。尺寸较小的匙扣卡,其读写距离当然比标准卡近许多,但只要可靠的读写距离≥5~10mm以上,一般不会影响正常使用!
     
     
     
     
     
    实际应用
     
    M1 卡的格式化方法:
    例如,M1 卡的某一扇区的块3数据为:
    KEYA:FFFFFFFFFFFF
    控制值:FF078069
    KEYB:FFFFFFFFFFFF
     
    现要格式化卡(假如验证密码A)为:
    KEYA 输入 FFFFFFFFFFFF
    KEYB 输入 123456781234
    则可以格式化
     
    KEYA 输入 123456781234
    KEYB 输入 FFFFFFFFFFFF
    也可以格式化
    即先用输入的KEYA与卡中控制块的KEYA比较,验证失败再用输入的KEYB与卡中控制块的KEYB比较,验证失败则失败,否则成功。
     
     
     
     
     
     
  • 相关阅读:
    SQL注入过滤
    ASP.NET长文章分页
    简单的权限管理类
    不错的面试题
    【转载】【重要】Ubuntu Linux 下 Ffmpeg 及 Mencoder 安装使用小结
    回到xwindows
    suse11 linux不自动启动xwindows
    flash的几种工具
    mencoder和ffmpeg参数详解
    ffmpeg和Mencoder使用实例小全
  • 原文地址:https://www.cnblogs.com/ivantang/p/3904025.html
Copyright © 2011-2022 走看看