基于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)

11223344 0000 8000 (8bytes)
随机数 交易序号 填充数据

LoadKey = 11223344556677888877665544332211

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

用LoadKey对InputData 做3DES加密:
验证一下:

LoadKey    =  11223344556677888877665544332211
InputData  =  1122334400008000
结果        =  9B1D924E05595603

2.计算MAC1(4字节)

InputData1 = 00000000 00001000 01 001122334455

00000000 00001000 01 001122334455
卡片余额 交易金额 交易类型 终端机编号

SessionKey = 9B1D924E05595603

MAC1 = MAC(InputData1 SessionKey ) = 2988AE5A

用SessionKey对InputData1做MAC运算得到MAC1

验证一下:

SessionKey   :  9B1D924E05595603
初始向量      :  0000000000000000
InputData1   :  000000000000100001001122334455MAC1        = 2988AE5A165CF0C0

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

第三步:终端计算MAC2

InputData2=00001000 01 001122334455 20111221 214822

00001000 01 001122334455 20111221 214822
交易金额 交易类型 终端机编号 交易日期 交易时间

SessionKey = 9B1D924E05595603 (在整个过程中,会话密钥,又叫过程密钥都是不变的)
MAC2 = MAC(InputData2 SessionKey ) = 3A845BF0
用SessionKey对InputData2做MAC运算

验证一下:

SessionKey  =  9B1D924E05595603
初始向量    =  0000000000000000
InputData2  =  000010000100112233445520111221214822
MAC2        =  3A845BF01F93BAB2

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

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

CLA INS P1 P2 LC 交易日期 交易时间 MAC2
80 52 00 00 0B 20111221 214822 3A845BF0

第五步:卡片收到圈存命令后,用和终端一样的方式计算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个字节做异或运算

TacKey.Left(8)  =  0011223344556677
TacKey.Right(8) =  8899AABBCCDDEEFF
XOR 结果         =  8888888888888888

InputData3=00001000 0000 00001000 01 001122334455 20111221 214822

00001000 0000 00001000 01 001122334455 20111221 214822
新余额 交易序号旧 交易金额 交易类型 终端机编号 交易日期 交易时间

TAC = MAC(InputData3, TACSessionKey) = 6314E5F5

密钥       = 8888888888888888
初始向量   = 0000000000000000
InputData3 = 000010000000000010000100112233445520111221214822
MAC        = 6314E5F56628C3FF

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

转载:http://www.cnblogs.com/ttss/p/4280376.html

具体的算法实现代码:
PBOC MAC 计算算法 实现
https://blog.csdn.net/wowocpp/article/details/80196342

基于PBOC电子钱包的圈存过程详解A相关推荐

  1. 基于PBOC电子钱包的圈存过程详解

    基于PBOC电子钱包的圈存过程详解 基于pboc的电子钱包的圈存过程,供智能卡行业的开发人员参考 一. 圈存 首先终端和卡片有一个共同的密钥叫做圈存密钥:LoadKey   (Load即圈存的意思,u ...

  2. 基于pboc的电子钱包的圈存过程

    基于pboc的电子钱包的圈存过程,供智能卡行业的开发人员参考 一. 圈存 首先终端和卡片有一个共同的密钥叫做圈存密钥:LoadKey 假设LoadKey = 112233445566778888776 ...

  3. 电子钱包的圈存——java card开发第四篇

    隔了好久没更新了,前一篇创建好了文件系统,那现在就可以实现使用电子钱包了,这篇首先讲电子钱包的圈存,其实就是存款进去的意思. 首先看一个灰常重要的流程图: 首先,终端(连着主机,他们的另一边是卡片)给 ...

  4. python人脸识别opencv_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

  5. 怎么把HTML网页重构为VUE,基于vue cli重构多页面脚手架过程详解

    官方提供的项目生成工具vue-cli没有对多页面webApp的支持,但是在实际的项目中,我们需要这样的脚手架,参考了很多大牛的方法,这里提供了一种我的单页面脚手架转换为多页面脚手架的方案,供大家参考. ...

  6. python制作二维码_基于Python生成个性二维码过程详解

    一.问题描述 通过调用MyQR模块来实现生成个人所需二维码. 安装: pip install myqr 二.代码实现 1.普通二维码 from MyQR import myqr # 普通二维码 myq ...

  7. opencv python考勤_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

  8. python模块cv2人脸识别_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

  9. 电子现金跨行圈存基础知识及常见问题

    (一)什么是电子现金 电子现金是基于金融IC卡借记和贷记应用实现的小额支付功能.为适应在脱机环境等条件下或快速支付等场合的使用管理,电子现金的交易规则参照日常使用的现金,具备不记名.不挂失.不计息的特 ...

最新文章

  1. 给新手或者中级程序员提的22条重要建议.
  2. TWaver版3D化学元素周期表
  3. php pdo 参数绑定,PDO绑定参数的其他方法
  4. SpringBoot配置在应用启动后立即执行某些方法代码案例
  5. 如何在 ASP.Net Core 中使用 NCache
  6. SQL(二)- 基础查询语句
  7. mysql 加字段_MySQL8.0大表秒加字段,是真的吗?
  8. 如何操作2345浏览器的历史记录
  9. M1芯片Mac也可以安装Windows系统啦 使用PD16虚拟机安装ARM版Windows10教程
  10. 如果你狂按F2,F12,DEL也进不了BIOS怎么办?
  11. 食物语服务器什么时候维护,食物语无法登录游戏怎么办_食物语无法登录游戏解决方法介绍_游戏吧...
  12. python break语句作用_Python break语句详解
  13. 全球及中国足病鞋垫行业销售情况及营销渠道策略报告(2022-2027年)
  14. java bufferedread_java中关于bufferedreader类中read方法
  15. IPv4地址的分配原理
  16. java怎么让a取随机_数字连连看的java代码怎么把随机数改成字母啊ba title=个人悬赏 href=javascript:;20C/a/b...
  17. springcloudalibaba学习分享
  18. 黑客软件编写基础知识锦囊
  19. 医院管理系统完整项目代码以及数据库建表语句分享(包括加盐和拦截器)
  20. 鸿蒙os页面格式简介

热门文章

  1. markdown 光速入门
  2. Win11 网络连接正常,只有视频和音频加载不出来
  3. android 实现aac音频合并拼接
  4. IDEA中如何配置Git?
  5. RocketMQ实现延时队列原理
  6. 普鲁斯特问卷的26个问题
  7. 降噪耳机哪个牌子好?2022年高性价比降噪蓝牙耳机
  8. mysql组合索引存储_Mysql - 组合索引的B+树存储结构(最左前缀原理)
  9. Android webview退出后崩溃问题(OPPO和vivo手机有问题)
  10. windows7经典开机音乐_重温经典 - AGM无线电贰厂九九按键功能机