公交行业CPU卡总结(发卡,消费,充值)

公交行业CPU卡总结(发卡,消费,充值)

  • 前言
  • CPU卡到底是个什么东西
    • CPU卡的一些基本知识
      • APDU命令
      • CPU卡的文件结构
  • CPU卡中的钱包类型及如何消费
    • 电子钱包
    • 电子现金
  • 如何发卡(针对互联互通卡)
  • 发完卡了如何给卡充值(圈存)

前言

进入智能卡行业也有大半年了,写点东西总结一下大半年来学到的东西。方便自己观看吧。本文不涉及任何指令或者代码,详细内容后续再总结。

网上的文章终究只是个参考,最靠谱的还是看技术文档

CPU卡到底是个什么东西

“CPU卡芯片通俗地讲就是指芯片内含有一个微处理器,它的功能相当于一台微型计算机。人们经常使用的集成电路卡(IC卡)上的金属片就是CPU卡芯片。CPU卡可适用于金融、保险、交警、政府行业等多个领域,具有用户空间大、读取速度快、支持一卡多用等特点,并已经通过中国人民银行和国家商秘委的认证。CPU卡从外型上来说和普通IC卡,射频卡并无差异,但是性能上有巨大提升,安全性和普通IC卡比,提高很多,通常CPU卡内含有随机数发生器,硬件DES,3DES加密算法等,配合操作系统即片上OS,也称SoC,可以达到金融级别的安全等级。”

上面这段话是度娘给出的定义,其实说白了,你可以把CPU卡当成一台非常原始的电脑或者说当成一个单片机。他具有最基本的中央处理芯片CPU(这就是他之所以叫CPU卡的原因),内部也有存储器,存储器中也会有可操作的区域与不可操作的区域。我们对CPU卡的操作,其实就是通过读卡设备发送与接收一串串CPU卡可以识别的指令,从而对CPU卡的存储器进行操作。操作有建立/删除文件,查询文件记录,修改文件记录等(可以想成数据库的增删改查)。

CPU卡的一些基本知识

APDU命令

APDU全称Application Protocol Data Unit(应用协议数据单元)。协议数据单元PDU(Protocol Data Unit)是指对等层次之间传递的数据单位,在CPU卡的应用中,PDU通常以数据块的形式传输。APDU构建了读卡器和CPU卡之间的通信规范,使得上位机和卡之间的数据通信变得可能。

读卡器和CPU卡通信所使用的APDU命令分为两种:读卡器发送的C-APDU和接受的R-APDU。
C-APDU的命令格式大致为CLAINSP1P2LcDATALe

其中前面的4位为必备头,在任何C-APDU命令中此部分一定存在。CLA和INS规定了此条APDU所执行的功能;P1和P2一般规定了该功能如何执行(例如读取文件,P1和P2就规定了读取文件的文件号之类的信息)。

后面的Lc,DATA和Le为条件体,视APDU的功能不同和用户需求不同,这三者都可以不存在。Lc表明了DATA域的长度(单位为字节,下同);DATA是想要传递的具体信息,可以是数据,也可以不存在;Le则是规定了返回数据的长度。

C-APDU的命令格式大致为DATASW1SW2

其中DATA为条件体,视C-APDU的不同可以不存在。DATA中存放的是卡片处理完C-APDU后返回的数据长度收到C-APDU中最后一位Le的限制(若Le存在)。

SW1和SW2为必备尾,在任何R-APDU中他一定存在。SW1和2为错误码,当指令正确执行时返回的是90 00,若执行遇到问题,则会返回对应的错误码,通过查询错误码可以大致定位错误。

此外,DATA域的一种特殊数据格式也需要介绍。这种数据格式一般称作TLV格式。T(Tag),L(Lengh),V(Value)分别代表了这段数据段的标签,数据长度和实际数据。例如“9F1A020156”这段数据,其中“9F1A”为tag国家代码,长度为“02”两字节,数据“0156”则代表中国的国家代码。尽管不是所有的DATA域都使用TLV格式,但是TLV格式确实广泛的存在于所有APDU的DATA域中。

另外,由于CPU卡有非接触式(电磁感应供电)和接触式(金属触点直接供电)两种上电方式,其APDU指令集也有些许不同,使用时需要注意。

CPU卡的文件结构

CPU卡内部存储器需要一定的文件结构才可以正常运行。CPU卡的文件结构类似于DOS系统或者可以说是Windows系统,有主目录文件MF(类似于磁盘),有应用目录文件DF(类似于磁盘下的一个个文件夹),也有基本文件EF(类似于磁盘下或者文件夹下的一个个文件)。我们对于CPU卡的操作,实际上就是对寄存器中的文件结构和文件进行操作,包括增加删除或者修改目录/文件。而有些CPU卡的MF和DF下有着密钥文件,能阻止恶意修改或者删除其中的内容,是CPU卡的一种安全保护机制。
MF,DF和EF三者的关系如下:

名称 是否唯一 其下可否有EF
MF 唯一 可以有EF
DF 不唯一 可以有EF
EF 不唯一 不可再有EF

CPU卡中的钱包类型及如何消费

介绍完CPU卡的基础知识,接下来就到了如何消费CPU卡中的金额。我们给CPU卡中充值一般会分为两种形式:电子钱包(EP)和电子现金(EC)。二者在不同的规范中给出,消费和充值方式的差别也非常大,接下来我们分别介绍二者消费方式有何不同。

电子钱包

电子钱包的消费相对于电子现金来说步骤比较少,也相对容易一些,其重点在于MAC的验证,两次MAC验证通过后消费即宣告成功。

首先,我们需要进入我们想要消费的电子钱包应用目录文件中。在读取余额确定剩下的钱足够支撑本次消费后,我们向卡片发送消费初始化命令,该命令中包含了我们本次想要消费的金额。卡片处理该命令后,会返回一段数据,这段数据中包含有随机数和脱机交易序号。

接下来我们给PSAM卡(消费机安全模块)发送交易初始化命令,其中包含了上一步返回的随机数和脱机交易序号。PSAM卡会根据这些数据计算出MAC1,MAC1我们保存备下一步使用。

第三步,向CPU卡发送消费指令,其中需要使用上一步产生的MAC1。该步骤执行成功后,会产生一个MAC2。我们向PSAM卡再次发送MAC2校验指令,校验成功后电子钱包的消费即宣告完成。

不难看出,电子钱包EP的消费,重点在于两次MAC的计算,在有PSAM卡的情况下,这两次MAC的计算均由PSAM自动完成,并不需要手工计算,我们只需要保证数据获取与发送的正确性完整性即可,所以相对来说比较简单。

电子钱包消费可以参考这篇文章

电子现金

电子现金EC的消费相比于电子钱包EP要繁琐和复杂许多,也有许多需要我们自己手工计算与填写的部分,代码量也相对较大。

以qPBOC快速交易为例,在进入电子现金相关的非接触式支付应用目录后,卡片会返回下一步我们可以选择的应用目录。根据优先级选择最高优先级的应用目录后,卡片会返回一串较长的TLV格式数据。其中,有一串以“9F38”开头的“PDOL:处理选项数据对象列表”,该列表表明了为了电子现金消费,接下来卡片需要什么数据,该数据多长。例如“9F66049F0206”,即表明卡片需要4字节长度的终端交易属性和6字节长度的授权交易金额数据。我们需要判别卡片需要的每一种数据,并记住长度,供接下来一步使用。

接下来的步骤叫应用初始化,也叫GPO(Get Processing Options获取处理选项),该步骤主要的功能就是给卡片发送上一步卡片返回的,需要的数据。卡片在收到这些数据后,内部便会进行交易的初始化,完成预扣款,所以这一步也被叫做交易应用初始化。

GPO执行完毕后,卡片就会在内部完成预扣款,即交易金额这部分数值的电子现金会被冻结,暂时无法操作。当下面的步骤全部完成后,该部分金额会被正式扣除,若未完成全部指定步骤,该部分预扣款金额会被解冻,该次电子现金交易宣告失败。GPO步骤成功结束后卡片会返回数据,其中“94”tag开头的“AFL:应用文件定位器”是我们值得关注的。返回的AFL长度一定是4的倍数,返回数据4字节一组,4个字节分别表明了“要读文件的偏移量”,“文件的首位序号”,“文件的末尾序号”,“文件记录是否储存”。例如“10050801”,即表明我们需要读取偏移量为10文件中标号为05,06,07,08的四个文件,其中有需要储存记录备用的文件。

在判定完成需要读取文件的偏移量,序号以及数量后,我们接下来就需要一条一条的读取文件记录。在测试环境中,我们只需要按照流程读取指定的每一条文件记录即可完成实际扣款。在实际生产环境中,读取的文件记录有很多需要我们保存的数据,目的是为了接下来的数据验证(SDA,DDA或CDA)所服务,这些数据认证若不通过,扣掉的金额会被冲正回来,可有效防止复制卡或破解卡等违规卡片盗刷现象。

qPBOC电子现金消费总结

如何发卡(针对互联互通卡)

针对最近在做的互联互通业务,总结一下发卡的流程。

发卡其实就是完整建立卡片的文件目录并填充初始数据进入记录文件。那么最重要的问题就是,在着手建立卡片目录之前,我们首先需要规划好卡片的文件结构及哪些文件需要填充数据。

以互联互通卡为例,首先需要有所有CPU卡共有的主目录MF,这在所有的CPU卡中都是必备的,相当于电脑的C盘, 必不可少。

在MF下首先必备的是密钥文件,主控密钥和维护密钥分别负责卡目录修改权限和目录下文件修改权限的管理。其次应该有应用文件目录DF,如互联互通卡中就有互通电子钱包应用和互通电子现金应用。在每个DF文件下也有相应的密钥文件。最后是EF,EF是储存记录和数据的文件,分为二进制文件、循环记录文件、变长记录文件等多种。我们要写的数据就是写到EF文件中的。

具体的CPU卡文件结构设计需要自己设计,以复旦微电子的CPU卡为例,发卡可以参考复旦CPU卡发卡

发完卡了如何给卡充值(圈存)

以电子钱包的圈存为例(因为电子现金需要联机,电子钱包知道密钥就行了),流程和电子钱包的消费类似,大致为反过程。

首先我们向CPU卡发送电子钱包圈存初始化命令,该命令包含了用户想要圈存的金额信息。类似的,在成功执行圈存初始化命令后,会返回联机交易序号和随机数。

我们使用圈存密钥加密需要的数据,使用3DES算法,计算出过程密钥。过程密钥的作用是接下来计算MAC2的过程中充当加密密钥。

接下来使用PBOC_MAC算法计算需要的数据,密钥为过程密钥,初始化向量为全0,计算出来的4字节数据即为MAC2。接下来发送圈存命令·,最后4字节为上一步所得的MAC2。命令成功后,实际圈存已经成功了,并且会返回4字节的TAC。在实际生产环境中,我们需要使用过程密钥再计算消费验证码TAC,若二者则说明圈存命令成功。

具体密钥的计算参见电子钱包圈存

施工中,后续再添加内容。

你可能感兴趣的:(公交行业CPU卡总结(发卡,消费,充值))