1、一种是金卡中心与成员行之间的数据密钥,一种是成员行主机与ATM或POS之间的数据密钥。前一种数据密钥可以由金卡中心主动向下分发,也可以由成员行主动向上申请。数据密钥在传输过程中由金卡中心与成员行之间共享的银行主密钥加密,成员行接收到数据密钥后都需要验证其正确性后才会启用新的数据密钥。后一种数据密钥每天由ATM或POS签到申请,由加密机随机产生,并由终端主密钥加密传送。金卡中心与成员行及其终端(ATM、POS)之间的密钥关系如下图:(DATA)PIK2、MAK2图6.2 金卡中心、成员行、终端之间密钥关系示意图6.2中各符号的含义如下:BMK:银行主密钥TMK:终端主密钥PIK1:金卡中心与成员
2、行之间的PIKMAK1:金卡中心与成员行之间的MAKPIK2:成员行与终端(ATM、POS)之间的PIKMAK2:成员行与终端(ATM、POS)之间的MAKDATA:传输的数据 (PIK1)BMK:被BMK加密的PIK12 术语解释2.1 本地主密钥LMK:Local Master Key,本地主密钥,又称为文件主密钥(MDS)、加密机主密钥、主机主密钥,在密钥体系中处于最上层,以明文存储在加密机中,加密保护存储在加密机外的其它密钥。LMK一般为双长度密钥,也有三倍长度密钥。2.2 区域主密钥ZMK:Zone Master Key,区域主密钥,在RACAL加密机中,指主机与主机间的传输主密钥。
3、在密钥体系中处于中间层,可以通过LMK加密后存储在主机数据库中,也可直接存储在加密机中,一般为双长度,也有单长度和三倍长度密钥。用于主机间动态分发工作密钥时对其进行加密保护BMK:Bank Master Key,银行主密钥,同ZMK,多用于金卡联网,在金卡联网中,有时POS和银行主机之间也使用BMK。MMK:Member Master Key,成员行主密钥,同ZMK。多用于金卡联网SMK:Shared Master Key,共享主密钥,同ZMK.2.3 数据加密密钥TMK:Terminal Master Key,终端主密钥,在RACAL加密机中,指主机与终端ATM/POS间的传输主密钥,在密钥
4、体系中处于中间层,可以通过LMK加密后存储在主机数据库中,也可直接存储在加密机中,现在一般为单长度,也有双长度和三倍长度。PIK:PIn Key,PIN密钥,专用于加密保护PIN的工作密钥,在密钥体系中处于最下层,一般通过LMK和ZMK/TMK加密后存储在数据库中,也有直接存储在加密机中的,密钥长度有单长度、双倍长度和三倍长度。在MDS中,当采用动态密钥时,PIK每12小时或每2500笔交易就必须更换一次(两个条件满足任何一个时更换)PEK:Pin Encrypt Key,PIN加密密钥,同PIK。ZPK:Zone Pin Key,区域PIN密钥,PIK的一种,专指主机与主机间的PIK。TPK
5、:Terminal Pin Key,终端PIN密钥,PIK的一种,专指主机与终端间的PIK。MAK:Mac Key,Mac密钥,专用于计算MAC的工作密钥,在密钥体系中处于最下层,一般通过LMK和ZMK/TMK加密后存储在数据库中,也有直接存储在加密机中的,密钥长度有单长度、双倍长度和三倍长度。ZAK:Zone Authenticate Key,区域认证密钥,MAK的一种,专指主机与主机间的MAK。TAK:Terminal Authenticate Key,终端认证密钥,MAK的一种,专指主机与终端间的MAK。DEK:Data Encrypt Key,数据加密密钥,专用于加密数据的密钥,在密钥
6、体系中处于最下层,一般通过LMK和ZMK/TMK加密后存储在数据库中,也有直接存储在加密机中的,密钥长度有单长度、双倍长度和三倍长度。ZEK:Zone Encrypt Key,区域加密密钥,见DEK,专指主机与主机间的数据加密密钥。TEK:Terminal Encrypt Key,终端加密密钥,见DEK,专指主机与终端间的数据加密密钥。CVK:Card Verification Key,卡校验密钥,专用于校验卡真伪的工作密钥,在密钥体系中处于最下层,一般通过LMK加密后存储在数据库中,也有直接存储在加密机中,密钥由两个单长度密钥组成,分别称为CVKA和CVKB,合起来叫CVK pairs,CV
7、K一般数据年更新一次。PVK:Pin Verification Key,PIN校验密钥,专指用于计算PVV的工作密钥,在密钥体系中处于最下层,一般通过LMK加密后存储在数据库中,也有直接存储在加密机中,密钥由两个单长度密钥组成,分别称为PVKA和PVKB,合起来叫PVK pairs,CVK一般数据年更新一次。PIN:Personal Identify Number,个人识别码,即卡密码,在ANSI9.8标准中,规定为同4-12位0-9的数字组成,在中国一般采用4位或6位PIN。PINBlock:PIN块,指将PIN按指定格式生成的64位数据。PVV:Pin Verification Value
8、,PIN校验值,是指当采用ABA算法校验PIN时,用PVK对PIN、主帐号等信息加密生成的4位数字的校验值。PAN:Private Account Number,主帐号,即卡号或帐号。CVV:Card Verification Value,卡校验值,是指用CVK对卡号、服务码、卡有效期进行加密生成的用来校验卡的合法性的3位数字的校验值。CVC:Card Verification Code,卡校验码,同CVV,用于VISA。CVV1:Card Verifycation Value 1,CVV的一种,与CVV2相比,计算参数中服务码不同。CVV2:Card Verifycation Value 2
9、, CVV的一种,与CVV1相比,计算参数中服务码不同。ICVV:ICard Verification Value,VISA中用于IC卡的仿磁卡业务中,与CVV计算方法同,其服务代码为999。MAC:Message Authentication Code,消息认证码,用于鉴别数据真实性的加密结果,按要求MAC由32-64位数据 (8-16个16进制字符)组成。TAC:Transaction Authentication Code,交易认证码,在IC卡中用于验证交易正确性。MK:Master Key,主密钥,IC卡业务中的各级应用主密钥。2.4 IC卡业务密钥SK:Session Key,过程密
10、钥/会话密钥,IC卡业务中用主密钥对过程数据(Session Data)进行3DES加密或其它方式处理得到的单长度或双长度密钥,用于计算MAC或加密数据。HSMK1:主密钥一,SJL05金卡版本的IC卡密钥区中,保留的加密机主密钥。HSMK2:主密钥二,SJL05金卡版本的IC卡密钥区中,用于存储或读取次主密钥时对其进行加密保护。SHSMK:次主密钥,SJL05金卡版本的IC卡密钥区中,对应存储IC卡业务的各级应用主密钥,也可用于存储IC卡传输主密钥。2.5 密钥管理体系2.6 涉及的国家(际)标准ANSI X3.92 数据加密算法;ANSI X9.9 信息鉴别;ANSI X9.8 PIN的管
11、理与安全;ANSI X9.17 密钥管理;ANSI X9.19 零售金融信息的鉴别;中国人民银行金融IC卡规范PBOC;VISA及MASTER对硬件加密机的相关需求。3 算法介绍3.1 简述金融数据加密机中主要用到的算法为对称算法,具体如下:1) DES算法2) 3DES算法3) 金融专用算法4) Double-one-way5) Secure Calculation(安全计算)6) 密钥分散算法7) MAC算法8) TAC算法9) 密钥校验值(CheckValue)在以下说明中,有如下简称:u8 unsigned char 3.2 算法描述DES算法函数原型:void des_64by64(
12、u8 in8, u8 out8, u8 k8, int op)3DES算法void des_64by128(u8 in8, u8 out8, u8 k16, int op)void des_64by192(u8 in8, u8 out8, u8 k24, int op)void des_128by128(u8 in16, u8 out16, u8 k16, int op)void des_128by192(u8 in16, u8 out16, u8 k24, int op)void des_192by128(u8 in24, u8 out24, u8 k16, int op)void des_
13、192by192(u8 in24, u8 out24, u8 k24, int op)计算过程:3DES算法中,如果使用双长度(16字节)密钥K(KL|KR),将8字节明文数据块加密成密文数据块,如下所示:Y DES(KL)DES-1(KR)DES(KLX) 解密的方式如下:X DES-1 (KL)DES(KR) DES-1 (KLY)注意:DES为加密, DES-1为解密金融专用算法void sms_64by64(u8 in8, u8 out8, u8 k8, int op)void sms_128by128(u8 in16, u8 out16, u8 k16, int op)void sm
14、s_64by128(u8 in8, u8 out8, u8 k16, int op)Double-one-wayvoid double_one_way(u8 in8, u8 out8, u8 key16) Double-one-way是计算临时密钥算法的一种,用于双字节的密钥分散单字节的临时密钥,过程如下:(设MK的左半部份为LK,右半部分为RK) 1)用LK对输入数据解密 2)用RK对第1步结果加密 3)用LK对第2步结果解密 4)第3步结果与输入数据异或密钥分散算法void deduce_session_key(u8 in8, u8 out8, u8 k16)void deduce_sub
15、_key(u8 *data, u8 dpk16, u8 mpk16, int times)void deduce_sub_key_single(u8 *data, u8 dpk8, u8 mpk8, int times) 简称Diversify,是指将一个双长度的密钥MK,对分散数据进行处理,推导出一个双长度的密钥DK。 推导DK左半部分的方法是:1) 将分散数据的最右16个数字作为输入数据;2) 将MK作为加密密钥;3) 用MK对输入数据进行3DES运算;推导DK右半部分的方法是:1) 将分散数据的最右16个数字求反,作为输入数据;3) 用MK对输入数据进行3DES运算。Secure Cal
16、culation(安全计算)void secure_calculate(u8 in24, u8 out8, u8 k8)Secure Calculation是对数据运算的一种方法,当主密钥分散出子密钥,子密钥导出临时密钥后对输入的24字节数据运算的方法。过程如下:(设输入的24字节数据从左到右分为Data1,Data2,Data3)1) 用KEY对Data3进行DES加密;2) 用第1步的运算结果做为KEY对Data1解密;3) 用第2步运算结果与Data2异或;4) 用第3步运算结果作为KEY对第1步的运算结果解密。数据加密计算int do_icard_des(u8 *in, u8 *out
17、, int *iolen, u8 key8, int op) 当明文数据需要加密时,它首先要被格式化为以下形式的数据块: 明文数据的长度,不包括填充字符(LD) 明文数据 填充字符 数据加密技术如下所述:1. 用LD表示明文数据的长度,在明文数据前加上LD产生新的数据块。2. 将第一步中生成的数据块分解成8字节数据块,标号为D1,D2,等等。最后一个数据块长度有可能不足8。3. 如果最后(或唯一)的数据块长度等于8字节,转入第四步;如果不足8字节,在右边添十六进制数字80。如果长度已达8字节,转入第四步;否则,在其右边添加1字节16进制0直到长度达到8字节。4. 采用标准方法加密。5. 计算结
18、束后,所有加密后的数据块按原顺序连接在一起。MAC算法由于不同业务的需求,根据相应的规范,对于计算MAC的方式也有不同。1. 计算磁条卡业务中MAC的方式。int gen_mcard_mac(u8 *in, u8 out8, u8 ivec8, u8 k8, int len)int gen_mcard_mac_919(u8 *in, u8 out8, u8 ivec8, u8 k24, int len)int gen_mcard_mac_xor(u8 *in, u8 out8, u8 k8, int len)int gen_mac_ext(u8 *in, u8 *out, u8 *key, i
19、nt len) gen_mcard_mac算法过程如下:1) 检查MAC数据是否为8的整数倍。如果不是,则添加0x00,直到8的倍数;2) 用密钥对第一步的数据进行Cbc加密;3) 取第二步运算结果的最后8字节作为MAC。 gen_mcard_mac_919算法过程如下:(密钥必须为192位)4) 检查MAC数据是否为8的整数倍。5) 用密钥的前8字节对第一步的数据进行Cbc加密;6) 用密钥的中间8字节对第二步的运算结果的最后8字节进行ecb解密;7) 用密钥的后8字节对第三步的运算结果进行ecb加密,运算的结果作为MAC。 gen_mcard_mac_xor算法过程如下:8) 检查MAC数
20、据是否为8的整数倍。9) 将第一步计算的数据按8字节分成若干段,每段依次异或,最终得到8字节的数据;10) 用密钥对第二步的结果进行ecb加密,将结果作为MAC。 gen_mac_ext算法过程如下:与gen_mcard_mac_xor算法过程一致。2. 计算IC卡业务中MAC的方式 单倍长密钥int gen_icard_mac(u8 *in, u8 out8, u8 ivec8, u8 k8, int len)int gen_icard_mac_8(u8 *in, u8 out8, u8 ivec8, u8 k8, int len)gen_icard_mac的计算过程如下:11) 检查MAC
21、数据是否为8的整数倍。如果不是,返回错误;12) 用密钥对MAC数据采用CBC的方式加密;13) 将运算结果的后8字节作为MAC。gen_icard_mac_8的计算过程如下:如果不是,则添加0x80,如果还不够8的倍数,则添加0x00,并直到8的倍数为止;如果是8的倍数,则添加一个0x80,七个0x00; 双倍长计算MACint gen_icard_mac_16(u8 *in, u8 out8, u8 ivec8, u8 k16, int len)gen_icard_mac_16的计算过程如下:2) 用密钥前8字节对第一步的数据进行Cbc加密;3) 用密钥的后8字节对第二步的结果的后8字节进
22、行ecb解密;4) 用密钥的前8字节对第三步的结果进行ecb加密,并将结果作为MAC。TAC算法int gen_icard_tac(u8 *in, u8 out8, u8 ivec8, u8 k16, int len)int gen_icard_tac_NP(u8 *in, u8 out8, u8 ivec8, u8 k16, int len)gen_icard_tac的计算过程如下:2) 将密钥的前8字节与后8字节相互异或;3) 用第二步的结果作为密钥对第一步的结果进行cbc加密;4) 将第三步结果的后8字节作为MAC。gen_icard_tac_NP的计算过程如下:密钥校验值(CheckV
23、alue)void gen_check_value(u8 *in, u8 *out, u16 keylen)密钥的CheckValue指密钥对8Byte的”00”加密结果(可能只取几个字节)1. 用密钥(*in)对8字节的全0加密;2. 将加密机的结果作为校验值(CheckValue)。CVV CVN2 计算数据源计算CVN2的数据源包括:主账号(PAN)卡失效期(格式为YYMM,无卡失效期的借记卡可采用0000)常数000(等同于计算CVN 时的数据元素-服务代码)示例 : 19 位PAN、4 位卡失效期和3 位长常数“000”组成26 个字符CVN2 数据源。计算CVN2时使用二个64位的
24、验证密钥,KeyA和KeyB。计算步骤如下:(1)将数据源扩展成128位二进制数据(不足128位右补二进制0);(2) 将128位二进制数据分成两个64位的数据块。最左边的64位为Block1,最右边的64位为Block2;(3)使用KeyA对Block1进行加密;(4)将Block1的加密结果与Block2进行异或。使用KeyA对异或结果进行加密;(5)使用KeyB对加密结果进行解密;(6)使用KeyA对解密结果进行加密;(7)从左至右将加密结果中的数字(09)抽出,组成一组数字;(8)从左至右将加密结果中的字符(AF)抽出,减10后将余数组成一组数字,排列在步骤(7)的数字之后;(9)步骤(8)的左边第一组三位数即为CVN2值。