? "开始钱包的圈存"
// 交易类型
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