根据PBOC中对电子钱包的描述,电子钱包的功能基本上有三个:圈存、消费、查询余额.
通过圈存交易,持卡人可将其在银行相应帐户上的资金划入电子钱包中,终端发出初始化圈存命令启动圈存交易
代码 |
值 |
|
CLA |
80 |
|
INS |
50 |
|
P1 |
00 |
|
P2 |
02 |
|
Lc |
0B |
|
Data |
密钥标识符 |
08 |
交易金额 |
00 00 10 00(40.96元) |
|
终端机编号 |
00 11 22 33 44 55 |
|
Le |
10 |
(注:交易金额为4个字节的数字,在现阶段,交易金额为16进制,所以,其上表示的为圈存40.96元)
IC卡对初始化圈存命令进行处理
1、IC卡根据密钥标识符,在密钥文件中查找该密钥标识符对应的圈存密钥,如果找不到,就返回状态字“9403”,表示不存在相对应的密钥。如果找到的话,就进行以下的处理
2、IC卡生成随机数,利用所查找到的密钥产生过程密钥。过程密钥的生成方式,我将在之后的密钥管理中进行说明。其输入的数据为伪随机数||电子钱包联机交易序号||8000,密钥为所查找到的圈存密钥。(||这个符号表示的是字符串连接而不是代码中的或)
3、IC卡利用所生成的过程密钥产生MAC1。其MAC1的生成方式,我也将在之后的密钥管理中进行说明。
其输入的数据为电子钱包余额(交易前)||交易金额||交易类型标识(圈存是02)||终端机编号,密钥为过程密钥,
4、在进行这些操作后,IC卡将返回相应的数据
(注:在我的设计中,电子钱包余额以4个字节来进行存储)
说明 |
值 |
EP余额 |
00 00 00 00 |
EP联机交易序列号 |
00 00 |
密钥版本号DPK |
01 |
算法标识DPK |
00 |
伪随机数(IC卡) |
B1 EE 18 0C |
MAC1 |
F2 0B 5E 52 |
终端将命令响应数据传送给主机,若MAC1验证成功,主机将同意交易进行,并从持卡人在银行的相应帐户中扣减圈存金额。
终端向IC卡发送圈存命令。
代码 |
值 |
|
CLA |
80 |
|
INS |
52 |
|
P1 |
00 |
|
P2 |
00 |
|
Lc |
0B |
|
Data |
交易日期(主机) |
20 11 12 21(2011年12月11日) |
交易时间(主机) |
21 48 22 (21点48分22秒) |
|
MAC2 |
3A 84 5B F0 |
|
Le |
04 |
IC卡收到圈存命令后,利用过程密钥生成MAC2。其输入数据为交易金额||交易类型标识(圈存的都是02)||终端机编号||交易日期(主机)||交易时间(主机)。密钥为过程密钥。与圈存命令传送的MAC2进行比较,如果相同,则MAC2有效
IC卡将电子钱包联机交易序号加1,并且把交易金额加在电子钱包的余额上。
IC卡生成TAC码。TAC码的生成方式和MAC码的生成方式一致。其输入的数据:电子钱包余额(交易后)||电子钱包联机交易序号(加1前)||交易金额||交易类型标识(圈存是02)||终端机编号||交易日期(主机)||交易时间(主机)。密钥为TAC密码最左8个字节与TAC密码最右8个字节异或的结果。
IC卡将TAC码返回给终端。至此,IC卡端的圈存交易已经完成了。
说明 |
长度(字节) |
TAC码 |
4 |
通过消费交易,持卡人可使用其电子钱包中的余额来进行消费。
终端发出初始化消费命令启动消费交易
代码 |
值 |
|
CLA |
80 |
|
INS |
50 |
|
P1 |
01 |
|
P2 |
02 |
|
Lc |
0B |
|
Data |
密钥标识符 |
07 |
交易金额 |
00 00 10 00(40.96元) |
|
终端机编号 |
00 11 22 33 44 55 |
|
Le |
0F |
(注:交易金额为4个字节的数字,在现阶段,交易金额为16进制,所以,其上表示的为消费40.96元)
IC卡对初始化消费命令进行处理
1、IC卡根据密钥标识符,在密钥文件中查找该密钥标识符对应的消费密钥,如果找不到,就返回状态字“9403”,表示不存在相对应的密钥。如果找到的话,就进行以下的处理
2、IC卡生成随机数后,进行以下处理
3、IC卡检查电子钱包余额是否大于或等于交易金额。如果小于交易金额,则回送状态字9401,表示资金不足。
4、在进行这些操作后,IC卡将返回相应的数据
(注:在我的设计中,电子钱包余额以4个字节来进行存储)
说明 |
值 |
EP余额 |
00 00 10 00 |
EP脱机交易序列号 |
00 00 |
透支限额 |
00 00 00 |
密钥版本号DPK |
01 |
算法标识DPK |
00 |
伪随机数(IC卡) |
29 88 AE 5A |
终端将命令响应数据传送给主机,主机生成MAC1
终端向IC卡发送消费命令。
代码 |
值 |
|
CLA |
80 |
|
INS |
54 |
|
P1 |
01 |
|
P2 |
00 |
|
Lc |
0F |
|
Data |
终端交易序号 |
01 02 03 04 |
交易日期(主机) |
20 11 12 21(2011年12月11日) |
|
交易时间(主机) |
21 48 22 (21点48分22秒) |
|
MAC1 |
3A 84 5B F0 |
|
Le |
08 |
IC卡收到消费命令后,利用所查找到的密钥产生过程密钥。其输入的数据为伪随机数||电子钱包脱机交易序号||终端交易序号的最右两个字节,密钥为所查找到的消费密钥
IC卡利用过程密钥生成MAC1。其输入数据为交易金额||交易类型标识(0x06)||终端机编号||交易日期(主机)||交易时间(主机)。与消费命令传送的MAC1进行比较,如果相同,则MAC1有效
IC卡将电子钱包脱机交易序号加1,并且把电子钱包的余额减去交易金额。
在进行上述处理后,IC卡利用过程密钥生成MAC2。其输入数据为交易金额,密码为过程密钥。
IC卡生成TAC码。TAC码的生成方式和MAC码的生成方式一致。其输入的数据:交易金额||交易类型标识||终端机编号||终端交易序号||交易日期(主机)||交易时间(主机)。密钥为TAC密码最左8个字节与TAC密码最右8个字节异或的结果。
IC卡将TAC码和MAC2返回给终端。至此,IC卡端的消费交易已经完成了。
说明 |
长度(字节) |
交易验证码TAC |
4 |
MAC2 |
4 |
代码 |
值 |
|
CLA |
80 |
|
INS |
50 |
|
P1 |
00 |
|
P2 |
02 |
|
Lc |
0B |
|
Data |
密钥索引号 |
1个字节 |
交易金额 |
4个字节 |
|
终端机编号 |
6个字节 |
|
Le |
10 |
说明 |
长度(字节) |
EP余额 |
4 |
EP脱机交易序列号 |
2 |
密钥版本号(DLK) |
1 |
算法标识(DLK) |
1 |
伪随机数(IC卡) |
4 |
MAC1 |
4 |
此命令执行成功的状态码是9000
IC卡可能回送的错误状态码如下所示:
SW1 SW2 |
意义 |
6B 00 |
参数P1 P2错误 |
6E 00 |
CLA错误 |
67 00 |
长度错误 |
95 01 |
圈存超过最大值 |
94 03 |
密钥索引不支持 |
6A 82 |
文件未找到 |
代码 |
值 |
|
CLA |
80 |
|
INS |
52 |
|
P1 |
00 |
|
P2 |
00 |
|
Lc |
0B |
|
Data |
交易日期(主机) |
4个字节 |
交易时间(主机) |
3个字节 |
|
MAC2 |
4个字节 |
|
Le |
04 |
说明 |
长度(字节) |
交易验证码TAC |
4 |
SW1 SW2 |
意义 |
6B 00 |
参数P1 P2错误 |
6E 00 |
CLA错误 |
67 00 |
长度错误 |
94 03 |
密钥索引不支持 |
95 01 |
圈存超过最大值 |
6A 82 |
文件未找到 |
94 02 |
MAC验证不成功 |
代码 |
值 |
|
CLA |
80 |
|
INS |
50 |
|
P1 |
01 |
|
P2 |
02 |
|
Lc |
0B |
|
Data |
密钥索引号 |
1个字节 |
交易金额 |
4个字节 |
|
终端机编号 |
6个字节 |
|
Le |
0F |
说明 |
长度(字节) |
EP余额 |
4 |
EP脱机交易序列号 |
2 |
透支限额 |
3 |
密钥版本号DPK |
1 |
算法标识DPK |
1 |
伪随机数(IC卡) |
4 |
SW1 SW2 |
意义 |
6B 00 |
参数P1 P2错误 |
6E 00 |
CLA错误 |
67 00 |
长度错误 |
94 03 |
密钥索引不支持 |
95 01 |
金额不足 |
6A 82 |
文件未找到 |
代码 |
值 |
|
CLA |
80 |
|
INS |
54 |
|
P1 |
01 |
|
P2 |
00 |
|
Lc |
0F |
|
Data |
终端交易序号 |
4个字节 |
交易日期(终端) |
4个字节 |
|
交易时间(终端) |
3个字节 |
|
MAC1 |
4个字节 |
|
Le |
08 |
说明 |
长度(字节) |
交易验证码TAC |
4 |
MAC2 |
4 |
SW1 SW2 |
意义 |
6B 00 |
参数P1 P2错误 |
6E 00 |
CLA错误 |
67 00 |
长度错误 |
95 01 |
金额不足 |
94 03 |
密钥索引不支持 |
6A 82 |
文件未找到 |
94 02 |
MAC验证不成功 |
代码 |
值 |
CLA |
80 |
INS |
5C |
P1 |
00 |
P2 |
02 |
Lc |
不存在 |
Data |
不存在 |
Le |
04 |
说明 |
长度(字节) |
EP余额 |
4 |
SW1 SW2 |
意义 |
6B 00 |
参数P1 P2错误 |
6E 00 |
CLA错误 |
6A 82 |
文件未找到 |
代码 |
值 |
|
CLA |
00 |
|
INS |
60 |
|
P1 |
00 |
|
P2 |
00 |
|
Lc |
0x18(24) |
|
Data |
密钥 |
16个字节 |
输入的数据 |
8个字节 |
|
Le |
08 |
说明 |
长度(字节) |
过程密钥 |
8 |
SW1 SW2 |
意义 |
6B 00 |
参数P1 P2错误 |
6E 00 |
CLA错误 |
67 00 |
长度错误 |
代码 |
值 |
|
CLA |
00 |
|
INS |
62 |
|
P1 |
00 |
|
P2 |
00 |
|
Lc |
0x09 ~ n |
|
Data |
密钥 |
8个字节 |
输入的数据 |
1~n个字节 |
|
Le |
04 |
说明 |
长度(字节) |
MAC |
4 |
SW1 SW2 |
意义 |
6B 00 |
参数P1 P2错误 |
6E 00 |
CLA错误 |