基于pboc的电子钱包的圈存过程,供智能卡行业的开发人员参考

一. 圈存

首先终端和卡片有一个共同的密钥叫做圈存密钥:LoadKey   (Load即圈存的意思,unLoad,是圈提的意思)

假设LoadKey = 11223344556677888877665544332211

(密钥一般都是16字节的,圈存即往IC卡里存钱的意思)

在满足安全条件的情况下:

第一步:终端向卡片发送圈存初始化命令:

Apdu:  80        50   00  01   0B         01     00001000   001122334455

CLA    INS  P1   P2   LC   KeyIndex   交易金额      终端机编号

卡片返回16个字节的数据如下(不包括9000):

00000000     0000               02                00    11223344   2988AE5A

卡片余额      交易序号          密钥版本号   算法标识     随机数         MAC1

MAC1的计算过程如下:

1.计算过程密钥:SessionKey  (过程密钥又叫会话密钥,因为通信的过程即是建立了一个会话(session),而过程密钥是跟交易序号和圈存密钥相关的

InputData =  11223344     0000     8000  (8bytes)

随机数      交易序号    填充数据

LoadKey = 11223344556677888877665544332211

SessionKey = 3DES_Enypt(InputData, LoadKey) = 9B1D924E05595603

用LoadKey对InputData 做3DES加密

2.计算MAC1(4字节)

InputData1 = 00000000     00001000     01     001122334455

卡片余额         交易金额   交易类型     终端机编号

SessionKey = 9B1D924E05595603

MAC1 = MAC(InputData1  SessionKey )  =  2988AE5A

用SessionKey对InputData1做MAC运算得到MAC1

第二步:终端用同样的方法计算MAC1并验证卡片返回的MAC1是否正确,从而确认卡片是否合法。如果MAC1验证没有通过,终端会终止交易。如果MAC1验证通过,进行第三步。

第三步:终端计算MAC2

InputData2=00001000     01        001122334455     20111221     214822

交易金额   交易类型      终端机编号            交易日期      交易时间

SessionKey = 9B1D924E05595603  (在整个过程中,会话密钥,又叫过程密钥都是不变的)

MAC2 = MAC(InputData2  SessionKey )  =  3A845BF0

用SessionKey对InputData2做MAC运算

第四步:终端向卡片发送圈存命令:

Apdu:  80    52  00   00    0B  20111221      214822        3A845BF0

CLA   INS  P1   P2   LC   交易日期         交易时间        MAC2

第五步:卡片收到圈存命令后,用和终端一样的方式计算MAC2,并对终端发来圈存命令中的MAC2进行验证,如果MAC2验证没有通过,卡片会返回SW=9302(MAC错误),如果MAC2验证通过,则卡片余额加上交易金额作为卡片新的余额进行余额更新,交易记数器加1,并计算TAC返回给终端,TAC的计算过程如下:

卡片和终端还有一个共同的密钥TAC密钥:TACKey

假设TACKey = 00112233445566778899AABBCCDDEEFF

TACSessionKey=XOR(TacKey.Left(8),TacKey.Right(8)) =8888888888888888

TACKey的左右8个字节做异或运算

InputData3=00001000     0000     00001000      01     001122334455   20111221    214822

新余额       交易序号旧 交易金额     交易类型  终端机编号          交易日期       交易时间

TAC = MAC(InputData3, TACSessionKey) = 6314E5F5

TAC作为圈存命令的返回数据返回给终端,圈存交易到此就结束了,TAC作为清算的时候验证交易数据真伪和完整性的重要依据,连同交易记录一同保存在终端。

基于PBOC电子钱包的圈存过程详解的更多相关文章

  1. 基于PBOC电子钱包的消费过程详解

    智能卡金融行业应用电子钱包的消费交易流程,开发人员可参考 首先终端和卡片有一个共同的密钥叫做消费密钥:PurchKey (针对每种特定的交易,比如,圈存,消费,都有特定的密钥与之对应) 假设Purch ...

  2. PBOC电子钱包与电子现金及QPBOC

    电子钱包:EP 电子现金:EC,在PBOC规范中的13部分定义了<基于借贷记应用的小额支付规范中> QPBOC:在PBOC规范的12部分中定义了<费接触式IC卡支付规范> PB ...

  3. linux内核剖析(零)linux系统启动过程详解-开机加电后发生了什么

    本文参考了如下文章 深入理解linux启动过程 mbr (主引导记录(Master Boot Record)) 电脑从开机加电到操作系统main函数之前执行的过程 详解linux系统的启动过程及系统初 ...

  4. Android编译过程详解(一)

    Android编译过程详解(一) 注:本文转载自Android编译过程详解(一):http://www.cnblogs.com/mr-raptor/archive/2012/06/07/2540359 ...

  5. 【STM32H7教程】第13章 STM32H7启动过程详解

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第13章       STM32H7启动过程详解 本章教 ...

  6. Hadoop MapReduce执行过程详解(带hadoop例子)

    https://my.oschina.net/itblog/blog/275294 摘要: 本文通过一个例子,详细介绍Hadoop 的 MapReduce过程. 分析MapReduce执行过程 Map ...

  7. Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

    启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...

  8. Linux启动过程详解

    Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...

  9. 理论经典:TCP协议的3次握手与4次挥手过程详解

    1.前言 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务.TCP提供一种面向连接的.可靠的字节流服务. 面向连接意味着两个使用TCP的应用(通常是一个客户和一 ...

随机推荐

  1. Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18)

    摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/10/103014.html Groovy轻松入门--通过与Java的比较,迅速掌握Groovy ...

  2. leetcode 118

    118. Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, ...

  3. sql 基本操作

    SQL基本操作   一数据类型1整数型 int2精确数值型 decimal(n,p)n为总位数,p为小数位数3浮点型 float4字符型char(n)n最大为4,varchar(n)5日期型datat ...

  4. webform网站相关数据控件和其他

    一.asp:Repeater <div class="bd"> <ul> <asp:Repeater ID="rept_slide" ...

  5. IIS安装错误导致网站访问不了

    如下图,网站正常但就是访问不了,原因是IIS配置不正确,把ASP.NET4.5等相关勾选上就可以了,不要用默认的勾选,要自己手动勾选.

  6. java基础知识梳理

    java基础知识梳理 1 基本数据类型

  7. Spring中Quartz调度器的使用

    一.Quartz的特点 * 按作业类的继承方式来分,主要有以下两种: 1.作业类继承org.springframework.scheduling.quartz.QuartzJobBean类的方式 2. ...

  8. BAT命令介绍【转自Internet】

    一.简单批处理内部命令简介 1.Echo 命令 打开回显或关闭请求回显功能,或显示消息.如果没有任何参数,echo 命令将显示当前回显设置. 语法: echo [{on│off}] [message] ...

  9. delphi构造&析构调用顺序

    _ClassCreate ->Create ->AfterConstruction(->DoCreate / OnCreate) BeforeDestruction(->DoD ...

  10. spyder常用快捷键

    Ctrl + 1: 注释/反注释 Ctrl + 4/5: 块注释/块反注释 Ctrl + L: 跳转到行号 Tab/Shift + Tab: 代码缩进/反缩进 Ctrl +I:显示帮助