银联IC卡读取过程

最近因研究了下银联借记/贷记应用卡片规范,发现网上可参考资源较少,于是萌生了写下这篇文字的想法,希望可以帮助到有需要的兄弟姐妹,有描述不清晰或者有错误的地方欢迎指正。 下面进入正题,测试使用的卡是招商银行的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 接受:7081B39081B0A33373F56850C06B1DE59D93F4F2A362CEA2A57C37D5DC78E3BF84914B608A43ACD22539B6C0491E88652244D2A199E6516D0C6F3C632F65202561106420FA406F530AE8D39CAF6EA5730E4A5AB15763FB42EAFA0AEE69A9E69640642E29CA15D5449B7AB74411A50EF811ACDEF4D8F93004C423E77E55AC263DA89308FCC05E3E0AA599565590C83CCE7FF6B17602F1BD7DB22C48A5A039FB97C48A8FA16083CC56DD6FEC3C6E7E81F37DCA25A949EC900090:发卡行公钥证书--用于脱机数据认证 发送:00B2041400 接受:70488F0103920433DFA0159F3201039F4701039F482A737DBBA0A11741BD57FEDF1BE60C551A88A24A82B5EB3182642F217AFA986E04DB7AC2F38057FCE8AC019F49039F37049F4A01829000 发送:00B2051400 接受:70819393819088E48EC5AC68FD509E73786839978F465F4BDB905EF38B9FBD17147FE810EAB68EB5E86C4A23BA2E897A54892D1DAD75EE339C21603CB172C66CE312AA9B585D5F24A3827342D504AF9EC2E95407AA72CE527DC1C0BA4D051B8BA6282AEDEEE1D3725EC8CA91EC515903D7E100576B837F96ABCB789C10434AFEC23E30D33B509FBBFB40ACDB15DF282372B8F3FBC99D900093: 签名的静态应用数据-SDA 发送:00B2061400 接受:7081949F468190810A5485E3B940508DDFF1E6AC2BF5B8990742BC1E11146C8BFC46D8C3C425ABA2C264CE2F478C320D198FF03E090EA61ECA3CCCF493AA886EDAC940C2F0CDC248768204DF4DEC26758B18F67E9CC7AB84C7DA55F00BDF0127CAF12B09E93C1830120E5F700BAB5D9124F209037FC3BE5BC44D34153760CB5E79890B C5D00491681ECDD1C9844874D9B0DFFF81236C8990009F46: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: 签名的静态应用数据-SDA9081B0A33373F56850C06B1DE59D93F4F2A362CEA2A57C37D5DC78E3BF84914B608A43ACD22539B6C0491E88652244D2A199E6516D0C6F3C632F65202561106420FA406F530AE8D39CAF6EA5730E4A5AB15763FB42EAFA0AEE69A9E69640642E29CA15D5449B7AB74411A50EF811ACDEF4D8F93004C423E77E55AC263DA89308FCC05E3E0AA599565590C83CCE7FF6B17602F1BD7DB22C48A5A039FB97C48A8FA16083CC56DD6FEC3C6E7E81F37DCA25A949EC9000 90:发卡行公钥证书--用于脱机数据认证(四)生成应用密文,根据上面读取的“卡片风险管理数据对象列表1(CDOL1)”生成该命令。 请求命令报文:80AE40002E00000000000900000000000001560000800000015610041000B84FBA072019024C4E00000000000000000000000000000000000000 卡片返回:801E800012E70CB84C238601F207010103A020000100000000007B168F919000 返回的数据解析:密文信息数据(L:1) + 应用交易计数器(L:2) + 应用密文(L:8) + 发卡行应用数据 至此,读卡的整个过程结束。

你可能感兴趣的:(金融读卡)