外部认证
在GAC命令时,当返回ARQC时都会返回8个字节的密文数据,这8个字节的密文数据计算过程如下:
第一. 三种秘钥
在卡片内至少得存如下三种秘钥,其中应用密文主密钥简称ENC,安全报文认证秘钥简称MAC,安全报文加密秘钥简称DEK,其用途见下表1所示:
表1.秘钥及用途
密钥类型 |
用途 |
长度 |
应用密文主密钥 |
产生IC卡应用密文子密钥,用于应用密文的产生和验证 |
16字节 |
安全报文认证(MAC)密钥 |
产生IC卡MAC子密钥,用于安全报文鉴别码的产生和验证 |
16字节 |
安全报文加密密钥 |
产生IC卡加密子密钥,用于加密解密安全报文 |
16字节 |
发卡行主密钥可以分散出IC卡子密钥,在交易过程中从子密钥派生出相应的过程密钥,其中MAC密钥用来产生报文的鉴别码(MAC),用于安全报文命令,如数据安全更新、发卡行脚本等,加密密钥用来加密安全报文,AC密钥用来对TC、ARQC、AAC、ARPC进行加密计算。
第二. 子秘钥的产生过程
子秘钥的产生是用发卡行主密钥IMK对应用主账号(PAN)这一方式以主账号(PAN)和主账号序列号(如果主账号序列号不存在,则用一个字节“00”代替)的最右16个数字作为输入数据,以及16字节的发卡行主密钥IMK作为输入,生成16字节的IC卡子密钥MK作为输出:
2.1. 如果主账号和主账号序列号X的长度小于16个数字,X右对齐,在最左端填充十六进制的“0”以获得8字
节的Y。如果X的长度至少有16个数字,那么Y由X的最右边的16个数字组成。
2.2. 计算2个8字节的数字
需要特别注意的是,这些DES秘钥必须确保经过了奇校验。
第三. 过程秘钥的产生
分散因子是这样产生的,获取当前交易的ATC,这个ATC一般在GAC1命令后返回,在其昨天补6个字节的0X00作为分散因子的左半部分,将ATC与0XFFFF进行异或后在前边补足6个字节的0x00凑足8个字节作为分散因子的右半部分。采用子秘钥对这16个字节的分散因子进行加密得出过程秘钥。
第四. 密文的计算与验证
密文的计算需要如下数据:
值 |
来源 |
授权金额(数字) |
终端 |
其它金额(数字) |
终端 |
终端国家代码 |
终端 |
终端验证结果 |
终端 |
交易货币代码 |
终端 |
交易日期 |
终端 |
交易类型 |
终端 |
不可预知数 |
终端 |
应用交互特征 |
IC卡 |
应用交易计数器 |
IC卡 |
使用过程秘钥对以上数据进行CBC 三重MAC计算即可得出8个字节的密文(其实是MAC值)。将计算出的密文同卡片在GAC1返回的密文进行对比,如果相同则进入下一步,否则返回
第五.联机密文
在联机过程中,发卡行会返回两个字节的授权响应码,在这两个授权响应码的后边补足6个字节的0X00凑足8个字节,将这8个字节与GAC1返回的应用密文进行一对一的亦或运算。
使用过程秘钥对亦或结果进行加密得出ARPC
第五. 发送外部认证命令
外部认证命令的格式为 00 82 00 00 0a 其中10个字节的数据域为8个字节的ARPC和两个字节的授权响应码,这里的授权响应码不是终端在终端行为分析中得到的授权响应码而是在联机过程中,发卡行发送的授权响应码。如果卡片返回0x9000则表示外部认证通过。