zoukankan      html  css  js  c++  java
  • 基于PBOC电子钱包的消费过程详解

    智能卡金融行业应用电子钱包的消费交易流程,开发人员可参考

    首先终端和卡片有一个共同的密钥叫做消费密钥:PurchKey (针对每种特定的交易,比如,圈存,消费,都有特定的密钥与之对应

    假设PurchKey = 11223344556677888877665544332211   (应用密钥一般都是16字节,写在ADF下的Key文件中

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

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

    Apdu:     80    50    01    02   0B         01        00001000    001122334455

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

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

    00000000        0000        000000            01                00       11223344  

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

    MAC1的计算过程如下(终端):

    1.计算过程密钥:SessionKey  (通信过程都是在建立的会话中进行的,因此为了保证通道的安全性,首先要确定会话密钥,而会话密钥又叫过程密钥是与当次通信的通行环境,对象有关的

    InputData =  11223344          0000                      0001  (8bytes)

                          随机数        卡片脱机交易序号         终端交易序号后四位

    PurchKey = 11223344556677888877665544332211  (消费密钥)

     SessionKey = 3DESEnypt(InputData, PurchKey) = 003238ABC57659DD

                          用PurchKey对InputData 做3DES加密

    过程密钥的产生是由消费密钥和当次消费交易的数据(随机数+卡片脱机交易序号+终端交易序号的后4位)通过3DES加密计算得来的

    2.计算MAC1   (4字节的校验数据

    InputData1 = 00001000   06    001122334455  20120229135100

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

         

    SessionKey = 003238ABC57659DD   (本次会话中过程密钥不变

     MAC1 = MAC(InputData1  SessionKey )  =  F15CAB75

                  用SessionKey对InputData1做MAC运算得到校验数据MAC1

    第二步:终端向卡片发送消费命令:

     Apdu:  80  54  01  00  0F  00000001  20111221214822  3A845BF0

        CLA   INS   P1    P2   LC  终端交易序号    交易日期时间         MAC1

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

    第三步:卡片修改余额,脱机交易序号加1并计算MAC2 和TAC,并返回给终端

    计算MAC2

    InputData2=  00001000                       

    交易金额 

         

    SessionKey = 003238ABC57659DD

     MAC2 = MAC(InputData2  SessionKey )  =  56988A13

                   用SessionKey对InputData2做MAC运算得到校验数据MAC2   

    计算TAC

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

    假设TACKey = 00112233445566778899AABBCCDDEEFF

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

                         TACKey的左右8个字节做异或运算得到Tac的过程密钥。

    InputData3=00001000    01   001122334455    00000001      20111221    214822                       

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

    TAC = MAC(InputData3, TACSessionKey) = 3FF7A28A

    MAC2和TAC作为消费命令的返回数据返回给终端,消费交易到此就结束了,

    TAC作为清算的时候验证交易数据真伪和完整性的重要依据,连同交易记录一同保存在终端。

  • 相关阅读:
    super的使用
    Django--自定义 Command 命令
    Django models
    二柱子的编程 四则运算2
    阅读《梦断代码》计划
    随机数计算小学四则运算
    人月神话有感
    软件演化
    软件测试
    软件实现
  • 原文地址:https://www.cnblogs.com/ttss/p/4280430.html
Copyright © 2011-2022 走看看