zoukankan      html  css  js  c++  java
  • 基于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作为清算的时候验证交易数据真伪和完整性的重要依据,连同交易记录一同保存在终端。

  • 相关阅读:
    基于JFinal中搭建wopi协议支撑办法
    mysql 增加列
    国王分金币
    口算题卡升级版本
    elasticsearch牛人的日志列表
    牛B的大数据库
    golang --rune
    golang ---rune与byte
    golang学习笔记--接口
    golang学习笔记--函数和方法
  • 原文地址:https://www.cnblogs.com/ttss/p/4280376.html
Copyright © 2011-2022 走看看