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

  • 相关阅读:
    前端与算法 leetcode 344. 反转字符串
    JavaScript闭包使用姿势指南
    前端与算法 leetcode 48. 旋转图像
    前端与算法 leetcode 36. 有效的数独
    前端与算法 leetcode 1. 两数之和
    前端与算法 leetcode 283. 移动零
    前端与编译原理 用js去运行js代码 js2run
    前端与算法 leetcode 66. 加一
    前端与算法 leetcode 350. 两个数组的交集 II
    前端与算法 leetcode 26. 删除排序数组中的重复项
  • 原文地址:https://www.cnblogs.com/ttss/p/4280376.html
Copyright © 2011-2022 走看看