forked from Insuline13/HEIGVD-SWI22-Labo2-WEP
-
Notifications
You must be signed in to change notification settings - Fork 0
/
manual-decryption.py
45 lines (34 loc) · 1.29 KB
/
manual-decryption.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env python
# -*- coding: utf-8 -*-
""" Manually decrypt a wep message given the WEP key"""
__author__ = "Abraham Rubinstein"
__copyright__ = "Copyright 2017, HEIG-VD"
__license__ = "GPL"
__version__ = "1.0"
__email__ = "[email protected]"
__status__ = "Prototype"
from scapy.all import *
import binascii
from rc4 import RC4
#Cle wep AA:AA:AA:AA:AA
key= b'\xaa\xaa\xaa\xaa\xaa'
#lecture de message chiffré - rdpcap retourne toujours un array, même si la capture contient un seul paquet
arp = rdpcap('arp.cap')[0]
# rc4 seed est composé de IV+clé
seed = arp.iv+key
# recuperation de icv dans le message (arp.icv) (en chiffre) -- je passe au format "text". Il y a d'autres manières de faire ceci...
icv_encrypted='{:x}'.format(arp.icv)
# text chiffré y-compris l'icv
message_encrypted=arp.wepdata+bytes.fromhex(icv_encrypted)
# déchiffrement rc4
cipher = RC4(seed, streaming=False)
cleartext=cipher.crypt(message_encrypted)
# le ICV est les derniers 4 octets - je le passe en format Long big endian
icv_enclair=cleartext[-4:]
icv_enclair = icv_enclair
icv_numerique=struct.unpack('!L', icv_enclair)
# le message sans le ICV
text_enclair=cleartext[:-4]
print ('Text: ' + text_enclair.hex())
print ('icv: ' + icv_enclair.hex())
print ('icv(num): ' + str(icv_numerique))