Skip to main content

5.5 密钥下载负载 (Key Download Payload)

密钥下载(KD)负载用于传输实际的密钥材料,包括KEK和TEK。KD负载在GROUPKEY-PULL响应和GROUPKEY-PUSH消息中使用。

KD负载格式

 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! Next Payload ! RESERVED ! Payload Length !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! # of Items ! RESERVED2 !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! !
~ Key Download Items ~
! !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

字段说明:

  • # of Items: 密钥下载项的数量
  • Key Download Items: 一个或多个密钥下载项

密钥下载项格式

每个密钥下载项的格式:

 0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! KD Type ! RESERVED ! KD Length !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! SPI !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! !
~ Key Packet ~
! !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

字段说明:

  • KD Type: 密钥下载类型(见下文)
  • KD Length: 此密钥下载项的长度
  • SPI: 与此密钥关联的SPI
  • Key Packet: 实际的密钥材料

密钥下载类型

TEK下载类型

详见5.5.1 TEK下载类型

用于传输流量加密密钥:

  • KD_TEK_SIMPLE: 简单的TEK下载
  • KD_TEK_ESP: IPsec ESP TEK下载

KEK下载类型

详见5.5.2 KEK下载类型

用于传输密钥加密密钥:

  • KD_KEK: 基本的KEK下载

LKH下载类型

详见5.5.3 LKH下载类型

用于传输LKH密钥树中的密钥:

  • KD_LKH: LKH密钥数组下载

在GROUPKEY-PULL中的使用

GCKS在GROUPKEY-PULL响应中发送KD负载来传输初始密钥:

KD {
# of Items = 2

// KEK密钥
KD Item {
KD Type = KD_KEK
SPI = 0x12345678
Key Packet = [KEK密钥材料]
}

// TEK密钥
KD Item {
KD Type = KD_TEK_ESP
SPI = 0xAABBCCDD
Key Packet = [TEK密钥材料]
}
}

在GROUPKEY-PUSH中的使用

GCKS在GROUPKEY-PUSH消息中发送KD负载来更新密钥:

KD {
# of Items = 1

// 新的TEK密钥
KD Item {
KD Type = KD_TEK_ESP
SPI = 0xAABBCCDE // 新的SPI
Key Packet = [新的TEK密钥材料]
}
}

Key Packet格式

Key Packet的格式取决于KD Type:

对于TEK

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! Encryption Key !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! Authentication Key !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! Other Parameters !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

对于KEK

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! KEK Key !
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

对于LKH

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! LKH Key Array !
~ (multiple keys) ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

处理规则

发送方(GCKS)

GCKS必须 (MUST):

  1. 生成密钥: 生成高质量的随机密钥材料
  2. 设置SPI: 为每个密钥设置正确的SPI
  3. 选择类型: 根据密钥类型选择正确的KD Type
  4. 保护密钥: 确保KD负载通过适当的机制加密

接收方(组成员)

组成员必须 (MUST):

  1. 解密负载: 解密KD负载(通过第1阶段SA或KEK)
  2. 提取密钥: 根据KD Type提取密钥材料
  3. 存储密钥: 安全存储密钥,与相应的SPI关联
  4. 配置协议: 使用密钥配置相应的安全协议
  5. 清除旧密钥: 在不再需要时安全删除旧密钥

与其他负载的关系

KD负载通常与以下负载一起使用:

  • SA负载: SA负载定义密钥的使用参数,KD负载传输实际密钥
  • SEQ负载: 在GROUPKEY-PUSH中,SEQ负载提供重放保护
  • KE负载: 如果使用PFS,KE负载用于密钥派生

安全考虑

KD负载包含敏感的密钥材料:

  • 加密保护: KD负载必须 (MUST) 加密传输
    • 在GROUPKEY-PULL中: 通过第1阶段SA加密
    • 在GROUPKEY-PUSH中: 通过当前KEK加密
  • 完整性保护: KD负载必须 (MUST) 受完整性保护
  • 密钥质量: 密钥材料必须 (MUST) 来自高质量的随机源
  • 密钥生命周期: 密钥应该 (SHOULD) 定期更新
  • 密钥存储: 接收方必须 (MUST) 安全存储密钥材料
  • 密钥清除: 过期的密钥必须 (MUST) 安全删除

KD负载的妥协将直接导致密钥泄露,因此其保护至关重要。