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下载类型
用于传输流量加密密钥:
- KD_TEK_SIMPLE: 简单的TEK下载
- KD_TEK_ESP: IPsec ESP TEK下载
KEK下载类型
用于传输密钥加密密钥:
- KD_KEK: 基本的KEK下载
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):
- 生成密钥: 生成高质量的随机密钥材料
- 设置SPI: 为每个密钥设置正确的SPI
- 选择类型: 根据密钥类型选择正确的KD Type
- 保护密钥: 确保KD负载通过适当的机制加密
接收方(组成员)
组成员必须 (MUST):
- 解密负载: 解密KD负载(通过第1阶段SA或KEK)
- 提取密钥: 根据KD Type提取密钥材料
- 存储密钥: 安全存储密钥,与相应的SPI关联
- 配置协议: 使用密钥配置相应的安全协议
- 清除旧密钥: 在不再需要时安全删除旧密钥
与其他负载的关系
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负载的妥协将直接导致密钥泄露,因此其保护至关重要。