• BERTLV数据结构


    本文是自身在研究学习过程中碰到的问题,整理而成。

    为了便于后文的引用说明,先列出一段TLV结构的数据:

    [6F] 4D
    │ ├─[84] 07 A0000003330101
    │ ├─[A5] 42
    │ │ ├─[50] 0B 50424F4320437265646974
    │ │ ├─[87] 01 01
    │ │ ├─[9F38] 06 9F33039F4E14
    │ │ ├─[5F2D] 08 7A68656E66726465
    │ │ ├─[9F11] 01 01
    │ │ ├─[9F12] 0F 4341524420494D4147452030303031
    │ │ ├─[BF0C] 05
    │ │ │ └─[9F4D] 02 0B0A
    • BER-TLV数据对象结构

    • Tag(标记)

    根据ISO/IEC 8825-1(doc88上可以查看较早版本 )规范的定义,BER-TLV结构由Tag、Length、Value三部分组成;

    Tag可以由1个与多个字节组成,如下图所示:

    其中最为主要的是首字节,由三部分组成,高两位表示类别,低五位表示TagNumber,第6位表示类型;

    • Tag类别

    首字节的解析EMV规范中的一张图说明很详细,国内也可以参考PBOC规范。

    由上图可以看出,高两位表示的四种类别,分别为:

    00:通用类

    01:应用类

    02:上下文相关类

    03:专用类

    在智能卡中见得较多的是应用类与上下文相关类,通用类与行业无关,好像只有一个(0x06:Object Identifier);应用类就很多了,如前文中的0x6F,

    还有经常碰到的0x4F表示AID(应用标识符),在7816中定义,在其它很多的应用中就遵循了,如EMV,PBOC,GP等。

    0x6F: '0110 1111'

    0x4F: '0100 1111'

    上下文类在特定的使用环境中意义不一样,具体可以参考相应的规范定义。专用类一般在私有的定义中出现,例如一些卡商在卡片的预个人化命令中使用。

    对于各类别表示的范围如上表所示,该表格来自《智能卡技术》一书。 

    • Tag类型

    Tag的类型由第6位表示,

    0:表示简单类型

    1:表示结构类型

    可以用一个比喻来理解两种类型的区别,简单类型相当于树形结构中的叶子节点,结构类型相当于枝干。例如如下的数据中,

    84、50、87等处在叶子节点上的tag就表示简单类型,而6F、A5等表示结构类型。用二进制表示更为直观理解。

    0x6F: '0110 1111'

    0x50: '0101 0000' 

    • Tag编号

    Tag编号要根据Tag的长度来确定,对于一个字节的Tag,能表示的编号为2^5为32,但全为1的时候表示有后续字节,

    因此一个字节的tag只能表示31个编号,大于31的只能由第多个字节表示;

    在平常使用中感觉很少碰到,只在JavaCard的一个demo中使用过(说到这里顺便提下,在JavaCard提供的API中,

    有一个包专门为TLV提供数据打包与解析。但在使用过程中碰到一个问题,类似前文中例子中的9F11这个Tag解析不了)。

    如上图所示,根据解析得到TAG9F11的Tag编号为0x11,个人理解此处的0x10应该表示的编号为(0x11+31)。 

    • Length(长度)

    BER-TLV中的长度表示Value域中的数据长度,由1到多个字节组成,如果首字节的最高位为0,则低7位表示长度,

    最大值为0x7F,Value数据长度大于128个字节则Length都由3个字节表示。对于超过256字节较少见到,

    JavaCard中的下载文件时使用的Tag经常用到,扩展APDUs可能用到。 

    • Value(值)

    值由一个或多个字节组成,根据Tag中的类型不同,有简单类型及结构类型两种表示方法,如本文最开始提供的数据中,

    tag6F的数据长度为0x4D,值域为后面所有的数据。

       

    作者:SCPlatform
    Email:SCPlatform@outlook.com
    本文旨在学习、交流使用,任何对文章内容的出版、印刷,对文章中提到的技术的商业使用时,请注意可能存在的法律风险。

  • 相关阅读:
    简述密码
    w命令
    Python打包-Pyinstaller
    [转]油猴Tampermonkey-让百度云下载飞起来
    百度云高速下载Pandownload
    AdoConnect-获取连接字符串 (工具)
    Python爬虫-豆瓣电影 Top 250
    C++中使用ODBC API访问数据库例程
    Python爬虫-什么是爬虫?
    Python+Django(Python Web项目初体验)
  • 原文地址:https://www.cnblogs.com/SCPlatform/p/5076935.html
Copyright © 2020-2023  润新知