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

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

一. 圈存

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

假设LoadKey = 11223344556677888877665544332211

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

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

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

805000010B0100001000001122334455
CLAINSP1P2LCKeyIndex交易金额终端机编号

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

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

MAC1的计算过程如下:

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

InputData = 11223344 0000 8000 (8bytes)

1122334400008000 (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

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

SessionKey = 9B1D924E05595603

MAC1 = MAC(InputData1 SessionKey ) = 2988AE5A

用SessionKey对InputData1做MAC运算得到MAC1

验证一下:
这里写图片描述

SessionKey   :  9B1D924E05595603
初始向量      :  0000000000000000
InputData1   :  000000000000100001001122334455

MAC1        = 2988AE5A165CF0C0

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

第三步:终端计算MAC2

InputData2=00001000 01 001122334455 20111221 214822

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

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

CLAINSP1P2LC交易日期交易时间MAC2
805200000B201112212148223A845BF0

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

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值