0.1.2.8版ep圈存脚本

? "开始钱包的圈存"

    // 交易类型
    ED圈存 = 01
    EP圈存 = 02

    交易类型=  $EP圈存

    //圈存密钥
    圈存密钥   = 70 6D 06 71 BB 8B D2 8B D3 D6 E8 83 68 32 FD D4

    //消费密钥
    消费密钥   = 36 05 EB BC B7 C2 C7 C4 70 E9 BE A6 97 72 3D F8

    //TAC密钥
    TAC密钥    = 47 9E 71 BE FF 10 7A 76 13 8D 34 F8 4B 20 31 FF

    终端机编号 = 112233445566

    交易金额   = 00001000

    交易时间   = 2011 0401 12 00 00

    //初始化圈存
    //                交易类型 = EP圈存            密钥索引        交易金额         终端机编号
    80 50 00          $交易类型              (       01            $交易金额       $终端机编号  )
    if sw != 9000
        message "初始化圈存错误"
        pause
    endif
    set 初始化圈存结果        //将结果暂存,结果内容为       余额(4)    序号(2)    版本号+版本标识( 2 )     伪随机数( 4 )   mac1( 4 )

    //将数据进行分解
    余额      =   mid( $初始化圈存结果, 0, 4 )        // 余额
    交易序号  =   mid( $初始化圈存结果, 4, 2 )        // 序号
    伪随机数  =   mid( $初始化圈存结果, 8, 4 )        // 伪随机数
    圈存mac1  =   mid( $初始化圈存结果, 12, 4 )        // 圈存mac1

    //下面开始校验mac1,先计算过程密钥SESLK,SESLK的原始组成为
    //              伪随机数  || 电子存折联机序列号或电子钱包联机序列号 || 8000
    圈存过程密钥原始数据 = $伪随机数     $交易序号                               8000
    ? "圈存过程密钥原始数据为   "       $圈存过程密钥原始数据

    圈存过程密钥 = 3des_encode_ecb( $圈存过程密钥原始数据, $圈存密钥 )
    ? "圈存过程密钥             "       $圈存过程密钥

    //mac1的原始数据组成为
    //               余额 +       交易金额 + 交易类型标识 + 终端机编号
    mac1的原始数据 = $余额     $交易金额      $交易类型         $终端机编号
    mac1的临时数据 = fixed80( $mac1的原始数据 )
    ? "mac1的原始数据    "  $mac1的原始数据
    ? "mac1的临时数据    "  $mac1的临时数据

    //用过程密钥对mac1原始数据计算mac,其结果就是mac1,icv为全0
    外部计算的mac1 = des_des_mac( 0000000000000000, $mac1的临时数据, $圈存过程密钥 )

    if $外部计算的mac1 != $圈存mac1
        message "mac1 错误"
        ? "外     " $外部计算的mac1
        ? "内     " $圈存mac1
        pause
    else
        message "mac1 正确,圈存初始化成功"
    endif

    //******************************
    // 圈存
    //******************************
    // 圈存数据为 交易时间 + mac2
    // mac 原始数据为 交易金额 + 交易类型标识 + 终端机编号 + 交易时间 + 交易时间

    圈存指令原始数据 =   $交易金额      $交易类型          $终端机编号   $交易时间
    圈存指令临时数据 = fixed80( $圈存指令原始数据 )

    //用过程密钥对mac2 原始数据进行mac计算,结果是mac2
    圈存指令MAC2 = des_des_mac( 0000000000000000, $圈存指令临时数据, $圈存过程密钥 )

    //圈存指令为 交易时间 + mac2
    80 52 00 00 ( $交易时间 $圈存指令MAC2 )
    if sw != 9000
        message "圈存失败"
        pause
    else
        message "圈存成功"
    endif
    set 圈存指令返回TAC


    //tac的计算如下
    //余额(交易后) + 交易序号(加1前) + 交易金额 + 交易类型标识 + 终端机编号 + 交易时间

    余额 = add( $余额, $交易金额 )

    //                余额(交易后) + 交易序号(加1前) + 交易金额 + 交易类型标识 +  终端机编号 + 交易时间
    TAC原始数据 =   $余额           $交易序号          $交易金额      $交易类型      $终端机编号   $交易时间
    TAC临时数据 =   fixed80( $TAC原始数据 )

    DTK前8字节 = mid( $TAC密钥, 0, 8 )
    DTK后8字节 = mid( $TAC密钥, 8, 8 )
    DTK异或结果 = xor( $DTK前8字节, $DTK后8字节 )

    外部计算TAC = des_des_mac( 0000000000000000, $TAC临时数据, $DTK异或结果 )
    message "TAC 为        "  $外部计算TAC

    if $外部计算TAC != $圈存指令返回TAC
        message "TAC 比较失败"
        pause
    else
        message "TAC 比较成功,圈存完全成功"
    endif


阅读更多

更多精彩内容