金融行业密钥基础知识 下载本文

金融行业密钥基础知识

1 密钥管理

SJL05金融数据加密机采用三级密钥管理方法(遵循ANSI X9.17标准),其密钥层次如下图:

êy?Y?ü????óò?÷?ü????±?μ??÷?ü??

图1.1 密钥层次

1.1 各种密钥在密钥层次中的作用

1.1.1 本地主密钥(Local Master Key)

又称主机主密钥(Master Key),主要用来保护它下一级的区域主密钥(Zone Master Key)(银行主密钥(Bank Master Key)、终端主密钥(Terminal Master Key))。当区域主密钥需要导出或保存到加密机以外时,通常需要用本地主密钥(或衍生的密钥对)加密区域主密钥。这一点在RACAL系列的加密机中有最好的体现,在RACAL加密机中,区域主密钥都由主机主密钥加密存放于主机数据库中,加密机不保存区域主密钥。

1.1.2 区域主密钥

主要有两种,一种是金卡中心与成员行之间的传输密钥(通常称

为银行主密钥),另一种是成员行主机与ATM或POS之间的传输密钥(通常称为终端主密钥)。它主要用来加密下一层次的数据密钥(如:PIK、MAK)。

1.1.3 数据加密密钥(Date Encrypt Key)

又称工作密钥(Working Key),是最终用于加密传输数据的密钥,其上层两种密钥可以称为密钥加密/交换密钥(Key Encrypt/Exchange Key,简称KEK)。数据密钥一般分为两种,一种是用来加密PIN的密钥称为PIK(Pin Key),另一种是用来计算MAC的密钥称为MAK(Mac Key)。

1.2 各种密钥的注入与分发

1.2.1 本地主密钥

通常由各成员行(或下属机构)采用加密机前面板上的键盘或直接通过IC卡注入到加密机中,各成员行的本地主密钥各不相同。一般本地主密钥的注入都由成员行的三位高层领导注入,三人分别保存一部分密钥(密钥分量Component),三部分密钥可以在加密机中以一定的算法(异或)合成为最终的本地主密钥(或通过衍生(Derive)生成密钥对)。本地主密钥在注入加密机时通过IC卡进行备份,当加密机密钥丢失时可用IC卡来恢复。

1.2.2 区域主密钥(银行主密钥)

一般由上级机构(金卡中心)产生并分发。上级机构(金卡中心)产生并保存下属机构(各成员行)的区域主密钥(银行主密钥),同时将密码分量的明文或IC卡的形式将区域主密钥(银行主密钥)下发给下属机构(各成员行)。下属机构(成员行)将密钥分量注入到加密机内,如果区域主密钥(银行主密钥)是保存到本机构的主机数

据库中,则将区域主密钥(银行主密钥)注入到加密机后,加密机显示本地主密钥加密的区域主密钥(银行主密钥)密文,由银行工作人员将其录入主机数据库。银行主密钥通常由两人注入,各自保存一部分。

区域主密钥中的终端主密钥由各成员行自己注入到加密机中,同时下装到ATM和POS中,由于各成员行的ATM和POS数量都较大,一般是所有ATM和POS共用一个终端主密钥或是一组ATM和POS共用一个终端主密钥。

1.2.3 数据密钥

分为两种,一般不在加密机中保存。一种是金卡中心与成员行之间的数据密钥,一种是成员行主机与ATM或POS之间的数据密钥。前一种数据密钥可以由金卡中心主动向下分发,也可以由成员行主动向上申请。数据密钥在传输过程中由金卡中心与成员行之间共享的银行主密钥加密,成员行接收到数据密钥后都需要验证其正确性后才会启用新的数据密钥。后一种数据密钥每天由ATM或POS签到申请,由加密机随机产生,并由终端主密钥加密传送。

金卡中心与成员行及其终端(ATM、POS)之间的密钥关系如下图:

BMK 金卡中心HSM

(PIK1)BMK (MAK1)BMK BMK TMK

(DATA)PIK1、MAK1

成员行HSM (PIK2)TMK (MAK2)TMK (DATA)PIK2、MAK2

TMK

终端

图6.2 金卡中心、成员行、终端之间密钥关系示意 图6.2中各符号的含义如下: BMK:银行主密钥 TMK:终端主密钥

PIK1:金卡中心与成员行之间的PIK MAK1:金卡中心与成员行之间的MAK PIK2:成员行与终端(ATM、POS)之间的PIK MAK2:成员行与终端(ATM、POS)之间的MAK DATA:传输的数据

(PIK1)BMK:被BMK加密的PIK1

2 术语解释

2.1 本地主密钥

LMK:Local Master Key,本地主密钥,又称为文件主密钥(MDS)、加密机主密钥、主机主密钥,在密钥体系中处于最上层,以明文存储在加密机中,加密保护存储在加密机外的其它密钥。LMK一般为双长度密钥,也有三倍长度密钥。

2.2 区域主密钥

ZMK:Zone Master Key,区域主密钥,在RACAL加密机中,指主机与主机间的传输主密钥。在密钥体系中处于中间层,可以通过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间的传输主密钥,在密钥体系中处于中间层,可以通过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:Terminal Pin Key,终端PIN密钥,PIK的一种,专指主机与终端间的PIK。

MAK:Mac Key,Mac密钥,专用于计算MAC的工作密钥,在密钥体系中处于最下层,一般通过LMK和ZMK/TMK加密后存储在数据库中,也有直接存储在加密机中的,密钥长度有单长度、双倍长度和三倍长度。在MDS中,当采用动态密钥时,PIK每12小时或每2500笔交易就必须更换一次(两个条件满足任何一个时更换)

ZAK:Zone Authenticate Key,区域认证密钥,MAK的一种,专指主机与主机间的MAK。

TAK:Terminal Authenticate Key,终端认证密钥,MAK的一种,专指主机与终端间的MAK。

DEK:Data Encrypt Key,数据加密密钥,专用于加密数据的密钥,在密钥体系中处于最下层,一般通过LMK和ZMK/TMK加密后存储在数据库中,也有直接存储在加密机中的,密钥长度有单长度、双倍长度和三倍长度。在MDS中,当采用动态密钥时,PIK每12小时或每2500笔交易就必须更换一次(两个条件满足任何一个时更换)

ZEK:Zone Encrypt Key,区域加密密钥,见DEK,专指主机与主机间的数据加密密钥。

TEK:Terminal Encrypt Key,终端加密密钥,见DEK,专指主机与终端间的数据加密密钥。

CVK:Card Verification Key,卡校验密钥,专用于校验卡真伪的工作密钥,在密钥体系中处于最下层,一般通过LMK加密后存储在数据库中,也有直接存储在加密机中,密钥由两个单长度密钥组成,分别称为CVKA和CVKB,合起来叫CVK pairs,CVK一般数据年更新一次。

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,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, 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,过程密钥/会话密钥,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的管理与安全; ANSI X9.17 密钥管理;

ANSI X9.19 零售金融信息的鉴别; 中国人民银行金融IC卡规范PBOC; VISA及MASTER对硬件加密机的相关需求。

3 算法介绍

3.1 简述

金融数据加密机中主要用到的算法为对称算法,具体如下:

1) DES算法 2) 3DES算法 3) 金融专用算法 4) Double-one-way

5) Secure Calculation(安全计算) 6) 密钥分散算法 7) MAC算法 8) TAC算法

9) 密钥校验值(CheckValue)

在以下说明中,有如下简称: u8 ―― unsigned char

3.2 算法描述

DES算法 函数原型:

void des_64by64(u8 in[8], u8 out[8], u8 k[8], int op) 3DES算法 函数原型:

void des_64by128(u8 in[8], u8 out[8], u8 k[16], int op) void des_64by192(u8 in[8], u8 out[8], u8 k[24], int op) void des_128by128(u8 in[16], u8 out[16], u8 k[16], int op) void des_128by192(u8 in[16], u8 out[16], u8 k[24], int op)

void des_192by128(u8 in[24], u8 out[24], u8 k[16], int op) void des_192by192(u8 in[24], u8 out[24], u8 k[24], int op)

计算过程:

3DES算法中,如果使用双长度(16字节)密钥K=(KL||KR),将8字节明文数据块加密成密文数据块,如下所示:

Y = DES(KL)[DES-1(KR)[DES(KL[X])]]

解密的方式如下:

X =DES-1 (KL)[DES(KR)[ DES-1 (KL[Y])]]

注意:DES为加密, DES-1为解密

金融专用算法 函数原型:

void sms_64by64(u8 in[8], u8 out[8], u8 k[8], int op) void sms_128by128(u8 in[16], u8 out[16], u8 k[16], int op) void sms_64by128(u8 in[8], u8 out[8], u8 k[16], int op) Double-one-way 函数原型:

void double_one_way(u8 in[8], u8 out[8], u8 key[16])

Double-one-way是计算临时密钥算法的一种,用于双字节的密钥分散单字节的临时密钥,过程如下:(设MK的左半部份为LK,右半部分为RK) 1)用LK对输入数据解密 2)用RK对第1步结果加密 3)用LK对第2步结果解密 4)第3步结果与输入数据异或

密钥分散算法 函数原型:

void deduce_session_key(u8 in[8], u8 out[8], u8 k[16])

void deduce_sub_key(u8 *data, u8 dpk[16], u8 mpk[16], int times) void deduce_sub_key_single(u8 *data, u8 dpk[8], u8 mpk[8], int times)

简称Diversify,是指将一个双长度的密钥MK,对分散数据进行处理,推导出一个双长度的密钥DK。 推导DK左半部分的方法是:

1) 将分散数据的最右16个数字作为输入数据; 2) 将MK作为加密密钥;

3) 用MK对输入数据进行3DES运算;

推导DK右半部分的方法是:

1) 将分散数据的最右16个数字求反,作为输入数据; 2) 将MK作为加密密钥;

3) 用MK对输入数据进行3DES运算。

Secure Calculation(安全计算) 函数原型:

void secure_calculate(u8 in[24], u8 out[8], u8 k[8])

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, int *iolen, u8 key[8], int op)

当明文数据需要加密时,它首先要被格式化为以下形式的数据块:

——明文数据的长度,不包括填充字符(LD) ——明文数据 ——填充字符

数据加密技术如下所述:

1. 用LD表示明文数据的长度,在明文数据前加上LD产生新的数据块。

2. 将第一步中生成的数据块分解成8字节数据块,标号为D1,D2,等等。最后一个数据块长度有可能不足8。

3. 如果最后(或唯一)的数据块长度等于8字节,转入第四步;如果不足8字节,在右边添十六进制数字'80'。如果长度已达8字节,转入第四步;否则,在其右边添加1字节16进制'0'直到长度达到8字节。

4. 采用标准方法加密。

5. 计算结束后,所有加密后的数据块按原顺序连接在一起。

MAC算法

由于不同业务的需求,根据相应的规范,对于计算MAC的方式也有不同。 1. 计算磁条卡业务中MAC的方式。 函数原型:

int gen_mcard_mac(u8 *in, u8 out[8], u8 ivec[8], u8 k[8], int len) int gen_mcard_mac_919(u8 *in, u8 out[8], u8 ivec[8], u8 k[24], int len)

int gen_mcard_mac_xor(u8 *in, u8 out[8], u8 k[8], int len) int gen_mac_ext(u8 *in, u8 *out, u8 *key, int len)

? gen_mcard_mac算法过程如下:

1) 检查MAC数据是否为8的整数倍。如果不是,则添加0x00,直到

8的倍数;

2) 用密钥对第一步的数据进行Cbc加密; 3) 取第二步运算结果的最后8字节作为MAC。

? gen_mcard_mac_919算法过程如下:(密钥必须为192位)

1) 检查MAC数据是否为8的整数倍。如果不是,则添加0x00,直到

8的倍数;

2) 用密钥的前8字节对第一步的数据进行Cbc加密;

3) 用密钥的中间8字节对第二步的运算结果的最后8字节进行ecb解

密;

4) 用密钥的后8字节对第三步的运算结果进行ecb加密,运算的结果

作为MAC。

? gen_mcard_mac_xor算法过程如下:

1) 检查MAC数据是否为8的整数倍。如果不是,则添加0x00,直到

8的倍数;

2) 将第一步计算的数据按8字节分成若干段,每段依次异或,最终得

到8字节的数据;

3) 用密钥对第二步的结果进行ecb加密,将结果作为MAC。

? gen_mac_ext算法过程如下: 与gen_mcard_mac_xor算法过程一致。

2. 计算IC卡业务中MAC的方式

? 单倍长密钥

int gen_icard_mac(u8 *in, u8 out[8], u8 ivec[8], u8 k[8], int len)

int gen_icard_mac_8(u8 *in, u8 out[8], u8 ivec[8], u8 k[8], int len)

gen_icard_mac的计算过程如下:

1) 检查MAC数据是否为8的整数倍。如果不是,返回错误; 2) 用密钥对MAC数据采用CBC的方式加密; 3) 将运算结果的后8字节作为MAC。

gen_icard_mac_8的计算过程如下:

1) 检查MAC数据是否为8的整数倍。如果不是,则添加0x80,如果

还不够8的倍数,则添加0x00,并直到8的倍数为止;如果是8的倍数,则添加一个0x80,七个0x00; 2) 用密钥对第一步的数据进行Cbc加密; 3) 取第二步运算结果的最后8字节作为MAC。

? 双倍长计算MAC

int gen_icard_mac_16(u8 *in, u8 out[8], u8 ivec[8], u8 k[16], int len)

gen_icard_mac_16的计算过程如下:

1) 检查MAC数据是否为8的整数倍。如果不是,则添加0x80,如果

还不够8的倍数,则添加0x00,并直到8的倍数为止;如果是8的倍数,则添加一个0x80,七个0x00; 2) 用密钥前8字节对第一步的数据进行Cbc加密;

3) 用密钥的后8字节对第二步的结果的后8字节进行ecb解密; 4) 用密钥的前8字节对第三步的结果进行ecb加密,并将结果作为

MAC。

TAC算法 函数原型:

int gen_icard_tac(u8 *in, u8 out[8], u8 ivec[8], u8 k[16], int len)

int gen_icard_tac_NP(u8 *in, u8 out[8], u8 ivec[8], u8 k[16], int len)

gen_icard_tac的计算过程如下:

1) 检查MAC数据是否为8的整数倍。如果不是,则添加0x80,如果

还不够8的倍数,则添加0x00,并直到8的倍数为止;如果是8的倍数,则添加一个0x80,七个0x00; 2) 将密钥的前8字节与后8字节相互异或;

3) 用第二步的结果作为密钥对第一步的结果进行cbc加密; 4) 将第三步结果的后8字节作为MAC。

gen_icard_tac_NP的计算过程如下:

1) 检查MAC数据是否为8的整数倍。如果不是,返回错误; 2) 将密钥的前8字节与后8字节相互异或;

3) 用第二步的结果作为密钥对第一步的结果进行cbc加密; 4) 将第三步结果的后8字节作为MAC。

密钥校验值(CheckValue)

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 数据源。

? 双倍长计算MAC

计算CVN2时使用二个64位的验证密钥,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)从左至右将加密结果中的数字(0-9)抽出,组成一组数字;

(8)从左至右将加密结果中的字符(A-F)抽出,减10后将余数组成一组数字,排列在步骤(7)的数字之后;

(9)步骤(8)的左边第一组三位数即为CVN2值。