因为毕业设计的机缘巧合,接触了智能卡的开发。看了近一个月的PBOC 3.0金融规范,决定从实践中快速了解各种命令的发送以及响应。网上前辈的的各种博客文章,对于我这个智能卡开发几乎为零的小白来说无疑是最好的福音,所以也开始尝试着写写文章,记录一下学习的点滴,欢迎指错,与大家共勉~
幸运的是不用费心找读卡器和测试代码,因为这些都是现成的。
首先第一步,选择MF(也就是选择文件名为“1PAY.SYS.DDF01”的PSE,如果是选择PPSE的话,把文件名修改成“2PAY.SYS.DDF01”即可)。
C_APDU:00A404000E325041592E5359532E4444463031
R_APDU:6F31840E325041592E5359532E4444463031A51FBF0C1C611A4F08
A000000333010102500B50424F4320435245444954870101
SW1SW2:9000
其中C_APDU中的00A40400是select对应的CLA,INS,P1和P2, 0E是发送的文件名的长度,后面就是“2PAY.SYS.DDF01”所对应的ASCII,LE可加可不加。R_APDU中AID由A000000333(RID)010102(PIX)组成,后PIX为010102标明了是贷记应用。
C_APDU:00A4040008A000000333010102
R_APDU:6F568408A000000333010102A54A500B50424F4320435245444954
8701019F38189F66049F02069F03069F1A0295055F2A029A039C01
9F37045F2D027A689F1101019F120B50424F4320435245444954BF
0C059F4D020B0A
SW1SW2:9000
其中从响应数据中可以看到应用名(标签是9F12)是50424F4320435245444954,对应的应用ASCII是“PBOC CREDIT”,对应上述的PIX为贷记应用。
C_APDU:80A8000023832160000000000000000000000000000000015600000000
000156130925000000000000
R_APDU:800E7C00080102001001040118010100
SW1SW2:9000
其中GPO指令的数据域应该是83+Len+Data,所以Lc就应该2+Len,上面的请求应该有0x21字节数据,Lc应该是0x23。返回数据第一个字节0x80是标准的借记/贷记应用GPO响应报文模板格式,7C00是AFL标签(之后以每4个字节为一个AFL,每一个AFL的第一个字节的高5位是SFI,第二个字节是第一条要读的记录号,第三个字节是最后一条要读的记录号,第四个字节为静态数据签名的记录数)。GPO响应是80开头的,标准的借记/贷记应用GPO响应。
C_APDU:00B2010C00
00B2020C00
R_APDU:706857136227607391856271D19082010000063100000F9F1F502020
20202020202020202020202020202020202020202020202020202020
20202020202020202020202020202020202020202020202020202020
20202020202020202020202020202020202020202020
70289F6118************************************9F6201005F2006************
SW1SW2:9000 根据上一步中读出来的第一个AFL的第一个字节为0x08,即SFI是0x01,要读的记录号从0x01到0x02,然后按照Read Record的命令发送。Read Record命令的CLA是00,INS是B2,P1是记录号,P2的高5位是刚刚FCI中读出的SFI,这里是00001(2),然后剩下的低3位是100(2),组合起来如下图所示。没有LC和Data,LE可有可无,这里填00。换回16进制就是如上的APDU:00B2010C00和00B2020C00。
得到第一条记录号的结果是:磁条2等效数据和磁条1自定义数据。
得到第二题记录号的结果是:持卡人证件号,证件类型,持卡人姓名。(这里隐藏了个人信息)
C_APDU:80CA9F7900
R_APDU:9F7906000000000000
读出来的电子现金余额为0。
C_APDU:80CA9F1300
R_APDU:9F13020000
C_APDU:80CA9F4F00
R_APDU:9F4F199A039F21039F02069F03069F1A025F2A029F4E149C019F3602
C_APDU:00B2011400
R_APDU:70425F24031908315A08****************9F0702FF008E0E0000000000
00000002031E031F009F0D05D8609CA8009F0E0500100000009F0F0
5D8689CF8005F28020156
根据上面读出来的第二个AFL的第一个字节为0x10,即SFI是0x10,要读的记录号从0x01到0x04,然后按照Read Record的命令发送。Read Record命令的CLA是00,INS是B2,P1是记录号,P2的高5位是刚刚FCI中读出的SFI,这里是00010(2),然后剩下的低3位是100(2),组合起来如下图所示。没有LC和Data,LE可有可无,这里填00。换回16进制就是如上的APDU:00B2011400。
读出来的就是我的日期,卡号(PAN)等信息。(隐藏个人信息)
接下来的日志记录大同小异,不再一一列出。
刚刚接触智能卡的开发,参考了博客:PBOC卡片应用分析(四),学习到了很多,在实践过程中记下自己的学习笔记,一些思考和分析,有不对的地方,敬请指出~