测试使用的卡是招商银行的IC卡:
(一)应用选择
一张银联IC卡里面可能有多个应用,所谓应用就是卡片和终端之间的应用协议和相关的数据集,读卡器和卡的交互其实就是和应用的交互,卡的交易其实就是选择某个应用做交易。但目前卡商所生产的卡基本上都是一个应用,即便如此,但根据银联的规范,应用选择这个步骤也是必不可少的。
(1)首先是选择PSE文件1PAY.SYS.DDF01 ,使用的命令是select命令,这个命令的详解在JR/T 0025.5的附录B中有详细的介绍。
此处请求命令报文如下:00A404000E315041592E5359532E4444463031
卡片会返回:6F1E840E315041592E5359532E4444463031A50C5F2D027A689F1101018801019000
此处返回的结果是严格按照TLV格式来的,解析TLV格式的源程序我会在后续的文章中给出。此处解析出来的数据如下:
6F:FCI模板
84:DF名称
A5:FCI专用模板
88:目录基本文件的SFI (高三位为0,后面补100,进行读取文件数据)
5F2D:首选语言
9F11:发卡行代码表索引
BF0C:发卡行自定义数据--(该卡没有带此数据)
FCI(文件控制信息)包含FCI(短文件标识符),目录中的每个应用列出一个应用。
(2)会根据SFI 进行读记录,此处SFI为01,根据read record的规范,p2的高5位为SFI,低三位为100,故p2的值为0x0C。
此处请求命令报文为:00B2010C00
卡片返回:702861264F08A000000333010101500A50424F432044454249549F120A50424F432044454249548701019000
此处的返回结果也是按照TLV格式来编码的,解析后为:
4F : A000000333010101 应用标识符(AID)
50:50424F43204445424954 应用标签
9F12 : 50424F43204445424954 应用首选名称
87 : 01 应用优先指示器
(3)根据读取的记录的应用标识符加入AID列表,然后根据用户按键进行选择应用或者根据优先级选择应用。
此处请求命令的报文为:00A4040007A0000003330101
卡片返回:6F458408A000000333010101A539500A50424F432044454249548701019F38099F7A019F02065F2A025F2D027A689F1101019F120A50424F43204445424954BF0C059F4D020B0A9000
6F: FCI模板
84: DF名称
9F38: PDOL的数据(9F1A:终端国家代码;9F7A: 电子现金指示器,9F02:授权金额,5F2A:交易货币代码)
5F2D:首选语言
9F11: 发卡行代码表索引
(二)应用初始化,该命令报文的组合需要第三步返回的PDOL数据(9F38),根据GPO的规则生成的报文如下
请求命令报文:80A800000B83099F02065F2A02
卡片返回:80167C0008010100100101011003060018010100200101009000
此处返回的报文不是TLV格式,7C00为应用交互特征,解析:
bit8:保留;
bit7:1=支持SDA; 静态数据认证
bit6:1=支持DDA; 动态数据认证
bit5:1=支持持卡人认证
bit4:执行终端风险管理
bit3:支持发卡行认证
bit2:保留
bit1:1=支持CDA
字节2:保留
0801010010010101100306001801010020010100为AFL,AFL(应用文件定位器),每个AFL包括4个字节
字节1:bit8-bit4:SFI(短文件标识符)
bit3-bit1:000
字节2:文件中要读的第1个记录的记录号(不能为0)
字节3:文件中要读的最后一个记录的记录号(大于或等于字节2)
字节4:从字节2的记录好开始,用于静态数据记录的个数(从0开始,不大于(字节3)-(字节2)+1)
根据GPO返回的AFL,读文件。读文件号格式为:SFI左移3位,右边补100。
比如上面的08 十六进制就是 0000 1000 bit8-bit4才是SFI,所以真实的是:0000 0001 ,读取文件的时候,右补0100(表明读取指定记录) ,得到0000 1100,就是0x0c。同理,02文件就是:0x14
(三)读应用数据,根据第四步的AFL解析结果,可以组合出读应用数据的报文。
发送:00B2010C00
接受:707457136214830100237436D22112201464200755165F9F0B2D4C492058494E2020202020202020202020202020202020202020202020202020202020202020202020202020209F6128313432343239313938323035313434343136202020202020202020202020202020202020202020209F6201009000
发送:00B2011400
接受:704A5F24032211305F25031211215A0862148301002374365F3401009F0702FF008E0C000000000000000042031E039F0D05D8609CA8009F0E0500100000009F0F05D8689CF8005F280201569000
发送:00B2031400
接受:7081B39081B0A33373F56850C06B1DE59D93F4F2A362CEA2A57C37D5DC78E3BF84914B608A43ACD22539B6C0491E88652244D2A199E6516D0C6F3C632F65202561106420FA406F530AE8D39CAF6EA5730E4A5AB15763FB42EAFA0AEE69A9E69640642E29CA15D5449B7AB74411A50EF811ACDEF4D8F93004C423E77E55AC263DA89308FCC05E3E0AA599565590C83CCE7FF6B17602F1BD7DB22C48A5A039FB97C48A8FA16083CC56DD6FEC3C6E7E81F37DCA25A949EC9000
90:发卡行公钥证书--用于脱机数据认证
发送:00B2041400
接受:70488F0103920433DFA0159F3201039F4701039F482A737DBBA0A11741BD57FEDF1BE60C551A88A24A82B5EB3182642F217AFA986E04DB7AC2F38057FCE8AC019F49039F37049F4A01829000
发送:00B2051400
接受:70819393819088E48EC5AC68FD509E73786839978F465F4BDB905EF38B9FBD17147FE810EAB68EB5E86C4A23BA2E897A54892D1DAD75EE339C21603CB172C66CE312AA9B585D5F24A3827342D504AF9EC2E95407AA72CE527DC1C0BA4D051B8BA6282AEDEEE1D3725EC8CA91EC515903D7E100576B837F96ABCB789C10434AFEC23E30D33B509FBBFB40ACDB15DF282372B8F3FBC99D9000
93: 签名的静态应用数据-SDA
发送:00B2061400
接受:7081949F468190810A5485E3B940508DDFF1E6AC2BF5B8990742BC1E11146C8BFC46D8C3C425ABA2C264CE2F478C320D198FF03E090EA61ECA3CCCF493AA886EDAC940C2F0CDC248768204DF4DEC26758B18F67E9CC7AB84C7DA55F00BDF0127CAF12B09E93C1830120E5F700BAB5D9124F209037FC3BE5BC44D34153760CB5E79890B C5D00491681ECDD1C9844874D9B0DFFF81236C899000
9F46:IC卡公钥证书
发送:00B2011C00
接受:70488C1B9F02069F03069F1A0295055F2A029A039C019F37049F21039F4E148D1A8A029F02069F03069F1A0295055F2A029A039C019F37049F21035F300202209F420201569F080200209000
发送:00B2012400
接受:70089F1401009F2301009000
解析后的结果如下:
8E : 000000000000000042031E03 持卡人验证方法(CVM)列表
9F07 : FF00 应用用途控制
9F0F : D8689CF800 发卡行行为代码(IAC)-联机
5F24 : 221130 应用失效日期
9F0E : 0010000000 发卡行行为代码(IAC)-拒绝
9F0D : D8609CA800 发卡行行为代码(IAC)-缺省
5A : 6214830100237436 应用主账号
5F28 : 0156 发卡行国家代码
5F34 : 00 应用主账号序列号
5F25 : 121121 应用生效日期
57 : 6214830100237436D22112201464200755165F 磁条2等效数据
9F61 : 31343234323931393832303531343434313620202020202020202020202020202020202020202020 持卡人证件号
9F62 : 00 证件类型:00身份证
9F0B : 4C492058494E202020202020202020202020202020202020202020202020202020202020202020202020202020 持卡人姓名
8F : 03 CA公钥索引 (PKI)
9F32 : 03 发卡行公钥指数
9F4A : 82 静态数据认证标签列表
92 : 33DFA015 发卡行公钥余数
9F47 : 03 IC卡公钥指数
9F48 : 737DBBA0A11741BD57FEDF1BE60C551A88A24A82B5EB3182642F217AFA986E04DB7AC2F38057FCE8AC01 IC卡公钥余数
9F49 : 9F3704 动态数据认证数据对象列表(DDOL)
5F30 : 0220 服务码
8D : 8A029F02069F03069F1A0295055F2A029A039C019F37049F2103 卡片风险管理数据对象列表2 (CDOL2)
8C : 9F02069F03069F1A0295055F2A029A039C019F37049F21039F4E14 卡片风险管理数据对象列表1(CDOL1)
9F08 : 0020 应用版本号
9F42 : 0156 应用货币代码
9F23 : 00 连续脱机交易上限
9F14 : 00 连续脱机交易下限
9F468190810A5485E3B940508DDFF1E6AC2BF5B8990742BC1E11146C8BFC46D8C3C425ABA2C264CE2F478C320D198FF03E090EA61ECA3CCCF493AA886EDAC940C2F0CDC248768204DF4DEC26758B18F67E9CC7AB84C7DA55F00BDF0127CAF12B09E93C1830120E5F700BAB5D9124F209037FC3BE5BC44D34153760CB5E79890B C5D00491681ECDD1C9844874D9B0DFFF81236C899000
9F46:IC卡公钥证书
93819088E48EC5AC68FD509E73786839978F465F4BDB905EF38B9FBD17147FE810EAB68EB5E86C4A23BA2E897A54892D1DAD75EE339C21603CB172C66CE312AA9B585D5F24A3827342D504AF9EC2E95407AA72CE527DC1C0BA4D051B8BA6282AEDEEE1D3725EC8CA91EC515903D7E100576B837F96ABCB789C10434AFEC23E30D33B509FBBFB40ACDB15DF282372B8F3FBC99D9000
93: 签名的静态应用数据-SDA
9081B0A33373F56850C06B1DE59D93F4F2A362CEA2A57C37D5DC78E3BF84914B608A43ACD22539B6C0491E88652244D2A199E6516D0C6F3C632F65202561106420FA406F530AE8D39CAF6EA5730E4A5AB15763FB42EAFA0AEE69A9E69640642E29CA15D5449B7AB74411A50EF811ACDEF4D8F93004C423E77E55AC263DA89308FCC05E3E0AA599565590C83CCE7FF6B17602F1BD7DB22C48A5A039FB97C48A8FA16083CC56DD6FEC3C6E7E81F37DCA25A949EC9000
90:发卡行公钥证书--用于脱机数据认证
(四)生成应用密文,根据上面读取的“卡片风险管理数据对象列表1(CDOL1)”生成该命令。
请求命令报文:80AE40002E00000000000900000000000001560000800000015610041000B84FBA072019024C4E00000000000000000000000000000000000000
卡片返回:801E800012E70CB84C238601F207010103A020000100000000007B168F919000
返回的数据解析:密文信息数据(L:1) + 应用交易计数器(L:2) + 应用密文(L:8) + 发卡行应用数据
至此,读卡的整个过程结束。