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. 30分钟新手git教程

    本文转载自:http://igeekbar.com/igeekbar/post/82.htm Git近些年的火爆程度非同一般,这个版本控制系统被广泛地用在大型开源项目(比如Linux),不同规模的团队 ...

  2. SpringBoot application.yml logback.xml 多环境

    启动命令为 //开发环境 java -jar app.jar --spring.profiles.active=dev--server.port=8060 //测试环境 java -jar app.j ...

  3. 调试PHP如何让浏览器提示错误

    php.ini中的display_errors的值改为On:或者php代码页顶部加上ini_set("display_errors", "On"); error ...

  4. 无插件,无com组件,利用EXCEL、WORD模板做数据导出(一)

    本次随笔主要讲述着工作中是如何解决数据导出的,对于数据导出到excel在日常工作中大家还是比较常用的,那导出到word呢,改如何处理呢,简单的页面导出问题应该不大,但是如果是标准的公文导出呢,要保证其 ...

  5. nat 类型及打洞原理

    nat 类型分4种 1.全锥形 full cone A 与 主机B交互,nat转换 A的内部地址及端口为  ip1 port1,ip1和port1为对外地址,任何机器能访问. 2.ip 受限制(对B而 ...

  6. 两个onCreate方法?你真的了解onCreate()么?

    Activity的onCreate方法一直是我们编写一个activity最先重载的方法.细心的小伙伴在编写代码的时候回看到这样一幕: 咦,这里怎么会有两个onCreate提供给我们重载?选择困难症患者 ...

  7. 使用git提交代码到GitHub

    0.下载Git Bash,在Windows系统可以用Git Bash通过简单的命令将代码提交到GitHub1.打开项目所在的文件夹,右键,"Git Bash Here"2.初次使用 ...

  8. Python3 input() 函数

    Python3 input() 函数  Python3 内置函数 Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型. 注意:在 Python3.x 中 ra ...

  9. 【校招面试 之 C/C++】第1题 为什么优先使用构造函数的初始化列表

    1.首先看一个例子: #include<iostream> using namespace std; class Test1 { public: Test1() // 无参构造函数 { c ...

  10. php 下 html5 XHR2 + FormData + File API 上传文件

    FormData的作用: FormData对象可以帮助我们自动的打包表单数据,通过XMLHttpRequest的send()方法来提交表单.当然FormData也可以动态的append数据.FormD ...