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个字节

字节1bit8-bit4SFI(短文件标识符)

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) + 发卡行应用数据

 PBOCIC卡整个过程结束。

PBOCIC读芯片卡流程的更多相关文章

  1. Raid1源代码分析--读流程(重新整理)

    五.Raid1读流程分析 两个月前,刚刚接触raid1,就阅读了raid1读流程的代码,那个时候写了一篇博客.现在回过头看看,那篇的错误很多,并且很多地方没有表述清楚.所以还是决定重新写一篇以更正之前 ...

  2. IM群聊消息的已读回执功能该怎么实现?

    本文引用了架构师之路公众号作者沈剑的文章,内容有改动,感谢原作者. 1.前言 我们平时在使用即时通讯应用时候,每当发出一条聊天消息,都希望对方尽快看到,并尽快回复,但对方到底有没有真的看到?我却并不知 ...

  3. Ceph源码解析:读写流程

    转载注明出处,整理也是需要功夫的,http://www.cnblogs.com/chenxianpao/p/5572859.html 一.OSD模块简介 1.1 消息封装:在OSD上发送和接收信息. ...

  4. RAID5 IO处理之条带读代码详解

    除了对齐读流程中读失败通过条带重试的场景会进入到条带读,当IO覆盖范围超过一个chunk时也会进入条带读(如向chunk为4K的RAID下发起始位置为1K大小为4K的IO),接下来我们就这部分逻辑进行 ...

  5. 从netty-example分析Netty组件续

    上文我们从netty-example的Discard服务器端示例分析了netty的组件,今天我们从另一个简单的示例Echo客户端分析一下上个示例中没有出现的netty组件. 1. 服务端的连接处理,读 ...

  6. HDFS DataNode 设计实现解析

    前文分析了 NameNode,本文进一步解析 DataNode 的设计和实现要点. 文件存储 DataNode 正如其名是负责存储文件数据的节点.HDFS 中文件的存储方式是将文件按块(block)切 ...

  7. 实例浅析epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO

    一.基本概念                                                          我们通俗一点讲: Level_triggered(水平触发):当被监控的 ...

  8. HBASE的读写以及client API

    一:读写思想 1.系统表 hbase:namespace 存储hbase中所有的namespace的信息 hbase:meta rowkey:hbase中所有表的region的名称 column:re ...

  9. [译]Cassandra的数据读写与压缩

    本文翻译主要来自Datastax的cassandra1.2文档.http://www.datastax.com/documentation/cassandra/1.2/index.html.此外还有一 ...

随机推荐

  1. .net数据库连接防注入参数查询 命令执行 读取 备份 导出导入转化XML格式

    ADO.NET是一组类库,让我们通过程序的方式访问数据库.SYSTEM.DATA这个类提供了统一的接口访问Oracle MSSQL Access.像SYSTEM.IO类操作文件一样. **connec ...

  2. 经典动态规划python实现

    1.最长上升子序列 对于一个数字序列,请设计一个复杂度为O(nlogn)的算法,返回该序列的最长上升子序列的长度,这里的子序列定义为这样一个序列U1,U2...,其中Ui < Ui+1,且A[U ...

  3. node.js实时编译,不需要重启

    npm -g install supervisor 全局安装这个,然后编译依一次文件就可以了,之后修改这个文件不用编译也可以了

  4. Express 应用生成器

    [Express 应用生成器] 通过应用生成器工具 express 可以快速创建一个应用的骨架. 通过如下命令安装,-g意味着安装在全局目录下: 下面的示例就是在当前工作目录下创建一个命名为 myap ...

  5. python3 回顾笔记1

    http://www.runoob.com/python3/python3-tutorial.html这个网址,可以学习python3的基础语法. 1. 单引号和双引号意义完全相同.用r可以限制转义符 ...

  6. iOS 网络请求中的空类型字符串转换

    创建一个工具类,   .h: #import <Foundation/Foundation.h> @interface MySetNullWithStrTool : NSObject +( ...

  7. python之socket运用1

    先看下服务端的代码 import socket ip_bind = ("127.0.0.1",3000) sk = socket.socket() sk.bind(ip_bind) ...

  8. java和数据结构的面试考点

    目标:不要有主要的逻辑错误.2遍以内bug free.注意代码风格 不要让面试官觉得不懂规矩 Java vs C++ Abstract class vs interface  pass by refe ...

  9. win8.1下cocos2d-x 3.x环境搭建

    Win8.1下Cocos2d-x 3.4环境搭建 第一步: 需要下载的:(Windows 64位系统下环境搭建) Ant   apache-ant-1.9.4-bin.zip NDK   androi ...

  10. struts框架问题六之从值栈中获取值

    6. 问题六: 在JSP中获取值栈的数据 * 总结几个小问题: > 访问root中数据 不需要# > 访问context其它对象数据 加 # > 如果向root中存入对象的话,优先使 ...