基于PBOC电子钱包的圈存过程详解
基于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电子钱包的圈存过程详解的更多相关文章
- 基于PBOC电子钱包的消费过程详解
智能卡金融行业应用电子钱包的消费交易流程,开发人员可参考 首先终端和卡片有一个共同的密钥叫做消费密钥:PurchKey (针对每种特定的交易,比如,圈存,消费,都有特定的密钥与之对应) 假设Purch ...
- PBOC电子钱包与电子现金及QPBOC
电子钱包:EP 电子现金:EC,在PBOC规范中的13部分定义了<基于借贷记应用的小额支付规范中> QPBOC:在PBOC规范的12部分中定义了<费接触式IC卡支付规范> PB ...
- linux内核剖析(零)linux系统启动过程详解-开机加电后发生了什么
本文参考了如下文章 深入理解linux启动过程 mbr (主引导记录(Master Boot Record)) 电脑从开机加电到操作系统main函数之前执行的过程 详解linux系统的启动过程及系统初 ...
- Android编译过程详解(一)
Android编译过程详解(一) 注:本文转载自Android编译过程详解(一):http://www.cnblogs.com/mr-raptor/archive/2012/06/07/2540359 ...
- 【STM32H7教程】第13章 STM32H7启动过程详解
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第13章 STM32H7启动过程详解 本章教 ...
- Hadoop MapReduce执行过程详解(带hadoop例子)
https://my.oschina.net/itblog/blog/275294 摘要: 本文通过一个例子,详细介绍Hadoop 的 MapReduce过程. 分析MapReduce执行过程 Map ...
- Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)
启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...
- Linux启动过程详解
Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...
- 理论经典:TCP协议的3次握手与4次挥手过程详解
1.前言 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务.TCP提供一种面向连接的.可靠的字节流服务. 面向连接意味着两个使用TCP的应用(通常是一个客户和一 ...
随机推荐
- _config.json
{ "AUTH": "66D86F40DF42A6103C2B0C2F16E41472DABF0594C79859E5EF51E06B377215F3B464E3F0F3 ...
- 实现弹出收回菜单效果ios源码
REMenu能够提供下弹出来的菜单,跳转到不同的vc后菜单便会收起.菜单的弹收都有回弹(bounce)的效果.效果图: <ignore_js_op> 使用方法: 先把REMenu的文件夹复 ...
- sqlite:多线程操作数据库“database is locked”解决方法(二)
上一篇博客<sqlite:多线程操作数据库“database is locked”解决方法>通过注册延时函数的方法来处理数据库被锁的问题.此方法固然能解决问题,但是在多个线程向数据库写入大 ...
- Raspberry Pi B+ 定时向物联网yeelink上传CPU GPU温度
Raspberry Pi B+ 定时向物联网yeelink上传CPU GPU温度 硬件平台: Raspberry Pi B+ 软件平台: Raspberry 系统与前期安装请参见:树莓派(Ros ...
- C#中的快捷键,可以更方便的编写代码 (转载)
C#中的快捷键,可以更方便的编写代码 CTRL + SHIFT + B 生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL + SHIFT + O 打开项目 CTRL + ...
- 关于Ajax跨域
本人因工作需求,编写了一个测试页面,在页面填写完信息之后去向一个站点请求数据,然后返回结果!一开始是直接用Ajax在脚本中去访问,没有大碍(因为目标地址是本机上的一个网站),但是当站点去外部的网站时, ...
- 四、MongoDB的查询
一.MongoDB的下载.安装与部署 二.MongoDB的基础知识简介 三.MongoDB的创建.更新和删除 db.blogs.insert([ { "author": " ...
- Laravel 5 基础(八)- 模型、控制器、视图基础流程
添加路由 Route::get('artiles', 'ArticlesController@index'); 创建控制器 php artisan make:controller ArticlesCo ...
- 生产WCF客户端类文件的命令格式
生产WCF客户端类文件的命令格式: svcutil.exe net.tcp://127.0.0.1:8732/ChromaMI.Remote.ConfigService/RemoteConfigSer ...
- IOS下载资源zip到本地然后读取
思路是 1.ios下载服务器上的zip资源包(图片,声音等经过zip压缩的资源包)到本地 2.解压zip到程序目录 3.从程序目录加载资源文件 一.下载zip资源 [cpp]-(NSString*)D ...