在IKEv2的头两个消息中,通信双方会协商一系列的安全参数。包括,一个加密算法,一个完整性算法,一个DH Group,以及一个PRF伪随机数算法。其中,PRF算法被通信双方用来生成即将被用到的各种密钥。
在讨论密钥生成之前,先了解下IKEv2通信需要哪些密钥。首先,加解密需要一对密钥,称之为SK_ei和SK_er;然后,完整性算法需要一对密钥,称之为SK_ai和SK_ar;第三,在生成AUTH payload时也需要一对密钥,称之为SK_pi和SK_pr;最后,为了给Child SA生成加密材料,也需要一个密钥,称之为SK_d。
这些密钥,有的是固定长度,比如DES算法的密钥长度固定是56比特,而有些算法,比如AES算法,其密钥程度可能是128比特,也可能是192或者256比特。那么在协商时,双方需要通过一个额外的属性来协商出密钥长度。当协商结束完成之后,双方应该在算法和密钥长度方面都达成了一致。而SK_d,SK_Pi和SK_pr的长度则是PRF算法所需要的密钥长度,因为它们最终被用作PRF算法的密钥。
密钥的计算过程如下:
Pfr+ (K, S) = T1 | T2 | T3 | T4 …
其中:
T1 = prf (K, S | 0x01)
T2 = prf (K, T1 | S | 0x02)
T3 = prf (K, T2 | S | 0x03)
T4 = prf (K, T3 | S | 0x04)
…
如何理解以上过程呢?
以T1 = prf (K, S | 0x01)为例,K和S | 0x01为这个prf算法的输入,T1是它的计算结果。分隔符‘|’表示连接的意思,比如S的值是”0x08 0x07 0x06 0x05”,那么 S | 0x01的结果是” 0x080x07 0x06 0x05 0x01”。
T2,T3和T4的计算则是一个迭代的过程,将上一次的计算结果作为这一次的输入的一部分。最后Prf+则是将多次的计算结果连接起来,形成最终的结果。迭代结束的条件是,T1 | T2 | … | Tn 的长度超过所有需要的7个密钥长度之和。
了解了密钥的计算过程,那么一下的IKEv2密钥生成就很好理解了:
SKEYSEED = prf (Ni | Nr, g^ir)
{ SK_d | SK_ai | SK_ar | SK_ei | SK_er |SK_pi | SK_pr } = prf+ (SKEYSEED, Ni | Nr | SPIi | SPIr)
计算过程分成两步:第一步,根据协商的随机数Ni, Nr和DH大数g^ir算出prf+算法的第一个参数SKEYSEED,然后取Ni | Nr | SPIi | SPIr作为第二个参数,用prf算法反复迭代,直到输出的长度超过7个SK的总长度。然后将输出的结果从前往后进行截取,第一个为SK_d,第二个为SK_ai,然后分别为SK_ar,SK_ei,SK_er,SK_pr,SK_pr。