杨元原博士国密课堂 · 第三期 | 商用密码应用安全性评估:IPSec VPN协议的原理和测评验证(一)
本期主讲人
杨元原 博士 国家网络与信息系统安全产品质量监督检验中心(公安部第三研究所)商用密码应用安全性评估负责人。
IP数据包本身并不提供任何安全特性。很容易伪造出IP包的地址、修改其内容、重播以前的包以及在传输途中拦截并查看包的内容。IPSec提供了一种标准的、健壮的机制,可为IP及上层协议(如UDP和TCP)提供数据机密性、完整性、真实性等安全保证。
本文首先介绍了协议、密码协议等概念,之后基于密码国家标准和行业标准对IPSec VPN协议的技术规范进行了说明,并通过实际案例,说明了IPSec VPN协议测评验证方法。
密码协议的基本概念
所谓协议,就是两个或两个以上的参与者为完成某项特定的任务而采取的一系列步骤。包含以下三层含义:
1)协议自始至终是有序的过程,每一个步骤 必须依次执行,在前一步没有执行完之前,后面的步骤不能执行;
2)协议至少需要两个参与者;
3)通过执行协议必须能够完成某项任务。
协议运行前,协议中的每个参与者都必须预先拥有或知道运行协议所需的资源,都必须预先知道所要完成的协议步骤,并同意遵守它。协议本身必须被明确定义,不能产生歧义,并且必须是完整的,对每种可能的情况都必须规定具体的动作。
密码协议又叫做安全协议,它以密码算法为基础,运行在网络或分布式系统中、借助于密码算法为有安全需求的各方提供一系列步骤,以达到身份鉴别、密钥分配、信息传输保护等目的。
密码协议按照其完成的功能可以分成以下三类:
1)身份认证协议:在密码协议中,认证是最基本的安全服务,是信息安全的基础。密码协议的认证过程包括标识和验证两个步骤,标识是指主体对自己的身份进行声明的过程,而验证是指通信的另一方对主体声明的身份进行验证的过程。当某个主体声称自己的身份时,认证服务应保证通信的另一方声称身份的真实性。
2)密钥交换协议:密钥交换协议是指在参与协议的两个或者多个主体之间建立一个共享的密钥的协议,这种密钥通常都是临时性的,只用于一次会话,在新的会话中共享的密钥都会被更新。通常使用基于公钥的算法来实现密钥交换协议。
3)认证和密钥交换协议:认证和密钥交换协议是指将认证和密钥交换结合在一起,能够同时实现身份认证和密钥交换两种功能的协议。它是网络通信中应用范围最广,也最普遍的密码协议。在认证和密钥交换协议中,通信主体首先运用协议的认证功能对另一端主体的身份进行认证,如果认证成功,再通过密钥交换功能协商出通信使用的会话密钥。
密码协议的主要目的在于通过消息的传递来实现某种安全需求,这些安全需求也被称为安全特性,包括机密性、认证性、完整性、不可否认性、新鲜性等等。简单地说,密码协议的目的就是确保这些安全特性在协议执行完毕时能够得以实现。下面列出了密码协议的几种安全特性:
1)机密性:机密性的目的是保护敏感信息不泄露给非授权用户。即使攻击者能够截获含有敏感信息的消息,他也无法得到其中的敏感信息。保证协议机密性最直接的办法就是对消息进行加密。
2)认证性:认证性用来抵抗身份假冒攻击,确保通信另一方主体身份的真实性。在认证协议中,当某一成员(声称者)提交一个主体身份并声称他是那个主体时,另一方需要运用协议的认证功能证明该身份就是其声称的身份。
3)完整性:完整性的目的是保护协议消息不被非法篡改、删除和替代。最常用的办法是电子信封、数字签名、消息认证码等;
4)不可否认性:不可否认性指通信主体能够提供另外某个主体与其进行协议通信的证明,以保证自身合法利益不受侵害。不可否认性要求协议的主体必须对自己的行为负责,不能进行事后否认;
5)新鲜性:新鲜性用来保证消息的实时性,即保证该消息不是上次或者之前用过的消息,新鲜性通常用随机数或时间戳来实现。
IPSec VPN协议
VPN(Virtual Private Network)即虚拟专用网,用于在公用网络上构建私人专用虚拟网络,并在此虚拟网络中传输重要数据。
VPN具有以下两个基本特征:
1)专用(Private):VPN网络是专供VPN用户使用的网络,对于VPN用户,使用VPN与使用传统专网没有区别。VPN能够提供足够的安全保证,确保VPN内部信息不受外部侵扰。VPN与底层承载网络(一般为IP网络)之间保持资源独立,即VPN资源不被网络中非该VPN的用户所使用。
2)虚拟(Virtual):VPN用户内部的通信是通过公共网络进行的,而这个公共网络同时也可以被其他非VPN用户使用,VPN用户获得的只是一个逻辑意义上的专网。
VPN的基本原理是利用隧道(Tunnel)技术,对传输报文进行封装,利用VPN技术建立专用数据传输通道,实现报文的安全传输。
隧道技术使用一种协议封装另外一种协议报文(通常是IP报文),而封装后的报文也可以再次被其他封装协议所封装。对用户来说,隧道是其所在网络的逻辑延伸,在使用效果上与实际物理链路相同。
图1
在图1所展示的网络中,当分支机构员工访问总部服务器时,报文封装过程如下:
1) 报文发送到网关时,网关1识别出该用户为VPN用户后,发起与总部网关即网关2的隧道连接,从而网关1和网关2之间建立VPN隧道。
2) 网关1将数据封装在VPN隧道中,发送给网关2。
3)网关2收到报文后进行解封装,并将原始数据发送给最终接收者,即服务器。
反向的处理也一样。VPN网关在封装时可以对报文进行加密处理,使Internet上的非法用户无法读取报文内容,因而通信是安全可靠的。

图2
IPSec协议如图2所示,它为网络层上的通信数据提供一整套的安全体系结构,包括IKE(Internet Key Exchange)协议、认证头(Authentication Header,AH)协议、封装安全载荷(Encapsulating Security Payload,ESP)协议和用于网络身份鉴别及加密的一些算法等。从工作流程上看,IPSec协议可分为两个环节:IKE是第一个环节,完成通信双方的身份鉴别、确定通信时使用的IPSec安全策略和密钥,即安全联盟(SA,Security Associations);第二个环节是使用数据报文封装协议和IKE中协定的IPSec安全策略和密钥,实现对通信数据的安全传输。其中AH协议定义了认证的应用方法,提供数据源认证和完整性保证;ESP协议定义了加密和可选认证的应用方法,提供机密性保证。在实际进行IP通信时,可以根据实际安全需求同时使用这两种协议或选择使用其中的一种。

图3
1) 真实性(不可否认性):“真实性”可以证实消息发送方是唯一可能的发送者,发送者不能否认发送过消息。“真实性”是采用公钥技术的一个特征,当使用公钥技术时,发送方用私钥产生一个数字签名随消息一起发送,接收方用发送者的公钥来验证数字签名。由于在理论上只有发送者才唯一拥有私钥,也只有发送者才可能产生该数字签名,所以只要数字签名通过验证,发送者就不能否认曾发送过该消息。
2) 防重放:“防重放”确保每个IP包的唯一性,保证信息万一被截取复制后,不能再被重新利用、重新传输回目的地址。该特性可以防止攻击者截取破译信息后,再用相同的信息包冒取非法访问权。
3)完整性:防止传输过程中数据被篡改,确保发出数据和接收数据的一致性。IPSec利用Hash函数为每个数据包产生一个杂凑值,接收方在打开包前先计算杂凑值,若数据包遭篡改导致杂凑值不相符,则该数据包即被丢弃。
4) 机密性:在传输前,对数据进行加密,可以保证在传输过程中,即使数据包遭截取,信息也无法被读取。
为规范IPSec VPN产品的研制、检测、使用和管理,国家先后发布了《GM/T 0022-2014 IPSec VPN技术规范》、《GB/T 36968-2018 信息安全技术 IPSecVPN 技术规范》、《GM/T 0023-2014 IPSec VPN 网关产品规范》等标准,规定了基于商用密码算法的IPSec VPN协议实现。其中IKE、AH和ESP的规定如下:
(2.1)IKE
IKE协议用于鉴别通信双方身份、创建安全联盟(SA,也称为安全关联)、协商加密算法以及生成共享会话密钥等,其中ISAKMP(互联网安全联盟和密钥管理协议,Internet Security Association and Key Management Protocol)是IKE的核心协议,定义了建立、协商、修改和删除SA的过程和报文格式,并定义了密钥交换数据和身份鉴别数据的载荷格式。它是IPSec的基础,协议的内容包括数据报文封装协议、IPSec工作模式、密码算法等安全策略和密钥。IPSec的两种封装协议(AH和ESP)均使用SA中协商的内容保护通信安全。另外,SA是单向的,一个SA为单一通信方向上传输的数据提供一种安全服务,通信双方需要产生属于自己的SA。
1)安全联盟
安全联盟(SA,也称为安全关联)是构成IPSec的基础。安全联盟是两个通信实体经协商建立起来的一种协定。它们决定了用来保护数据包安全的IPSec协议、转码方式、密钥以及密钥的有效存在时间等等。任何IPSec实施方案始终会构建一个SA数据库(SADB),由它来维护IPSec协议用来保障数据包安全的SA记录。
SA是一个单向的逻辑连接,也就是说,IPSec 需要建立两个SA,一个用于入站通信,另一个用于出站通信。例如,有两个主机(比如A和B)正在通过ESP进行安全通信,那么主机A就需要有一个SA,即SA(out),用来处理外发的数据包;另外还需要有一个不同的SA,即SA(in),用来处理进入的数据包。每个SA用唯一的SPI索引标识,当处理接收数据包时,服务器根据SPI值来决定该使用哪种SA。
IKE建立SA分两个阶段。第一阶段,协商创建一个通信信道(IKE SA),并对该信道进行认证,为双方进一步的IKE通信提供机密性、数据完整性以及数据源认证服务;第二阶段,使用已建立的IKE SA建立IPSec SA。第二阶段协商消息受第一阶段SA保护,任何没有第一阶段SA保护的消息将被拒收。
ISAKMP第一阶段称为主模式,通信双方协商创建一个通信信道(IKE SA),并实现双方的身份鉴别和密钥交换,得到工作密钥,该工作密钥用于保护第二阶段的协商过程;第二阶段是快速模式,使用已建立的ISAKMP SA提供保护,实现通信双方IPSec SA的协商,确定通信双方IPSec安全策略和会话密钥。其中,IPSec安全策略定义了哪些服务以何种形式提供给IP数据报文,如数据加密服务以SM4的CBC模式实现。
阶段 |
工作模式 |
数据交互 |
目的 |
第一阶段 |
主模式 |
6条交互信息 |
创建IKE SA,确定对下一阶段保护机制(主要是交换密钥及身份认证) |
第二阶段 |
快速模式 |
3条交互数据 |
确定协议(AH or ESP),算法及参数。 |
2)第一阶段——主模式
主模式数据交换使用标准ISAKMP载荷语法、属性编码、消息的超时和重传以及通知消息。
主模式是一个身份保护的交换,其交换过程由6条消息组成。双方身份的鉴别采用数字证书的方式。
主模式的交换过程如下(图4):

图4
消息1 发起者向接收者发送一个封装有建议载荷的SA载荷,而建议载荷中又封装有变换载荷。
消息2 接收者发送一个SA载荷以及接收者的签名证书和加密证书,该载荷表明它所接受的发起方发送的SA提议。
消息3和消息4 发起者和接收者交换数据,交换的数据内容包括Nonce、身份标识(ID)等载荷。Nonce是生成加密密钥和认证密钥所必需的参数;ID是发起方或响应方的标识。这些数据使用临时密钥Sk进行加密保护,Sk用对方加密证书中的公钥加密保护,并且,双方各自对数据进行数字签名。
发起者交换的数据如下:
XCHi = Asymmetric_Encrypt(Ski, pub_r) | Symmetric_Encrypt(Ni,Ski) | Symmetric_Encrypt(IDi,Ski)|CERT_sig_i|CERT_enc_i
SIGi_b = Asymmetric_Sign(Ski_b | Ni_b | IDi_b | CERT_enc_i_b, priv_i)
接收者交换的数据如下:
XCHr = Asymmetric_Encrypt(Skr, pub_i) | Symmetric_Encrypt(Nr,Skr) | Symmetric_Encrypt(IDr,Skr)
SIGr_b = Asymmetric_Sign(Skr_b | Nr_b | IDr_b|CERT_enc_r_b, priv_r)
上述过程中使用的非对称密码算法、对称密码算法和密码杂凑算法均由消息1和消息2确定。临时密钥Sk由发起方和接收者各自随机生成,长度符合对称密码算法对密钥长度的要求。
对称密码运算使用CBC模式,第一个载荷的IV值为0;后续的IV使用前面载荷的最后一组密文。加密前的交换数据应进行填充,使其长度等于对称密码算法分组长度的整数倍。所有的填充字节的值除最后一个字节外都是0,最后一个填充字节的值为不包括它自己的填充字节数。
消息3和消息4交互完成后,参与通信的双方生成基本密钥参数SKEYID,以生成后续密钥SKEYID_d、SKEYID_a、SKEYID_e,计算方法分别如下:
SKEYID = PRF(HASH(Ni_b | Nr_b), CKY-I | CKY-R)
SKEYID_d = PRF(SKEYID, CKY-I | CKY-R | 0)
SKEYID_a = PRF(SKEYID, SKEYID_d | CKY-I | CKY-R | 1)
SKEYID_e = PRF(SKEYID, SKEYID_a | CKY-I | CKY-R | 2)
上述计算公式中的值0,1,2是单个字节的数值。
SKEYID_e 是ISAKMP SA用来保护其消息机密性所使用的工作密钥。SKEYID_a 是ISAKMP SA用来验证其消息完整性以及数据源身份所使用的工作密钥。SKEYID_d 用于会话密钥的产生。
消息5和6发起者和接收者鉴别前面的交换过程。这两个消息中传递的信息使用对称密码算法加密。对称密码算法由消息1和消息2确定,密钥使用SKEYID_e。对称密码运算使用CBC模式,初始化向量IV是消息3中的Ski和消息4中的Skr串连起来经过Hash运算得到的,即:
IV= HASH(Ski_b | Skr_b)
Hash算法由消息1和消息2确定。
加密前的消息应进行填充,使其长度等于对称密码算法分组长度的整数倍。所有的填充字节的值都是0。报头中的消息长度应包括填充字节的长度,因为这反映了密文的长度。
为了鉴别交换,发起方产生HASHi,响应方产生HASHr,计算公式如下:
HASHi = PRF(SKEYID, CKY-I | CKY-R | SAi_b | IDi_b )
HASHr = PRF(SKEYID, CKY-R | CKY-I | SAr_b | IDr_b )
3)第二阶段——快速模式
快速模式交换依赖于第一阶段主模式交换,主要协商IPSec SA的安全策略并衍生会话密钥。快速模式交换的信息由ISAKMP SA来保护,即除了ISAKMP头外所有的载荷都要加密。在快速模式中,一个Hash载荷应紧跟在ISAKMP头之后,这个Hash用于消息的完整性校验以及数据源身份验证。
在第二阶段,载荷的加密使用对称密码算法的CBC工作模式,第1个消息的IV是第一阶段的最后一组密文和第二阶段的MsgID进行Hash运算所得到的,即:
IV=HASH(第一阶段的最后一组密文 | MsgID)
后续的IV是前一个消息的最后一组密文。消息的填充和第一阶段中的填充方式相同。
在ISAKMP头中的MsgID唯一标识了一个正在进行中的快速模式,而该ISAKMP SA本身又由ISAKMP头中的cookies来标识。因为快速模式的每个实例使用一个唯一的IV,这就有可能基于一个ISAKMP SA的多个快速模式在任一时间内同时进行。
在通信双方之间有多条隧道同时存在的情况下,身份标识ID为对应的IPSec SA标识并规定通信数据流进入对应的隧道。
快速模式的交换过程如下(图5):

图5
消息1 发起者向接收者发送一个杂凑载荷、一个SA载荷(其中封装了一个或多个建议载荷,而每个建议载荷中又封装一个或多个变换载荷)、一个nonce载荷和标识载荷。
杂凑载荷中消息摘要的计算方法如下:
HASH_1 = PRF(SKEYID_a,MsgID | Ni_b | SA [ | IDi | IDr])
消息2 发起者向接收者发送一个杂凑载荷、一个SA载荷、一个nonce载荷和标识载荷。
杂凑载荷中消息摘要的计算方法如下:
HASH_2 = PRF(SKEYID_a,MsgID | Ni_b |SA | Nr_b [ | IDi | IDr])
消息3 发起者向接收者发送一个杂凑载荷,用于对前面的交换进行鉴别。
杂凑载荷中消息摘要的计算方法如下:
HASH_3 = PRF(SKEYID_a,0 | MsgID | Ni_b | Nr_b )
最后,会话密钥素材定义为:
KEYMAT = PRF(SKEYID_d, protocol | SPI | Ni_b | Nr_b)
其中,protocol和SPI从协商得到的ISAKMP建议载荷中选取。
用于加密的会话密钥和用于完整性校验的会话密钥按照算法要求的长度从KEYMAT中依次选取。先选取用于加密的会话密钥,后选取用于完整性校验的会话密钥。
当PRF函数的输出长度小于KEYMAT需要的密钥素材长度时,需要利用反馈及连接方法加以扩展,直到满足对密钥长度的要求为止。即:
KEYMAT = K1 | K2 | K3 | ...
其中:
K1 = PRF(SKEYID_d, protocol | SPI | Ni_b | Nr_b)
K2 = PRF(SKEYID_d, K1 | protocol | SPI | Ni_b | Nr_b)
K3 = PRF(SKEYID_d, K2 | protocol | SPI | Ni_b | Nr_b)
…
单个SA协商产生两个安全关联—— 一个入,一个出。每个SA(一个由发起方选择,另一个由响应方选择)的不同的SPI保证了每个方向都有一个不同的KEYMAT。由SA的目的地选择的SPI,被用于衍生该SA的KEYMAT。
4)安全报文协议
IPSec通过AH和ESP这两个安全协议来实现数据报在网络上传输时的机密性、完整性、真实性和防重放。

图6
· AH协议
AH协议的主要作用是为整个IP数据报文(IP头和IP载荷)提供高强度完整性校验,以确保被篡改过的数据包可以被检查出来。AH使用MAC对IP数据报文进行认证,最常用的MAC是HMAC,而HMAC对IP数据报文处理所用的密钥就是IKE协定的用于验证完整性和数据源身份的会话密钥。
由于AH不提供机密性保证,所以它也不需要加密算法。尽管如此,仍然需要一个验证器(身份验证器)。AH定义保护方法、头的位置、身份验证的覆盖范围以及输出和输入处理规则。
AH可用来保护一个上层协议(传输模式)或一个完整的IP数据报(隧道模式)。AH可单独使用,也可以和ESP连合使用。但AH提供的数据完整性与ESP提供的数据完整性稍有不同,AH对外部IP头各部分进行身份验证。标准GM/T 0022-2014规定,AH不得单独用于封装IP数据报文,应和封装安全载荷协议ESP嵌套使用。
· ESP协议
和AH协议相比,ESP协议增加了对数据报文的加密功能,它可同时使用用于加密的会话密钥及用于验证完整性和数据源身份的会话密钥,以便为IP提供机密性、数据源验证、抗重放以及数据完整性等安全服务。由于ESP提供的安全功能更为全面,在标准GM/T 0022-2014中规定,ESP可单独使用,并同时选择保密性和数据源身份鉴别服务;当ESP和AH结合使用时,无须ESP提供数据源身份鉴别服务,而由AH提供该项安全服务。
ESP头紧紧跟在一个IP头之后。ESP头中会包含一个SPI字段。这个值和IP头之前的目标地址以及协议结合在一起,用来标识用于处理数据包的特定的那个安全联盟。SPI本身是个任意数,一般是在IKE交换过程中由目标主机选定的。
5)工作模式
IPSec VPN工作模式包括隧道模式和传输模式。在传输模式下,IPSec头被插入到IP头之后,传输层协议之前。在隧道模式下,IPSec头插在原始IP头之前,另外生成一个新的报文头,放在AH或ESP头之前,如图7所示。

图7
对于AH协议,在传输模式时,AH放在原IP头之后,上层(传输层)协议之前,为整个IP数据报文(原IP头和IP载荷)提供认证保护;在隧道模式时,AH放在新建外部IP头之后,原IP数据报文之前,为整个原IP数据报文及新建外部IP头提供认证保护。
对于ESP协议,在传输模式时,ESP头放在原IP头之后,上层协议之前,为ESP头后的载荷提供保密性保护,为原IP头后的内容提供认证保护;在隧道模式时,ESP头放在新建外部IP头之后,原IP数据报文之前,为整个原IP报文提供保密性保护,为新建外部IP头后的内容提供认证保护。
(2.2)密钥交换的载荷格式
ISAKMP消息由一个定长的消息头和不定数量的载荷组成。消息头包含着协议用来保持状态并处理载荷所必须的信息。
ISAKMP的头格式如下图所示:

图8
发起方cookie:这个字段是一个唯一的8字节比特串,由发起方随机生成。
响应方cookie:这个字段是一个唯一的8字节比特串,由响应方随机生成。
下一个载荷:这个字段为1个字节,说明消息中的第一个载荷的类型。载荷类型的定义如下表所示:
载荷类型的定义
下一个载荷 |
值 |
无 (None) |
0 |
安全关联 (Security association) |
1 |
建议 (Proposal) |
2 |
变换 (Transform) |
3 |
密钥交换 (Key exchange) |
4 |
标识 (Identification) |
5 |
证书 (Certificate) |
6 |
证书请求 (Certificate Request) |
7 |
杂凑 (Hash) |
8 |
签名 (Signature) |
9 |
Nonce |
10 |
通知 (Notification) |
11 |
删除 (Delete) |
12 |
厂商 (Vendor) |
13 |
属性载荷 |
14 |
NAT_D |
20 |
NAT_OA |
21 |
对称密钥载荷(SK) |
128 |
保留 (Reserved) |
15-19,22-127 |
私有使用 (PrivateUse) |
129-255 |
版本号:这个字段为1个字节,其中0-3位表示主版本号,4-7位表示次版本号。本标准规定主版本号为1,次版本号为1。
交换类型:这个字段为1个字节,说明组成消息的交换的类型。交换类型的定义如下表所示:
交换类型 |
分配的值 |
无 (None) |
0 |
基本 (Base) |
1 |
身份保护 (Identity protection) |
2 |
仅鉴别 (Authentication only) |
3 |
信息 (Informational) |
5 |
将来使用 (Future use) |
6-31 |
DOI具体使用 |
32-239 |
私有使用 (Private use) |
240-255 |
第一阶段使用的交换类型为身份保护类型即主模式,其值为2。第二阶段交换使用的快速模式所分配的值为32。
1) 安全联盟载荷(SA载荷)
SA载荷用于协商安全关联,并且指定协商所基于的解释域DOI。载荷的格式依赖于他使用的DOI,载荷的类型值为1。SA载荷的格式如下图所示:

图9
下一个载荷:这个字段的长度为1个字节,标识了本载荷后下一个载荷的类型。如果当前载荷是最后一个,则该字段将被置为0。
载荷长度:这个字段的长度为2个字节,以字节为单位标明整个SA载荷的长度,计算范围包括SA载荷、所有建议载荷和所有与被提议的SA有关的变换载荷。
解释域(DOI):这个字段长度为4个字节,其值为无符号整数,它指定协商所基于的DOI,这个字段的值为1。
2) 建议载荷
建议载荷用于密钥交换的发起方告知响应方它优先选择的安全协议以及希望协商中的SA采用的相关安全机制,载荷的类型值为2。建议载荷的格式如下图所示:

图10
下一个载荷:这个字段的长度为1个字节,如果后面还有建议载荷,其值为2,否则应为0。
载荷长度:这个字段的长度为2个字节,以字节为单位标明整个建议载荷的长度。计算范围包括通用载荷头、建议载荷所有与该建议有关的变换载荷,该长度仅用于标明本建议载荷的长度。
建议号:这个字段的长度为1个字节,标明本建议载荷的建议编号。
协议ID:这个字段的长度为1个字节,标明协议标识符。协议标识符的定义如下表所示:
协议标识符 |
描述 |
值 |
RESERVED |
未分配 |
0 |
PROTO_ISAKMP |
ISAKMP的协议标识符 |
1 |
PROTO_IPSec_AH |
AH的协议标识符 |
2 |
PROTO_IPSec_ESP |
ESP的协议标识符 |
3 |
PROTO_IPCOMP |
IP压缩的协议标识符 |
4 |
SPI长度:这个字段的长度为1个字节,以字节为单位标明SPI的长度。在第一阶段该长度为0,在第二阶段该长度为4。
变换数:这个字段的长度为1个字节,标明建议的变换载荷个数。
变长的SPI:在第一阶段没有这个字段,在第二阶段这个字段的长度为4个字节,其内容是该建议的提出者产生的随机数。
3) 变换载荷
变换载荷用于密钥交换的发起方告知响应方为一个指定的协议提供不同的安全机制,载荷的类型值为3。变换载荷的格式如下图所示:

图11
下一个载荷:这个字段的长度为1个字节,如果后面还有变换载荷,其值为3,否则应为0。
载荷长度:这个字段的长度为2个字节,以字节为单位标明本变换载荷的长度。计算范围包括通用载荷头、变换载荷和所有的SA属性载荷。
变换号:这个字段的长度为1个字节,标明本变换载荷的变换编号。单调递增的变换号表示对变换的优先选择顺序,变换号越小优先权越高。
变换ID:这个字段的长度为1个字节,标明建议协议的变换标识符。在第一阶段该字段的值为1,在第二阶段根据不同的协议选用不同的变换ID。AH协议的变换ID的定义如表4所示,ESP协议的变换ID的定义如下表所示:
AH协议的变换ID的定义
变换ID |
描述 |
值 |
RESERVED |
未使用 |
0-1 |
AH_SM3 |
使用带256比特SM3密码杂凑算法的HMAC |
20 |
ESP协议的变换ID的定义
变换ID |
描述 |
值 |
RESERVED |
未使用 |
0 |
ESP_SM4 |
SM4分组密码算法 |
129 |
SA属性:该字段的长度是可变的,标明本变换的SA属性。
4) SA属性载荷
SA属性载荷只能用于变换载荷之后,并且没有通用载荷头,用于表示SA属性的数据结构,载荷的类型值为14。SA属性载荷的格式如下图所示:

图12 SA属性载荷格式
属性类型:这个字段的长度为2个字节,标明属性类型。该字段的最高有效比特(比特0)如果为0,属性值是变长的,并且本载荷有3个字段,分别是属性类型、属性长度和属性值。如果属性类型最高有效比特为1,属性值是定长的并且本载荷仅有2个字段,分别是属性类型和属性值。如果属性类型是变长的,并且属性值能在两个字节中表示,那么变长的属性可以用定长表示。
第一阶段密钥交换属性类型的定义如下表所示:
第一阶段密钥交换属性类型的定义
下一个载荷 |
值 |
长度 |
加密算法 |
1 |
定长 |
Hash算法 |
2 |
定长 |
鉴别方式 |
3 |
定长 |
交换群描述 |
4 |
定长 |
交换群类型 |
5 |
定长 |
群素数/不可约多项式 |
6 |
定长 |
群产生器1 |
7 |
定长 |
群产生器2 |
8 |
定长 |
群曲线A |
9 |
定长 |
群曲线B |
10 |
定长 |
SA生存期类型 |
11 |
定长 |
SA生存期 (SA Life Duration) |
12 |
定长 |
伪随机函数(PRF) |
13 |
定长 |
密钥长度 |
14 |
定长 |
字段大小 |
15 |
定长 |
群顺序 |
16 |
定长 |
块大小 |
17 |
定长 |
非对称算法类型 |
20 |
定长 |
第二阶段密钥交换属性类型的定义
分类 |
值 |
长度 |
SA生存类型 (SA Life Type) |
1 |
定长 |
SA生存期 (SA Life Duration) |
2 |
定长 |
组描述 (Group Description) |
3 |
定长 |
封装模式 (Encapsulation Mode) |
4 |
定长 |
鉴别算法 (Authentication Algorithm) |
5 |
定长 |
密钥长度 (Key Length) |
6 |
定长 |
密钥轮数 (Key Rounds) |
7 |
定长 |
压缩字典长度 (Compress Dictionary Size) |
8 |
定长 |
压缩字典长度 (Compress Dictionary Size) |
9 |
4 |
属性值:这个字段如果是定长的,其长度为2个字节。如果是变长的,其长度由属性长度字段指定。
属性长度:当属性值是变长时,该字段标明属性值的长度。
第一阶段加密算法属性值的定义如下表所示:
第一阶段加密算法属性值的定义
可选择算法的名称 |
描述 |
值 |
ENC_ALG_SM4 |
SM4分组密码算法 |
129 |
第一阶段密码杂凑算法属性值的定义如下表所示:
第一阶段密码杂凑算法属性值的定义
名称 |
描述 |
值 |
HASH_ALG_SM3 |
SM3密码杂凑算法 |
20 |
第一阶段鉴别方式属性值的定义如下表所示:
第一阶段鉴别方式属性值的定义
名称 |
描述 |
值 |
AUTH_METHOD_DE |
公钥数字信封鉴别方式 |
100 |
SA生存期类型属性值的定义适用于第一阶段和第二阶段,如下表所示:
SA生存期类型属性值的定义
名称 |
描述 |
值 |
SA_LD_TYPE_SEC |
秒 |
1 |
SA_LD_TYPE_KB |
千字节 |
2 |
第一阶段公钥算法类型属性值的定义如下表所示:
第一阶段公钥算法类型属性值的定义
名称 |
描述 |
值 |
ASYMMETRIC_SM2 |
SM2椭圆曲线密码算法 |
2 |
第二阶段封装模式属性值的定义如下表所示:
第二阶段封装模式属性值的定义
名称 |
描述 |
值 |
RESERVED |
使用 |
0 |
ENC_MODE_TUNNEL |
隧道模式 |
1 |
ENC_MODE_TRNS |
传输模式 |
2 |
ENC_MODE_UDPTUNNEL_RFC |
NAT穿越隧道模式 |
3 |
ENC_MODE_UDPTRNS_RFC |
NAT穿越传输模式 |
4 |
第二阶段鉴别算法属性值的定义如下表所示:
名称 |
描述 |
值 |
RESERVED |
使用 |
0 |
HMAC_SM3 |
SM3密码杂凑算法的HMAC |
20 |
5) 证书载荷
证书载荷用于通信双方交换证书以及证书相关信息,本载荷的类型值为6。
证书载荷的格式如下图所示:

图13 证书载荷格式
下一个载荷:这个字段的长度为1个字节,标识了本载荷后下一个载荷的类型。如果当前载荷是最后一个,则该字段将被置为0。载荷类型由表1定义。
保留:这个字段的长度为1个字节,其值为0。
载荷长度:这个字段的长度为2个字节,以字节为单位标明包含通用载荷头在内的整个载荷长度。
证书编码:这个字段的长度为1个字节,标明证书数据字段的证书编码类型。证书编码类型定义如下表所示:
证书类型 |
值 |
X.509签名证书 |
4 |
X.509加密证书 |
5 |
在标准中,只能使用X.509格式的签名证书和加密证书。
证书数据:这个字段是变长字段,标明证书。证书的结构及定义见GB/T 20518。
(来源:国家网安检测中心)