如何生成peapv0-mschapv2 ms-mppe密钥?

时间:2018-01-12 19:06:35

标签: freeradius radius radius-protocol

我正在开发一个自定义radius服务器来验证无线客户端,使用peapv0-mschapv2,在最后一步,不知道如何在Access中生成ms-mppe-send-key和ms-mppe-revc-key-接受数据包,我已经按照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。谢谢你提前帮忙!!

1 个答案:

答案 0 :(得分:1)

我发现peapv0-ms-chapv2使用tls材料生成两个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();

    }