MKA密钥协商


MKA(MACsec Key Agreement protocol)是用于 MACsec 数据加密密钥的协商协议。该部分用于生成macsec数据所需要的SAK,并对SAK进行分发。

协商流程

1、在同一个安全链接关联 CA 成员 CA(a)和 CA(b)上,用户静态配置相同的(CKN,CAK)
产生的(ICK,KEK)是一样的,用于后续发布 SAK 对其本身进行加密,防止 SAK 明文
传递过程中泄密;
2、在 Key Server 基于用户配置的(CKN,CAK)会生成 SAK,并且在本地安装 SAK,
用于 Key Server 端收发数据报文的加解密;
3、Key Server 将 SAK 发布给对端 Supplicant 时,通过 KEK 加密 SAK 密钥本身,由
ICK 通过某种算法生成 ICVs 用于校验报文的完整性,在 Key Server 上将 ICVs 值放在
MKA协议报文尾部,将经过KEK加密的SAK一起通过MKA协议报文发送给Supplicant;
4、Supplicant 接收到 MKA 协议报文时,根据其中的 CKN 查找 CAK 和 ICK,如果没有
查找到则认为不是来自相同的 CA 并丢弃,查找到之后对 MKA 报文主体进行 ICV 计算
得到 ICVc,如果与报文中的 ICVs 不相同,则认为报文被修改(MKA 报文中的 CKN 和
ICVs 没有经过 KEK 加密);
5、经过 ICV 校验通过之后,使用 KEK 解密出 SAK,Supplicant 进行 SAK 安装,用于
Supplicant 端收发数据报文的加解密。

两端设备预先配置好约定好的CKN、CAK ,然后采用 KDF 算法生成 SAK、KEK、ICK、ICV,Key Server 和 Supplicant 两边配置(CKN,CAK)生成 KEK、ICK、ICV,
Key Server 同时生成 SAK 并且在本地安装,然后 Key Server 将 SAK 用 KEK 加密,将加密后的 SAK 通过 MKA 协议报文发送给 Supplicant,MKA 协议报文中尾部包含 ICV 字段。
Supplicant 收到协议报文通过 ICV 检验之后,将 SAK 密钥解密并在 Supplicant 上安
装,这样 Key Server 和 Supplicant 两边转发层面都用相同的 SAK 密码,可以对收发
的数据报文进行加解密通信。

具体实现

1、KDF(密钥推导函数)

公式为Output = KDF (Key, Label, Context, Length)
此处input:
Key: a key derivation key of 128 or 256 bits
Label:a string identifying the purpose of the keys derived using this KDF,字符串形式,
Context:a bit string that provides context to identify the derived key ,字符串形式
Length:the length of the output in bits encoded in two octets with the most significant octet first
此处Output: a Length-bit derived value
Note: label,context这些字符串有规定的十六进制表达方式,方便后期进行公式计算。比如“IEEE8021 ICK”的十六进制表达是49454545383032312049434b,具体请参照802.1x协议。

参数h:the length of the output of the PRF(伪随机函数) in bits,即输出的比特位数,此处的函数为AES-CMAC-128 和AES-CMAC-256 。当用于加密的密钥是128位选前者,256位选后者。

迭代次数(Length + (h–1))/h

For i = 1 to 迭代次数
result = result | PRF(Key, i | Label | 0x00 | Context | Length)

return first Length bits of result, and securely delete all unused bits,即当length为128时,取result的前128位。
Note:此处的”|”是指把i,label,0x00,context,length连接在一起。

2、算出ICK,

ICK(ICV Key,ICK 密钥)由 CAK 根据算法推导产生,只用于计算 MKA 协议层面报文
的 ICV 值。
ICK = KDF(Key, Label, Keyid, ICKLength)
其中
Key = CAK
Label = “IEEE8021 ICK”
Keyid = CKN的前16字节,the first 16 octets of the CKN, with null octets appended to pad to 16 octets if necessary
ICKLength =(2个字节)表示ICK长度,128表示128位,256表示256位

3、算出KEK

KEK(Key Encrypting Key,密钥加密密钥)由 CAK 根据算法推导产生,用于加密 SAK,
通过 MKA 密钥协议报文将 SAK 密钥发送给同一个 CA 内的参与者,防止用于数据加密
的 SAK 在传输过程中被窃取。
KEK = KDF(Key, Label, Keyid, KEKLength)
其中
Key = CAK
Label = “IEEE8021 KEK”
Keyid = CKN的前16字节,the first 16 octets of the CKN, with null octets appended to pad to 16 octets if necessary
KEKLength =(2个字节)表示KEK长度,128表示128位,256表示256位

4、算出SAK

SAK(Secure Association Key,安全关联密钥)由 CAK 根据算法推导产生,用于加密
安全通道间传输的数据。MKA 对每一个 SAK 可加密的报文数目有所限制,当使用某
SAK 加密的 PN 耗尽,该 SAK 会被刷新。

SAK = KDF(Key, Label, KS-nonce | MI-value list | KN, SAKlength)
其中
Key = CAK
Label = “IEEE8021 SAK”
KS-nonce = a nonce of the same size as the required SAK, obtained from an RNG each time an SAK is generated. 由密钥服务器系统随机数生成器生成,长度与SAK一样。
MI-value list = 所有参与者的MI值的连接。MI(Member Identifier)是成员标识符,
KN = 由密钥服务器指定的32位的key number。
SAKlength =(2个字节)表示SAK长度,128表示128位,256表示256位

5、计算ICV

ICV(Integrity Check Value,完整性校验值)是报文完整性检验值,在报文发送端,通
过某种算法对报文数据单元计算产生一个检验值,将此检验值放在报文的尾部,报文接
收端通过相同算法得到 ICV 值与报文携带的 ICV 进行比对,如果这两个 ICV 相同说明报
文没有被修改,否则该报文被丢弃,保证了报文的数据完整性。
ICV = AES-CMAC(ICK, M, 128)
M = DA + SA + (MSDU – ICV)
其中DA是目的地MAC地址,SA是源MAC地址,MSDU是包含SAK的EOPL-MKA报文信息.

6、EAPOL-MKA报文

服务器通过EAPOL-MKA报文向CA群员分发已加密过的SAK.

报文由DA,SA, MPDU(最后部分加上icv)构成。
MPDU结构如下

Protocol version:0x03
Packet type: EAPOL-MKA的类型是0000 0101
Packet body length: 包长度
Packetbody:包内容

其中packetbody结构如下:
如果采用gcm-aes-128对sak加密的话,报文格式如下:

其中:
Distributed AN:通常设置为0,表示为分发密钥。
Confidentiality Offset:保护性偏置,
Parameter set body length: 其后报文内容的长度, 采用gcm-aes-128则是28,采用非gcm-aes-128的话则是36.
Key Number: SAK的ID
AES Key Wrap of SAK:128比特的加密后的SAK

如果采用非gcm-aes-128对sak加密的话,报文格式如下:

MACsec Cipher Suite:加密套件不是默认的gcm-aes-128,就要填写采用的加密套件的标识符。
不同加密套件标识符如下:


文章作者: zhr
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zhr !
  目录