如何在IEEE 802.1X-2010中定义的MACSec密钥协议MKA协议中公开加密主密钥之前的秘密

问题描述

我们尝试与外部设备服务器交换主控机密(匿名交换,不需要证书)。我们有外部设备(充当客户端)可以与外部服务器建立加密通道。

问题是-我们的设备客户端失败。

过程是IEEE 802.1X-2010中定义的MACSec密钥协议(MKA)协议。客户端使用C / C ++

  • 服务器(外部设备)以TLS EAP(EAP-TLS)(13)请求开始处理。
  • 客户端(我们的设备)继续使用ClientHello以获得TLS 1.1版本。 (外部设备不支持1.2。)
  • 来自服务器的ServerKeyExchange和来自我们的ClientKeyExchange。

PCAP是由wirehark收集的,一些txt输出可在此处访问: https://pastiebin.com/5f8d4e1446406

服务器密钥交换字段八位字节带有RSA公钥:

0c 00 01 03 b1 3b <252 octets> da f8 01 00 01

0c - (12) Server Key Exchange
00 01 03 - length (259 octets)
b1 3b <252 octets> da f8 - is public modulus (256 octets)
01 00 01 - is public exponent (3 octets)

加密源代码(基于openssl 1.0.2):

RSA * rsa = RSA_new();
rsa->n = BN_bin2bn(public_key,256,NULL);//public_key is uint8_t * : b1 3b ... da f8
rsa->e = BN_bin2bn(public_exp,3,NULL);//public_exp is uint8_t * : 01 00 01
result.resize(RSA_size(rsa)); // resize to 256
int32_t len = RSA_public_encrypt(64,pms,result,rsa,rsa_padding_method);
// pms is uint8_t[48] (contains 03 02 at the beginning,and then 46 random octets)
// rsa_padding_method is RSA_PKCS1_PADDING (but we have tested others too,like
// RSA_PKCS1_OAEP_PADDING/RSA_SSLV23_PADDING/RSA_NO_PADDING(yes,even no padding)

结果包含[56,1c,,12,9f](当然,由于填充,每次都会随机化)

我们通过客户端密钥交换(与外部客户端相同的格式)的回复

10 00 01 02 01 00 56 1c <252 octets> 12 9f
10 - (16) Client Key Exchange
00 01 02 - length (258 octets)
01 00 - RSA encrypted PreMasterSecret is preceded by two length bytes (256 octets)
56 1c <252 octets> 12 9f - encrypted value

TLS握手通过Finished和Success成功完成。

然后,这两个设备都使用HMAC函数派生通用密钥(直接从主密钥之前的机密),并交换一个值以确认已推导出相同的密钥。 (在TLS 1.1完成之后)。我们的设备获得的价值不同于外部设备。

我们检查了测试向量的推导过程(来自802.1X-2010附录H)。在我们这边还可以。

但是,我们不确定是否要公开加密。 你注意到那里有什么错误吗?还有其他建议可能有什么问题吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)