如何生成 peapv0-mschapv2 ms-mppe 密钥?
how to generate peapv0-mschapv2 ms-mppe keys?
我正在开发自定义 radius 服务器来验证无线客户端,使用 peapv0-mschapv2,在最后一步,不确定如何在Access-Accept 数据包,我已经按照 rfc3079 生成了一个 128 位的会话密钥,但是在最后一步,不知道如何处理 rc4_key() 函数,
来自 rfc3079
GetNewKeyFromSHA(MasterSendKey, MasterSendKey, 16, SendSessionKey)
GetNewKeyFromSHA(MasterReceiveKey, MasterReceiveKey, 16,
ReceiveSessionKey)
最后,使用新的会话密钥初始化 RC4 表:
rc4_key(SendRC4key, 16, SendSessionKey)
rc4_key(ReceiveRC4key, 16, ReceiveSessionKey)
我生成了一个 16 字节的 SendSessionKey 和一个 16 字节的 ReceiveSessionKey,但不确定 SendRC4Key 和 ReceiveRC4Key 来自哪里。不说 rfc :(
然后我尝试使用 SendSessionKey 和 ReceiveSessionKey 跟随 rfc2548 并加密 ms-mppe-send-key 和 ms-mppe-recv-key 并发送给客户端,但不起作用,客户端不断重置并启动客户您好。当我在网上搜索时,看起来像免费半径使用 32 字节密钥进行加密并发送给客户端。也不确定如何获得 32 字节的 SendSessionKey。提前感谢您的帮助!!
我发现 peapv0-ms-chapv2 使用 tls material 生成两个 32 字节的密钥。 rfc 没有说清楚,弄糊涂了,直到我尝试使用 tls 方法生成密钥并尝试了一下,它起作用了。
public static void ComputeMPPEKeys(byte[] masterSecret, byte[] ClientRandom, byte[] serverRandom, out byte[] mppeSendKey, out byte[] mppeRecvKey)
{
//PRF(master secret, "client EAP encryption", random) is computed up to 128 bytes,
//the value random defined as the concatenation of the handshake message fields client_hello.random and server_hello.random(in that order),
//and the value PRF("", "client EAP encryption", random) is computed up to 64 bytes(where "" is an empty string).
var random = new List<byte>();
random.AddRange(ClientRandom);
random.AddRange(serverRandom);
var label = "client EAP encryption";
var firstResult = PRF(masterSecret, label, random.ToArray(), 128);
//not really needed
var secondResult = PRF(new byte[0], label, random.ToArray(), 64);
mppeRecvKey = firstResult.Take(32).ToArray();
mppeSendKey = firstResult.Skip(32).Take(32).ToArray();
}
我正在开发自定义 radius 服务器来验证无线客户端,使用 peapv0-mschapv2,在最后一步,不确定如何在Access-Accept 数据包,我已经按照 rfc3079 生成了一个 128 位的会话密钥,但是在最后一步,不知道如何处理 rc4_key() 函数,
来自 rfc3079
GetNewKeyFromSHA(MasterSendKey, MasterSendKey, 16, SendSessionKey) GetNewKeyFromSHA(MasterReceiveKey, MasterReceiveKey, 16, ReceiveSessionKey)
最后,使用新的会话密钥初始化 RC4 表:
rc4_key(SendRC4key, 16, SendSessionKey)
rc4_key(ReceiveRC4key, 16, ReceiveSessionKey)
我生成了一个 16 字节的 SendSessionKey 和一个 16 字节的 ReceiveSessionKey,但不确定 SendRC4Key 和 ReceiveRC4Key 来自哪里。不说 rfc :(
然后我尝试使用 SendSessionKey 和 ReceiveSessionKey 跟随 rfc2548 并加密 ms-mppe-send-key 和 ms-mppe-recv-key 并发送给客户端,但不起作用,客户端不断重置并启动客户您好。当我在网上搜索时,看起来像免费半径使用 32 字节密钥进行加密并发送给客户端。也不确定如何获得 32 字节的 SendSessionKey。提前感谢您的帮助!!
我发现 peapv0-ms-chapv2 使用 tls material 生成两个 32 字节的密钥。 rfc 没有说清楚,弄糊涂了,直到我尝试使用 tls 方法生成密钥并尝试了一下,它起作用了。
public static void ComputeMPPEKeys(byte[] masterSecret, byte[] ClientRandom, byte[] serverRandom, out byte[] mppeSendKey, out byte[] mppeRecvKey)
{
//PRF(master secret, "client EAP encryption", random) is computed up to 128 bytes,
//the value random defined as the concatenation of the handshake message fields client_hello.random and server_hello.random(in that order),
//and the value PRF("", "client EAP encryption", random) is computed up to 64 bytes(where "" is an empty string).
var random = new List<byte>();
random.AddRange(ClientRandom);
random.AddRange(serverRandom);
var label = "client EAP encryption";
var firstResult = PRF(masterSecret, label, random.ToArray(), 128);
//not really needed
var secondResult = PRF(new byte[0], label, random.ToArray(), 64);
mppeRecvKey = firstResult.Take(32).ToArray();
mppeSendKey = firstResult.Skip(32).Take(32).ToArray();
}