1. 引言
当前系统的多卡种兼容性问题主要是有多种卡片,且每个卡片购气系统互相不兼容导致。因为燃气表具的安装不是一蹴而就的,是有一个过程,每年安装更换固定数量的表具,长时间的气表迭代造成了厂商数量的多样性,同一个厂商在不同阶段又有可能提供不同种类的表具,对应的问题就是系统中卡片的多样性。当前系统中的表具大致分为以下几种:不含任何智能化结构的纯机械式燃气表、使用存储卡的IC卡燃气表、使用逻辑加密卡的IC卡燃气表和使用CPU卡的智能燃气表,使用NB-IOT技术的物联网燃气表。
因为系统中不同的表具对应着不同种类的卡片,且购气系统由厂家提供,所以不同种类的卡片是在不同的购气系统中购气。比如厂商A提供的是使用AT24C0X卡片的表具,对应着使用A购气系统,且配备的A读卡器能适配AT24C0X卡片;厂商B提供的是使用SLE4442卡片的表具,对应着使用B购气系统,且配备的B读卡器能适配SLE4442卡片;厂商C提供的是使用CPU卡片的表具,对应着使用C购气系统,且配备的C读卡器能适配CPU卡片。不同的系统不能兼容不同的读卡器,不能兼容不同的卡片,不同的系统形成了一个个孤岛,为操作人员操作购气系统带来了较大的不便。
鉴于以前多卡种的情况,本文设计了一套有别于普通卡的一套体系,其中包括CPU卡技术规范,密钥管理系统,加密机使用规范,工具卡使用规范,表具开发规范等一系列的规范。本文只讨论CPU用户卡部分,别的部分不在本文的讨论范畴。规范规定的CPU卡为符合中国金融集成电路(IC)卡规范的卡片,由燃气公司定义卡片的卡文件结构、钱包文件大小、密钥的生成规则以及导入规则。卡片发行后,会提供给表商,表商根据对应的规范进行表具研发。规范由燃气公司制定,表商根据相同的规范进行研发,这样所有的表商提供给燃气公司的表具都是遵循统一规范,卡片只需使用一种卡片,即可适配所有表具,推广以后即可解决当前系统中多卡种并存的问题,以某燃气公司为例,有五家表商对新型的卡片规范进行适配,以后提供给燃气公司的表具都会适配最新的CPU卡。随着时间的推进,存量的IC卡表用户会越来越少,最终全部更换成CPU卡表。
上面提供了多卡种问题的解决方案,但是当前系统中还是几种卡片并存的局面,所以安全读卡器也是需要对当前系统中存量的IC卡进行适配。
2. 兼容模组的设计
兼容性模组是基于蓝牙读卡器实现的,是在蓝牙读卡器上设计一套流程来识别对应的卡片。需要识别的卡片根据当前系统中的卡片类别分为三种卡片,分别是AT24C0X卡、SLE4442卡、CPU卡。AT24C0X卡是第一代的IC卡,属于存储卡,此类IC卡的特点是存储数据方便,使用比较简单,价格比较便宜,但是安全性很低;SLE4442卡是第二代的IC卡,属于逻辑加密卡,相对于AT24C0X这种存储卡,此卡内部在存储区外增加了控制部分,在写存储区前需要做3字节的密码认证,安全性较高;CPU卡是最新一代的智能IC卡,相对于别的IC卡,安全性更高,内置了操作系统和对应的算法单元,具有存储容量大,处理能力强,信息存储安全等特点。三种卡片具体信息如表1所示。
![](Images/Table_Tmp.jpg)
Table 1. Comparison of three cards
表1. 三种卡片的对比
2.1. 兼容模组设计概述
兼容模组的设计是为了让安全读卡器识别三种卡片,当插入对应卡片时,读卡器自动判断出当前插入的卡片,并把卡片种类反馈到应用端。应用端接收到卡片种类的反馈后,再根据不同的卡片,进入不同的操作流程:当识别到AT24C0X卡,则发送AT24C0X的读写指令来进行操作,参考文献 [1] 和文献 [2];当识别到SLE4442卡,则发送SLE4442的读、写、密码校验、密码修改等指令来进行操作,参考文献 [3]、文献 [4] 和文献 [5];当识别到CPU卡,则发送CPU的读、写、圈存、消费等指令来进行操作;当识别到的卡片不是这几种卡片,则返回非法卡,至此,兼容模组设计完成,参考文献 [6] 和文献 [7]。
兼容模组设计如图1所示。此架构通过对不同种类卡片的判断,能够有效的解决卡片兼容性的问题。
2.2. 存储卡在本系统中的应用
AT24C01卡是一种1K bit (128字节)的非逻辑加密卡,也就是行业内俗称的存储卡,片内无分区,无需任何密码认证操作即可以明文的方式对数据进行读写操作。AT24C02卡和AT24C01卡对比区别AT24C02卡的卡容量是AT24C01卡的一倍,为2K bit (256字节)。
该卡片使用的是I2C总线规范,I2C (Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。也可以简单地理解为I2C是微控制器与外围芯片的一种通讯协议。在不同的书籍中,可能会称为I2C,IIC,或者I方C,但是概念也是一样的,只是叫法不同。如图2所示I2C总线的总线控制逻辑。
此类卡片属于第一代卡片,单纯的存储卡,用户不需要做任何安全认证即可以任意的读写卡内数据,对于想要破解卡片的人员来说,没有任何技术难度,现在除了存量用户以外,新安装的表具不会再使用此种卡片,而存量用户也会逐渐的淘汰掉,但是现在还有不少的存量用户,所以在短时间内还是在系统中处于并行的状态。系统在设计的时候就得考虑此种卡片的兼容性问题。
2.3. 逻辑加密卡在本系统中的应用
SLE4442卡是一种2K bit (256字节)的逻辑加密卡,片内无分区,读操作无需密码认证即可读出明文,写操作需要进行3字节的密码认证操作才可以往存储区中写入数据。256字节用户不能全部使用,前8字节的数据为制造商固化区,出厂时就已经写入了数据,用户没办法修改,只能读取,后448字节为用户操作区,经过密码认证后可以写入数据。
此类卡片属于第二代卡片,属于逻辑加密卡,用户不需要做任何安全认证即可以任意的读取卡内数据,但是写入卡片需要进行密码校验,相对于AT24C0X来说安全性要高一点,对于想要破解卡片的人员来说,技术难度有所提高,现在除了存量用户以外,新安装的表具也不会再使用此种卡片,而存量用户也会逐渐的淘汰掉,但是现在也是还有不少的存量用户,所以在短时间内还是在系统中处于并行的状态。系统在设计的时候也得考虑此种卡片的兼容性问题。
2.4. 智能卡在本系统中的应用
CPU卡也叫智能卡,卡内的集成电路中带有微处理器CPU、存储单元(包括随机存储器RAM、程序存储器ROM (FLASH)、用户数据存储器EEPROM以及芯片操作系统COS。装有COS的CPU卡相当于一台微型计算机,不仅具有数据存储功能,同时具有命令处理和数据安全保护等功能,所以业内约定俗成的把智能卡叫做CPU卡。
此类卡片属于第三代卡片,它的安全性是最高的,每一个文件目录都是可以设置对应的读写权限,如果需要安全认证的读写权限,就得去加密机计算外部认证报文,经过外部认证来进行读操作,去加密机进行安全认证,计算安全报文,来对数据进行写操作,因为每次操作前都会从卡片中获取一个随机数,而参与运算的时候也是需要随机数参与的,故而报文不会被重放写入,安全性大大的提高了,因为其安全性最高,银行、社保、公共服务等各种行业都广泛使用此类卡片,很多燃气公司也都选择具有此类卡片的表具,故而现在新安装的表具基本都是应用此种卡片的表具。CPU卡表系统在燃气公司是有一个完整的系统的,故而在系统设计之初就得考虑把旧有系统集成进去的问题。
2.5. 从技术层面对多卡种兼容模组的设计
当前系统中所用到的几种卡片,都是基于同样标准定义的卡片,虽然通讯协议不一样,但是外观都是符合ISO 7816-2的标准,这个标准规定了相应的卡片大小,芯片触点的位置,VCC、GND、CLK、I/O等主要管脚的定义都是一样的,这样读卡器才能在物理上识别多种卡片,如图3和表2所示即是相关触点的定义。
![](//html.hanspub.org/file/17-1542264x12_hanspub.png?20210918165837828)
Figure 3. Card ISO7816-2 standard
图3. 卡片ISO7816-2标准
系统想要实现对多种卡片进行兼容,首先要解决的问题是对插入读卡器的卡片进行判断,当前插入的卡片是哪一种卡。卡片插入时,系统自动上电,进行一系列自检后,即进入卡片判断程序,卡片插入时,卡片不会主动的告诉你,当前插入的是什么类型的卡片,只能通过读卡器自己去判断。
读卡器系统在判断卡片的时候使用的是试错法,先假设插入的卡片为某一种卡片,根据这种卡片的特性对这种卡片进行检测,系统先对底层波特率进行分析,当读卡器开始上电工作的时候,会同步在CLK和IO上发送数据,当IO从上升沿跳变到了下降沿,为触发开始,每一个clock的高电平捕获一个数据,根据捕获到的数据,是否满足于A卡种的条件,如果不满足,尝试3次后切换到下一卡种的判断。同第一种卡的判断逻辑,是否满足B卡种的条件,如果不满足,尝试3次后切换到下一卡卡种的判断。同第二种卡的判断逻辑,是否满足C卡种的条件,如果不满足,尝试3次后则判断插入的卡片为无法识别的卡种,把对应的卡类型缓存到相应的变量中。因为插入的卡片,不单单会插入正常的卡片,也有可能是坏卡,或者单纯的插入的是异物。
在应用端对读卡器端进行调用的时候,会发送卡片复位指令,如果插入的是非法卡,则会在返回数据的时候返回对应的错误代码,应用端解析为非法卡。如果插入的是正常的卡片,则会返回对应卡片的复位信息,而应用端根据返回的卡片类型,发送对应类型的操作指令。
如果判断出来是某SLE4442卡,则发送SLE4442卡的读写卡校验密钥修改密钥指令,读卡器端接收到指令后会进入到SLE4442卡的处理流程;
如果判断出来是某ATMEL24C0X卡,则发送ATMEL24C0X卡的读写卡指令,读卡器端接收到指令后会进入到ATMEL24C0X卡的处理流程;
如果判断出来是某CPU卡,则发送CPU卡的指令,读卡器端接收到指令后会转发给CPU卡,由CPU卡自行处理,因为CPU卡有自己的规范和自己的处理机制,读卡器只需要把指令转发即可。
基于以上分析,读卡器对3种卡片在技术层面的识别理论上完全可行。
3. 兼容模组的实现
兼容模组的实现是根据IO和CLK上对应波特率的解析来实现对应的判断,在二进制数据的传输的方向中,一共有两种传输方向,一种是数据从低位开始传输,最后再传输高位,全称为Least Significant Bit,在二进制数中意思是最低有效位,简称LSB,一种是数据从高位开始传输,最后再传输低位,全称为Most Significant Bit,在二进制数中意思是最高有效位,简称MSB,以下涉及到传输方向的描述都以LSB和MSB进行描述。读卡器系统平时是处于断电状态,当插入卡片后,系统进行自检,自检通过后基于3.2.5章节的分析,判断插入的什么类型卡片,并把对应的卡片类型缓存到对应的内存中。
3.1. 存储卡识别功能的实现
首先假如插入的卡片是AT24C0X卡,系统上电成功后发起对AT24C0X的判断逻辑,卡片上电后,VCC端拉高为高电平,CLK端拉高为高电平,IIO端拉高为高电平,开始准备发起开始信号,在CLK端持续为高电平的状态下,IIO拉低成低电平,即为开始信号,此时对IIO发起数据,后续CLK连续发起波形,每一个CLK的高电平时发送1bit的数据,8bit为1字节,发送完8字节后,设备把IIO置为高电平,卡片则会发起一个应答信号(ACK),把当前的电平拉低,也就是每个字节有9bit的数据传输,此时判断ACK的电平值,如果为高电平,则表示当前卡片没有响应,则会停止当前传输,如果为低电平,则会继续发送下一字节,读卡器发送的第一字节用来选相应的器件,此处即为当前卡片,其中前7bit为地址码,最后1bit为方向位,方向位的0表示发送,1表示接收。此处因为是需要发送,方向位为0。
接着发起第二个字节为读取卡片数据的偏移地址,因为此处为复位信息,默认读取是前4字节,故而偏移地址为0x00,在后续8个CLK高电平处拉低IIO即可,接着拉高IIO,等待第9个应答信号拉低IIO,拉低后进行下一步操作。读卡器会再一次发起开始信号,发送8bit数据,因为此处为需要接收数据,所以方向位为1,等着应答信号后,开始接收数据,每接收8bit,读卡器需要向卡片发送一个应答信号,当需要读取的数据读卡完毕后,则不需要再向卡片发送应答信号,则卡片会停止发送数据。如图4所示,即为兼容模组对AT24C0X的自动识别。
![](//html.hanspub.org/file/17-1542264x13_hanspub.png?20210918165837828)
Figure 4. Compatible module identification AT24C0X card
图4. 兼容模组识别AT24C0X卡
3.2. 逻辑加密卡识别功能的实现
如果插入的卡片不是AT24C0X卡,则假设插入的卡片为SLE4442,系统上电成功后发起对SLE4442的判断逻辑,卡片上电后,VCC端拉高为高电平,CLK端拉低为低电平,IIO端上电为高电平,开始发起判断,拉高CLK端一个时序,并且在波形的低电平的时候对IIO发起监控,后续连续发起32个时序的波形,如果在前面第一个时序的低电平时IIO由高电平转向了低电平,则表示卡片有了响应,会往外进行数据交互,则后面32个时序分别获取对应IIO上的值,由LSB进行解析,即完成了SLE4442卡的判断,此卡片即为SLE4442卡;如果监控到的IIO电平一直为高电平,则第一次判断的卡片未识别为SLE4442卡,为防止卡片自身体质问题上电速度较慢等造成的判断失误,系统预留了足够的卡片启动时间,因为卡片的上电时间是在微秒级,而系统预留3毫秒作为卡片上电时间,为防止因为干扰而造成IIO电平波动的问题,系统提供了3次复位判断操作,如果3次判断一致,则正式判断当前卡片为SLE4442卡,如果3次判断都不是SLE4442卡,则进入下一个判断流程。
SLE4442使用的是类I²C的通讯方式,和I²C一样是2线制通讯,一根线是时序线,一根线是数据通讯线,数据的收和发都是通过一根线实现,属于半双工模式。此处的判断用到的是卡片的上电复位返回来判断卡片是否是SLE4442卡,数据的解析方式是根据时序线上每一个Clock的上升沿时,获取同时间数据线上的电平来识别当前值为1或者0,这里高电平为1,低电平为0。8个bit为1个字节。如图5所示,即为兼容模组对SLE4442的自动识别。
![](//html.hanspub.org/file/17-1542264x14_hanspub.png?20210918165837828)
Figure 5. Compatible module identification SLE4442 card
图5. 兼容模组识别SLE4442卡
3.3. 智能卡识别功能的实现
如果插入的卡片不是上述两种卡,则假设插入的卡片为CPU卡,系统上电成功后发起对CPU卡的判断逻辑,卡片上电后,VCC端拉高为高电平,CLK端拉高为高电平,IIO端拉高为高电平,开始准备发起复位信号,把RST和CLK由高电平拉低为低电平一段时间后,拉高VCC和IIO,等待一段时间后再拉高RST一段时间,再拉低RST,即完成一次卡片复位,接着CLK会发起一定波特率的波形,CPU卡会针对根据发起的频率来决定返回的波特率,读卡器等待对卡片复位后的数据进行接收,卡片完成复位后会返回卡片的遵循ISO 7816-3规范的ATR信息。
CPU卡的通讯协议是用的半双工模式的UART串口协议,复位完成后把IIO置为接收模式,等待卡片的数据返回,卡片的一个字节的传输包括1bit的起始位,IIO置为低电平,表示数据正式开始传输,后续8bit的数据位,根据对应的值置为高低电平,数据位后是1bit的偶校验位,数据位加上这一位后,使得1的位数应为偶数个,比如前8bit有5个1,则校验位应该置为1,让1的个数达到6个,校验位后是1bit的停止位,是把IIO置为高电平,接着就是空闲位,当IIO上没有数据传输的时候,电平置为1,等待着下一个起始位的判断,等着下一个字节的返回,读卡器接收到所有的复位信息后即完成了对卡片的判断。如图6所示,即为兼容模组对CPU卡的自动识别。
![](//html.hanspub.org/file/17-1542264x15_hanspub.png?20210918165837828)
Figure 6. Compatible module identification CPU card
图6. 兼模组识别CPU卡
3.4. 非法卡识别功能的实现
如果上述3种判断流程都不能判断出插入的卡片类型,则该卡片不是系统允许的卡片,判断为该卡片是非法卡,置对应标志位。如图7所示,即为兼容模组对非法卡的自动识别。
![](//html.hanspub.org/file/17-1542264x16_hanspub.png?20210918165837828)
Figure 7. Compatible module identification of illegal card
图7. 兼模组识别非法卡
4. 兼容模组实验分析
本章实现了读卡器端兼容模组的程序设计以及程序开发。读卡器端兼容模组以C语言为开发语言,Keil uVision为开发平台实现对应功能开发,PulseView为逻辑分析仪软件实现抓取对应波形数据。
4.1. 存储卡识别功能的测试
当读卡器中插入AT24C0X卡时,读卡器系统自动上电,经过一系列自检后,进入兼容模组判断流程,系统在CLK和IO上的波特率如图8和图9所示,根据复位波特率能解析出对应的数据,进而能够判断出当前插入的卡片为AT24C0X卡。
![](//html.hanspub.org/file/17-1542264x17_hanspub.png?20210918165837828)
Figure 8. The first, second and third bytes of reset baud rate of AT24C0X card
图8. AT24C0X卡片复位波特率第一、二、三字节
如图8所示:
第一字节8bit解析出来的二进制值为:1010 0000,根据MSB进行识别,高低位不变,转换为十六进制为:0xA0,等待1bit的应答信号。
第二字节8bit解析出来的二进制值为:0000 0000,根据MSB进行识别,高低位不变,转换为十六进制为:0x00,等待1bit的应答信号,接着重新发起开始信号。
第三字节8bit解析出来的二进制值为:1010 0001,根据MSB进行识别,高低位不变,转换为十六进制为:0xA1,等待1bit的应答信号,再等待接收卡片发送到读卡器的数据。
![](//html.hanspub.org/file/17-1542264x18_hanspub.png?20210918165837828)
Figure 9. The fourth, fifth, sixth and seventh bytes of reset baud rate of AT24C0X card
图9. AT24C0X卡片复位波特率第四、五、六、七字节
如图9所示:
第四字节8bit解析出来的二进制值为:0010 0000,根据MSB进行识别,高低位不变,转换为十六进制为:0x20,发送1bit的应答信号。
第五字节8bit解析出来的二进制值为:0001 1001,根据MSB进行识别,高低位不变,转换为十六进制为:0x19,发送1bit的应答信号。
第六字节8bit解析出来的二进制值为:0001 0000,根据MSB进行识别,高低位不变,转换为十六进制为:0x10,发送1bit的应答信号。
第七字节8bit解析出来的二进制值为:0010 1000,根据MSB进行识别,高低位不变,转换为十六进制为:0x28,发送1bit的应答信号。
最终返回的四字节复位信息为20191028,和卡片内的存储信息的前4字节一致,判断出插入的卡片为AT24C0X卡后,置对应标志位。
4.2. 逻辑加密卡识别功能的测试
当读卡器中插入SLE4442卡时,读卡器系统自动上电,经过一系列自检后,进入兼容模组判断流程,系统在CLK和IO上的波特率如图10所示,根据复位波特率能解析出对应的数据,进而能够判断出当前插入的卡片为SLE4442卡。
如图10所示:
第一字节8bit解析出来的二进制值为:0100 0101,根据LSB进行识别,高低位对调,即为1010 0010,转换为十六进制为:0xA2。
第二字节8bit解析出来的二进制值为:1100 1000,根据LSB进行识别,高低位对调,即为1100 1000,转换为十六进制为:0x13。
第三字节8bit解析出来的二进制值为:0000 1000,根据LSB进行识别,高低位对调,即为0001 0000,转换为十六进制为:0x10。
第四字节8bit解析出来的二进制值为:1000 1001,根据LSB进行识别,高低位对调,即为1001 0001,转换为十六进制为:0x91。
最终返回的四字节复位信息为A2131091,和卡片内的存储信息的前4字节一致,判断出插入的卡片为SLE4442卡后,置对应标志位。
4.3. 智能卡识别功能的测试
当读卡器中插入CPU卡时,读卡器系统自动上电,经过一系列自检后,进入兼容模组判断流程,系统在CLK和IO上的波特率如图11所示,第一字节波特率能解析出0x3B,如图12所示,后续波特率能解析出对应的数据,进而能够判断出当前插入的卡片为CPU卡。
如图11所示,第一字节1bit起始位为0,8bit数据位解析出来的二进制值为:1101 1100,根据LSB进行识别,高低位对调,转换为十六进制为:0x3B,1bit偶校验位为1,1bit停止位。
如图12所示:
第二字节1bit起始位为0,8bit数据位解析出来的二进制值为:1001 0110,根据LSB进行识别,高低位对调,转换为十六进制为:0x69,1bit偶校验位为0,1bit停止位。
第三字节1bit起始位为0,8bit数据位解析出来的二进制值为:1001 0110,根据LSB进行识别,高低位对调,转换为十六进制为:0x69,1bit偶校验位为0,1bit停止位。
第四字节1bit起始位为0,8bit数据位解析出来的二进制值为:1001 0110,根据LSB进行识别,高低位对调,转换为十六进制为:0x69,1bit偶校验位为0,1bit停止位。
后面的返回数据以此类推,当读卡器等待一定的时间卡片没有返回任何数据,则认为卡片复位信息数据返回完成,最终返回的四字节复位信息为3B690000……,CPU卡规定ATR复位信息必须以3B开头,后续都是遵循ISO 7816-3标准而定,判断出插入的卡片为CPU卡后,置对应标志位。
![](//html.hanspub.org/file/17-1542264x20_hanspub.png?20210918165837828)
Figure 11. The first bytes of reset baud rate of CPU card
图11. CPU卡片复位波特率第一字节
![](//html.hanspub.org/file/17-1542264x21_hanspub.png?20210918165837828)
Figure 11. The second, third and four bytes of reset baud rate of CPU card
图11. CPU卡片复位波特率第二、三、四字节
4.4. 实验小结
本节针对多种卡片在读卡器上的自动识别进行了兼容性验证,通过对AT24C0X卡的识别,结果和预期相符;通过对SLE4442卡的识别,结果和预期相符;通过对CPU卡的识别,结果和预期相符;通过对非法卡的识别,结果和预期相符。实验表明,兼容模组能很好的对多种卡片进行识别,并且甄别当前插入的卡片是否是非法卡,实验达到了设计要求。
5. 结束语
本文针对多卡种的识别,设计了一种兼容模组。该模组针对不同的卡种设计多种识别方法。本文主要讨论了对AT24C0X卡、SLE4442卡、CPU卡这三种卡片的兼容性测试。从当前系统卡片的兼容性进行分析,引出当前系统存在的兼容性问题,解决兼容性问题的必要性,最后完成兼容模组的设计与实现的这几点进行了阐述。整体看来,兼容模组可以有效地识别当前系统中的卡片,能够大幅度提升系统对卡片的兼容性,为下一步建立整套系统提供有力的支持。
NOTES
*通讯作者。