https://blog.csdn.net/kxd_ysheng/article/details/21178101?_t=t
PBOCIC读芯片卡流程,参考上面的博客,整理了一下PBOCIC卡读流程。
上面博客内容估计也是参考别人的,所以好几处错误跟网上其他的地方一样,我将其中错误改正了一下,同时增加了更加详细的说明
读PBOCIC卡过程开始
(一)应用选择
一张银联IC卡里面可能有多个应用,所谓应用就是卡片和终端(如读卡器)之间的应用协议和相关的数据集,读卡器和卡的交互其实就是和应用的交互,卡的交易其实就是选择某个应用做交易。
目前卡商所生产的卡基本上都是一个应用,即便如此,但根据银联的规范,应用选择这个步骤也是必不可少的。
(1)首先是选择PSE支付环境文件1PAY.SYS.DDF01
使用的命令是select命令,这个命令的详解在《中国金融集成电路(IC)卡借记贷记卡片规范(V0.8-20080325)》的附录B中有详细的介绍。
此处请求命令报文如下:
命令格式:选择(Select)报文 00 A4 XX
命令参数:00 A4 04 00
0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31
00
参数长度:20
卡片返回数据:
长度:40
值:6F 1E
84 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31
A5 0C
5F 2D 02 7A 68
9F 11 01 01
88 01 01
90 00
此处返回的结果是严格按照TLV格式来的,此处解析出来的数据如下:
6F: FCI(File Control Information)模板
84:DF名称
A5:FCI专用模板
88:目录基本文件的SFI (高三位为0,后面补100,进行读取文件数据)
5F2D:首选语言
9F11: 发卡行代码表索引
BF0C:发卡行自定义数据--(该卡没有带此数据)
FCI(文件控制信息)包含SFI(Short File Identification短文件标识符),目录中的每个应用列出一个应用。
至此,PSE选择完成。
如果卡片对选择支付环境的响应不是90 00,则需要尝试逐个选择AID。
(2)根据SFI 进行读记录,选择与PSE关联的应用文件
与PSE关联的基本文件,里面列出支持的支付应用。
此处SFI(对应标签是88)为01,根据read record的规范,p2的高5位为SFI(01==>0000 0001),低三位为100,故p2的值为0x0C(0000 1100)。
表 B.21读记录(READ RECORD)命令引用控制参数(P2)
b8 | B7 | b6 | b5 | b4 | b3 | b2 | b1 | 意义 |
x | x | x | x | x | SFI | |||
1 | 0 | 0 | 读P1指定记录 |
此处请求命令报文为:
命令格式:读记录(Read Record)报文 00 B2 P1 P2 00
命令参数:00 B2 01 0C 00
参数长度:5
卡片返回数据:
长度:49
值:
70 28
61 26
4F 08 A0 00 00 03 33 01 01 01
50 0A 50 42 4F 43 20 44 45 42 49 54
9F 12 0A 50 42 4F 43 20 44 45 42 49 54
87 01 01
90 00
此处的返回结果也是按照TLV格式来编码的,解析后为:
70:基本数据模板
61:应用模板。有PSE才存在,含应用目录入口相关参数
4F:应用标识符(AID)=RID+PID(应用提供商和专用应用标识符),Len=08,Value=A000000333010101
50:应用标签,EMV规定为必备数据,用于应用选择,与AID相关便于记忆的数据,Len=0A,Value=50424F43204445424954
9F12 : 应用首选名称,Len=0A,Value=50424F43204445424954
87 : 应用优先指示器01
获得一个AID后,应该选入AID列表。
(3)加入列表后继续读取文件的下一个记录,直到没有任何记录可读取
此处请求命令报文为:
命令格式:读记录(Read Record)报文 00 B2 P1 P2 00
命令参数:00 B2 02 0C 00
参数长度:5
卡片返回数据:
长度:2
值:6A 83
(4)选择应用
根据读取的记录的应用标识符加入AID列表,然后根据用户按键进行选择应用或者根据优先级选择应用。
此处请求命令的报文为:
命令格式:选择(Select)报文 00 A4 P1 P2 Lc Data 00
命令参数:00 A4 04 00 07 A0 00 00 03 33 01 01 00
参数长度:13
卡片返回:
长度:45
值:
6F 45
84 08 A0 00 00 03 33 01 01 01 A5 39 50 0A 50 42 4F 43 20 44 45 42 49 54 87 01 01
9F 38 09 9F 7A 01 9F 02 06 5F 2A 02
5F 2D 02 7A 68
9F 11 01 01
9F 12 0A 50 42 4F 43 20 44 45 42 49 54
BF 0C 05 9F 4D 02 0B 0A
90 00
6F: FCI模板
84: DF名称
9F38: PDOL的数据(9F1A:终端国家代码;9F7A: 电子现金指示器,9F02:授权金额,5F2A:交易货币代码)
5F2D:首选语言
9F11: 发卡行代码表索引
进行最终选择,要求用户输入金额,判断POS是否能走电子现金交易路径,表示电子现金指示器。
(二)应用初始化
(5)获取处理选项(GPO--GET PROCESSING OPTIONS)通知卡片交易开始。
该命令报文的组合需要第4步返回的PDOL数据(9F38),根据PDOL选项进行组包
请求命令报文:
表 B.12 获取处理选项(GET PROCESSING OPTIONS)命令报文
编码 | 值 |
CLA | ‘80’ |
INS | ‘A8’ |
P1 P2 | ‘00’ |
Lc | ‘00’ |
数据域 | PDOL相关数据(如果存在)或8300 |
Le | ‘00’ |
命令格式:GPO报文 80 A8 00 00 XX(长度) 83(PDOL标签) XX(PDOL长度) PDOL 00
命令参数:80 A8 00 00 0B
83 09
9F 02 06 5F 2A 02 00
参数长度:14
卡片返回:
80 16
7C 00
08 01 01 00
10 01 01 01
10 03 06 00
18 01 01 00
20 01 01 00
90 00
GPO响应格式:80 XX(长度) XX(应用交互特征) XX(AFL)
所以,应用交互特征是7C 00(0111 1100),AFL是08 01 01 00 10 01 01 01 10 03 06 00 18 01 01 00 20 01 01 00
此处返回的报文不是TLV格式。
7C00为应用交互特征,解析:
bit8:保留(RFU);
bit7:1=支持SDA; 静态数据认证
bit6:1=支持DDA; 动态数据认证
bit5:1=支持持卡人认证
bit4:执行终端风险管理
bit3:支持发卡行认证
bit2:保留
bit1:1=支持CDA
字节2:保留(RFU)
0801010010010101100306001801010020010100为AFL(共5个),AFL(应用文件定位器),每个AFL包括4个字节
字节1:bit8-bit4:SFI(短文件标识符)
bit3-bit1:000
字节2:文件中要读的第1个记录的记录号(不能为0)
字节3:文件中要读的最后一个记录的记录号(大于或等于字节2)
字节4:从字节2的记录号开始,用于静态数据记录的个数(从0开始,不大于(字节3)-(字节2)+1)
根据GPO返回的AFL,读文件。
读文件号格式(P2)为:SFI(AFL第一个字节)左移3位,右边补100(跟READ RECORD命令算P2一样)。
比如上面的08 二进制就是 0000 1000 ,因为bit8-bit4才是SFI,所以真实的是:0000 0001 。
读取文件的时候,左移3位右补0100(表明读取指定记录) ,得到0000 1100,就是0x0c。同理算P2如下:
第一个文件:08 01 01 00 字节1二进制为0000 1000 左移右补后0000 1100 即0x0C
第二个文件:10 01 01 01 字节1二进制为0001 0000 左移右补后0001 0100 即0x14
第三个文件:10 03 06 00 字节1二进制为0001 0000 左移右补后0001 0100 即0x14
第四个文件:18 01 01 00 字节1二进制为0001 1000 左移右补后0001 1100 即0x1C
第五个文件:10 01 01 00 字节1二进制为0001 0000 左移右补后0001 0100 即0x14
表jl-1.0 分析上面返回的AFL
第n个文件 | 第一个字节 | 第二个字节(开始记录号) | 第三个字节(结束记录号) | 第三个字节 | 备注 |
1 | 0C | 01 | 01 | 00 | 开始到结束1个记录 |
2 | 14 | 01 | 01 | 01 | 1个记录 |
3 | 14 | 03 | 06 | 00 | 4个记录 |
4 | 1C | 01 | 01 | 00 | 1个记录 |
5 | 14 | 01 | 01 | 00 | 1个记录 |
(三)读应用数据
根据第5步的AFL解析结果,可以组合出读应用数据的报文。
表 B.20 读记录(READ RECORD)命令报文
编码 | 值 |
CLA | ‘00’ |
INS | ‘B2’ |
P1 | 记录号 |
P2 | 引用控制参数,见表B-21 |
Lc | 不存在 |
数据域 | 不存在 |
Le | ‘00’ |
表B.21定义了命令报文的引用控制参数。
表 B.21读记录(READ RECORD)命令引用控制参数
b8 | B7 | b6 | b5 | b4 | b3 | b2 | b1 | 意义 |
x | x | x | x | x | SFI | |||
1 | 0 | 0 | 读P1指定记录 |
发送
命令格式:READ RECORD(读记录)报文 00 B2 P1 P2 00
命令长度:5
命令参数:00 B2 01 0C 00 【根据表“jl-1.0”第一个文件】
接受
长度:
值:
70 74
57 13 6214830100237436D22112201464200755165F
9F 0B 2D 4C 49 20 58 49 4E 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9F 61 28 31 34 32 34 32 39 31 39 38 32 30 35 31 34 34 34 31 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9F 62 01 00
90 00
70:模板
5F20:持卡人姓名
57:二磁道等价数据(主账户、分隔符、失效日期、服务吗、PIN验证域、自定义数据非偶数补充F)
9F0B:持卡人姓名
9F61:持卡人证件号
9F62:证件类型,00-身份证
发送:
00 B2 01 14 00 【根据表“jl-1.0”第二个文件】
接受:
70 4A
5F 24 03 22 11 30
5F 25 03 12 11 21
5A 08 62 14 83 01 00 23 74 36
5F 34 01 00
9F 07 02 FF 00
8E 0C 00 00 00 00 00 00 00 00 42 03 1E 03
9F 0D 05 D8 60 9C A8 00
9F 0E 05 00 10 00 00 00
9F0F05D8689CF800
5F28020156
9000
9F0E : 发卡行行为代码(IAC)-拒绝
9F0D : 发卡行行为代码(IAC)-缺省
5F28:发卡行国家代码
5F34:应用主账号序列号
5F25:应用生效日期
5A :二磁道
发送:
00 B2 03 14 00 【根据表“jl-1.0”,第三个文件,第一个记录】
接受:
7081B3
9081B0A33373F56850C06B1DE59D93F4F2A362CEA2A57C37D5DC78E3BF84914B608A43ACD22539B6C0491E88652244D2A199E6516D0C6F3C632F65202561106420FA406F530AE8D39CAF6EA5730E4A5AB15763FB42EAFA0AEE69A9E69640642E29CA15D5449B7AB74411A50EF811ACDEF4D8F93004C423E77E55AC263DA89308FCC05E3E0AA599565590C83CCE7FF6B17602F1BD7DB22C48A5A039FB97C48A8FA16083CC56DD6FEC3C6E7E81F37DCA25A949EC9000
90:发卡行公钥证书--用于脱机数据认证
发送:
00 B2 04 14 00 【根据表“jl-1.0”,第三个文件,第二个记录】
接受:
7048
8F0103
920433DFA015
9F320103
9F470103
9F482A737DBBA0A11741BD57FEDF1BE60C551A88A24A82B5EB3182642F217AFA986E04DB7AC2F38057FCE8AC01
9F49039F3704
9F4A0182
9000
8F:CA公钥索引(PKI)
9F32:发卡行公钥指数
9F4A:静态数据认证标签列表
92:发卡行公钥余数
9F47:IC卡公钥指数
9F48: IC卡公钥余数
9F49:动态数据认证数据对象列表(DDOL)
发送:
00 B2 05 14 00 【根据表“jl-1.0”,第三个文件,第三个记录】
接受:
708193
93819088E48EC5AC68FD509E73786839978F465F4BDB905EF38B9FBD17147FE810EAB68EB5E86C4A23BA2E897A54892D1DAD75EE339C21603CB172C66CE312AA9B585D5F24A3827342D504AF9EC2E95407AA72CE527DC1C0BA4D051B8BA6282AEDEEE1D3725EC8CA91EC515903D7E100576B837F96ABCB789C10434AFEC23E30D33B509FBBFB40ACDB15DF282372B8F3FBC99D9000
93: 签名的静态应用数据-SDA
发送:
00 B2 06 14 00 【根据表“jl-1.0”,第三个文件,第四个记录】
接受:
708194
9F468190810A5485E3B940508DDFF1E6AC2BF5B8990742BC1E11146C8BFC46D8C3C425ABA2C264CE2F478C320D198FF03E090EA61ECA3CCCF493AA886EDAC940C2F0CDC248768204DF4DEC26758B18F67E9CC7AB84C7DA55F00BDF0127CAF12B09E93C1830120E5F700BAB5D9124F209037FC3BE5BC44D34153760CB5E79890B C5D00491681ECDD1C9844874D9B0DFFF81236C899000
9F46:IC卡公钥证书
发送:
00 B2 01 1C 00【第四个文件,第一个记录】
接受:
7048
8C1B9F02069F03069F1A0295055F2A029A039C019F37049F21039F4E14
8D1A8A029F02069F03069F1A0295055F2A029A039C019F37049F2103
5F30020220
9F42020156
9F08020020
9000
5F30 : 0220 服务码
8C:卡片风险管理数据对象列表1(CDOL1)
8D:卡片风险管理数据对象列表2 (CDOL2)
9F08:应用版本号
9F42:应用货币代码
发送:
00 B2 01 24 00 【第五个文件,第一个记录】
接受:
7008
9F140100
9F230100
9000
9F14:连续脱机交易下限
9F23:连续脱机交易上限
(四)生成应用密文
根据上面读取的“卡片风险管理数据对象列表1(CDOL1)”生成该命令。
请求命令报文:
80AE40002E00000000000900000000000001560000800000015610041000B84FBA072019024C4E00000000000000000000000000000000000000
卡片返回:
801E800012E70CB84C238601F207010103A020000100000000007B168F919000
返回的数据解析:密文信息数据(L:1) + 应用交易计数器(L:2) + 应用密文(L:8) + 发卡行应用数据