Saya mengembangkan server radius khusus untuk mengautentikasi klien nirkabel, menggunakan peapv0-mschapv2, pada langkah terakhir, tidak yakin bagaimana membuat ms-mppe-send-key dan ms-mppe-revc-key dalam paket Access-Accept, saya telah mengikuti rfc3079 untuk menghasilkan kunci sesi 128 bit, tetapi dengan langkah terakhir, tidak yakin apa yang harus dilakukan dengan fungsi rc4_key(),

Dari rfc3079

GetNewKeyFromSHA(MasterSendKey, MasterSendKey, 16, SendSessionKey) GetNewKeyFromSHA(MasterReceiveKey, MasterReceiveKey, 16, ReceiveSessionKey)

Akhirnya, tabel RC4 diinisialisasi menggunakan kunci sesi baru:

  rc4_key(SendRC4key, 16, SendSessionKey)
  rc4_key(ReceiveRC4key, 16, ReceiveSessionKey)

Saya menghasilkan 16 byte SendSessionKey dan 16 byte ReceiveSessionKey, tetapi tidak yakin dari mana SendRC4Key dan ReceiveRC4Key berasal. tidak mengatakan dengan rfc :(

Kemudian saya mencoba menggunakan SendSessionKey dan ReceiveSessionKey untuk mengikuti rfc2548 dan mengenkripsi ms-mppe-send-key dan ms-mppe-recv-key dan mengirim ke klien, tetapi tidak berhasil, klien terus mengatur ulang dan memulai kembali dari klien halo. ketika saya melakukan pencarian online, sepertinya radius bebas menggunakan kunci 32 byte untuk melakukan enkripsi dan mengirim ke klien. tidak yakin bagaimana cara mendapatkan SendSessionKey 32 byte juga. Terima kasih sebelumnya atas bantuan apa pun !!

1
YanXi 12 Januari 2018, 22:06

1 menjawab

Jawaban Terbaik

Saya telah menemukan bahwa peapv0-ms-chapv2 menggunakan bahan tls untuk menghasilkan dua kunci 32 byte. rfc tidak menjelaskannya, membingungkan saya sampai saya mencoba menggunakan metode tls untuk menghasilkan kunci dan mencobanya, dan itu berhasil.

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();

    }
1
YanXi 13 Januari 2018, 23:16