for i in range(3):
    # Warning : afin de tester, message non divisible par 3 peut avoir des pertes d'informations
    fragmentSize = int(len(message) / 3)
    # Découpe le message en fragments
    fragmentMessage = message[fragmentSize * i:fragmentSize * (i + 1)]
    # Calcul de l'ICV du fragment actuel
    icv = zlib.crc32(fragmentMessage).to_bytes(4, byteorder='little')

    # On chiffre le fragment + icv.
    seed = iv + key
    cipher = RC4(seed, streaming=False)
    encrypted_message = cipher.crypt(fragmentMessage + icv)

    # On crée un nouveau packet avec les bonnes valeurs.
    wepdata = encrypted_message[:-4]
    encrypted_icv = int.from_bytes(encrypted_message[-4:], byteorder='big')
    # Si ce n'est pas le dernier fragment (!= 2) l'on rajout MF (More Fragments) à notre frame Dot11
    if i != 2:
        pck = RadioTap() / Dot11(type='Data',
                                 FCfield='to-DS+protected+MF') / Dot11WEP(
                                     iv=iv, wepdata=wepdata, icv=encrypted_icv)
    else:
        pck = RadioTap() / Dot11(type='Data',
                                 FCfield='to-DS+protected') / Dot11WEP(
                                     iv=iv, wepdata=wepdata, icv=encrypted_icv)

    pck.SC = i
    # On ajoute le fragment dans une capture pcap.
    wrpcap('ex3.cap', pck, append=True)
    print(pck.show())
# Calcul de l'ICV du message
count = 0
for i, message in enumerate(messages):

    # Creation de l'ICV a l'aide d'un CRC32
    icv = crc32(message).to_bytes(4, byteorder='little')

    # Les données a chiffrer sont le message et l'ICV
    message_to_encrypt = message + icv

    # chiffrement rc4
    cipher = RC4(seed, streaming=False)
    encrypted_data = cipher.crypt(message_to_encrypt)

    # On extrait l'ICV chiffré (4 dernier byte)
    encrypted_icv = int.from_bytes(encrypted_data[-4:], byteorder='big')

    # On regarde si c'est notre dernier paquet, si c'est le cas on ne met pas le flag MF (more fragment)
    flags = ""
    if i != len(messages) - 1:
        flags = "to-DS+protected+MF"
    else:
        flags = "to-DS+protected"

    # On creer notre paquet WEP
    packet = RadioTap() / Dot11(type='Data', FCfield=flags) / Dot11WEP(
        iv=iv, wepdata=encrypted_data[:-4], icv=encrypted_icv)
    # On donne le numéro de paquet
    packet.SC = i
    wrpcap('task3.cap', packet, append=True)