上一篇简单的了解了IC智能卡的文件结构和APDU报文,这篇我们直接来读取卡内的数据。下面我们主要参照《中国金融集成电路(IC)卡规范》。

  好了废话不多说,下面贴指令:

(1)卡片接收一个来自终端的选择(SELECT)命令,请求选择 PSE(文件名“1PAY.SYS.DDF01”);

    选择支付系统 PSE-1PAY.SYS.DDF01,在这里是规范规定的PSE的文件名为“1PAY.SYS.DDF01”

->00a404000E315041592E5359532E4444463031

结果->

6F 26

84   (DF名称)                        0E                       315041592E5359532E4444463031

A5   (FCI数据专用模板)    14(长度)

88   (目录基本文件的SFI)  01(长度) 01

5F2D (语言选择)           02         7A68

9F11 (发卡行代码表索引)   01         01

BF0C (发卡行自定义数据FCI)05         9F4D020B0A

9000 (SW1 SW2)

(2) GETDATA 获取数据

指令->00B2010C

结果->

70   28

61   26

4F   08     A000000333010101(AID)

50   0A     50424F43204445424954

9F12 0A    50424F43204445424954

87   01     01

9000

(3)根据AID=A000000333010101选择文件 获取ADF  FCI

指令->00A4040008A000000333010101 //根据AID=A000000333(RID) 010101(认证中心公钥索引PKI)

结果->

6F   45

84   08 A000000333010101

A5   39

50   0A 50424F43204445424954(应用标签)

87   01  01

9F38  09  9F7A01 9F0206 5F2A02   //处理选项数据对象列表(PDOL)

*在应用初始化步骤,卡片在处理 GPO 命令时需要由终端提供的数据元的标识和、长度列表

5F2D  02  7A68

9F11  01  01

9F12 0A 50424F43204445424954(应用优先名称)

BF0C 05 9F4D020B0A

9000

(4)这里便可以读取电子现金余额等信息

例如:

指令->80CA9F79     /9F79:电子现金余额

结果 ->

9F79 06 000000000000 9000  //余额:00.00元

|----------------------------------------------|

|       9F6D:电子现金重置阈                       |

|       9F77:电子现金余额上线                    |

|       9F78:电子现金单笔交易限额              |

|       9F5D:脱机可用余额                         |

|       9F6B:读取卡片 CVM 限额                 |

|---------------------------------------------|

(5)下面就是比较关键的一步GPO的操作

首先需要用到步骤(3)可以获取到处理选项数据对象列表(PDOL)

PDOL:

9F7A01 (电子现金终端指示器): 01

9F0206 (授权金额):000000000000

5F2A02 (交易货币代码):0156

指令->80A800000B8309010000000000000156

结果->

80 16 7C00 (应用交互特征AIP)

08010200  (AFL应用文件定位器)

10040601  (AFL应用文件定位器)

18010200  (AFL应用文件定位器)

20010100  (AFL应用文件定位器)

28010100  (AFL应用文件定位器)

9000

[

********

7C00(应用交互特征AIP)  => 7C[0(bit8) 1(bit7) 1(bit6) 1(bit5) 1(bit4) 1(bit3) 0(bit2) 0(bit1)]00

bit8=0  规范说1=RFU

bit7=1 支持SDA

bit6=1 支持DDA

bit5=1 支持持卡人认证

bit4=1 执行终端风险管理

bit3=1 支持发卡行认证

bit2=0 0=RFU

bit1=0 不支持CDA

第2字节 RFU=0

*********]

(6)下面是根据AFL读取文件,首先来解析下AFL

以第一个AFL为例: 08(SFI)01(第一个要读出的记录号) 02(最后一个要读出的记录号)00(存放用于脱机数据认证的数据的连续记录个数)

下面解析 SFI: 08

  1. 16进制转为2进制的数据 -> 0000 1000

  2. 加 0000 0100 ->0000 1100

  3. 转为16进制 -> 0c

根据AFL读取文件:

指令 ->00B2010C

结果 ->

70 2B

57(二磁道等价数据)    12

62***********414(卡号,这里涉及到隐私就不贴出来了) D2411(有效日期 年/月 24/11) 22000000200000 F(补足)

9F1F(磁道一自定义数据) 14 3*3*3*3*3*30303030303*3*3*303032303*3*3* (一般存放的是身份证信息,但是有的银行是不存放的)

指令->00B2020C00

结果->

70(模板)  09 5F20(持卡人姓名) 02 2020(有的银行是存放的是姓名的拼音的ACII码,但是PBOC3.0建议不要存放私人信息) 9F62(证件类型) 01 00(身份证)

其它的AFL就不一一赘述了,有理解不正确的地方还请指正。

转载请注明出处  http://www.cnblogs.com/xinwang/p/4283671.html

EMV/PBOC 解析(二) 卡片数据读取的更多相关文章

  1. EMV/PBOC 解析(一) 卡片文件结构

    刚到公司老大便发我一份文档<智能卡ISO7816-4规范(中文版)>,然后就让我研究下IC智能卡数据读取和支付.身为一直做.NET开发的我对硬件啥的一无所知,各种无头绪啊,研究了两天后,稍 ...

  2. zico源代码分析(二) 数据读取和解析部分

    第一部分:分析篇 首先,看一下zico的页面,左侧是hostname panel,右侧是该主机对应的traces panel. 点击左侧zorka主机名,右侧panel会更新信息,在火狐浏览器中使用f ...

  3. [IOS微信] PList文件解析,boost数据读取

    最近在解析IOS版微信数据中的 mmsetting.archive 文件时,第一次接触到PList文件. 注:mmsetting.archive  不是一个标准的PList文件,其中含有汉字,并且很多 ...

  4. EMV/PBOC解析(三) TLV格式解析(C#)

    1.什么是TLV格式? TLV即Tag-Length-Value,常在IC卡与POS终端设备中通过这样的一个应用通信协议进行数据交换. 金融系统中的TLV是BER-TLV编码的一个特例编码规范,而BE ...

  5. 【转载】PyTorch系列 (二):pytorch数据读取

    原文:https://likewind.top/2019/02/01/Pytorch-dataprocess/ Pytorch系列: PyTorch系列(一) - PyTorch使用总览 PyTorc ...

  6. 【原】Learning Spark (Python版) 学习笔记(二)----键值对、数据读取与保存、共享特性

    本来应该上周更新的,结果碰上五一,懒癌发作,就推迟了 = =.以后还是要按时完成任务.废话不多说,第四章-第六章主要讲了三个内容:键值对.数据读取与保存与Spark的两个共享特性(累加器和广播变量). ...

  7. json进阶(一)js读取解析JSON类型数据

    js读取解析JSON类型数据 一.什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式,同 ...

  8. geotrellis使用(二)geotrellis-chatta-demo以及geotrellis框架数据读取方式初探

    在上篇博客(geotrellis使用初探)中简单介绍了geotrellis-chatta-demo的大致工作流程,但是有一个重要的问题就是此demo如何调取数据进行瓦片切割分析处理等并未说明,经过几天 ...

  9. js读取解析JSON类型数据(转)

    谢谢博主,转自http://blog.csdn.net/beyond0851/article/details/9285771 一.什么是JSON? JSON(JavaScript Object Not ...

随机推荐

  1. Sql Server跨服务器导出特定表数据

    --连接服务器 exec sp_addlinkedserver 'Test',' ','SQLOLEDB', '192.168.0.7'; exec sp_addlinkedsrvlogin 'Tes ...

  2. AutoLayout适配

    http://www.raywenderlich.com/113768/adaptive-layout-tutorial-in-ios-9-getting-started iOS布局和屏幕适配的一点总 ...

  3. 七、C# 接口

    并非只能通过继承使用多态性,还能通过接口使用它. 和抽象类不同,接口不包含任何实现(方法). 然后和抽象类相似,接口也定义了一系列成员,调用者可以依赖这些成员来支持一个特定的功能.   实现接口的类会 ...

  4. 【USACO 2.3.4】货币系统

    [描述] 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单 ...

  5. [FindBugs分析记录]Class defines clone() but doesn't implement Cloneable

    官网解释: This class defines a clone() method but the class doesn't implement Cloneable. There are some ...

  6. cal命令详解与练习

    cal: 显示日历. 命令格式: cal [-smjy13] [[[day] month] year] 参数说明 -1 显示当前月日历 -3 显示当前月前后3月的日历 -s 以星期天为第一天显示 -m ...

  7. 12 Integer to Roman(int转罗马数字Medium)

    题目意思:1-3999转罗马数字 思路:从大往小减 ps:这题有点蛋疼 class Solution { public: string intToRoman(int num) { string a[] ...

  8. HTML&CSS基础学习笔记1.28-给网页添加一个css样式

    CSS是什么? 当HTML配合CSS一起使用时,我们发现页面变得好看了很多.那么CSS到底是什么呢? CSS指层叠样式表 (Cascading Style Sheets),它主要是用于定义HTML标签 ...

  9. 使用Ajax.ActionLink时,点击对应的按钮会重新加载一个页面,而不是在当前页面的指定模块加载

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. C#复习,输入学生信息排列成绩

    C#复习:在控制台程序中使用结构体.集合,完成下列要求项目要求:一.连续输入5个学生的信息,每个学生都有以下4个内容:1.序号 - 根据输入的顺序自动生成,不需要手动填写,如输入第一个学生的序号是1, ...