示例#1
0
 def __init__(self,socet,ip_port,s):
     self.alice = DiffieHellman()
     self.key = None
     self.socet = socet
     self.ip = ip_port[0]
     self.port = ip_port[1]
     self.alice.generate_public_key() 
示例#2
0
    def __init__(self, adress):

        self.sock.connect((adress, 9876))
        if os.path.isfile('User.private.pem') == False or os.path.isfile(
                'client1.cert.pem') == False:
            createCSR('User', 'heslo', {'CN': 'USER_FQDN'})
            self.poslatCertReq()
            print("ZADAM SI CERTIFIKAT")

        else:
            print("NACITAM ZE SLOZKY JAK BOSSs")
            self.cert = OpenSSL.crypto.load_certificate(
                crypto.FILETYPE_PEM,
                open('client1.cert.pem').read())
            self.poslatCert()

        self.cli = DiffieHellman()
        self.cli.generate_public_key()
        #presunout do runu
        self.vyzadatKlic()

        iThread = threading.Thread(target=self.sendMessage)
        iThread.daemon = True
        iThread.start()
        self.run()
示例#3
0
 def __init__(self, host, port, login, password):
     asyncore.dispatcher.__init__(self)
     self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
     self.connect((host, port))
     self.login = login
     self.password = password
     self.Key = DiffieHellman()
     self.Key.generate_public_key()
     self.buffer = json.dumps({'action': 'handshake', 'data': {'pubkey': int_to_base_str(self.Key.public_key)}}).encode()
     self.cipher = None
示例#4
0
class Node:
    def __init__(self, node_id):
        self.node_id = node_id
        self.authorised_users = []
        self.transaction_history = []

        # Set up crypto
        self.diffie = DiffieHellman()
        self.exchange_keys()

        self.sync()

        print("Node Established.")

    def sync(self):
        conn = socket.socket()
        conn.connect((SERVER_IP, SERVER_PORT))
        conn.send(self.crypt(b"SYNC"))

    def update_authorised_users(self):
        pass

    def send_transactions(self):
        pass

    def main_loop(self):
        pass

    def exchange_keys(self):
        self.diffie.generate_public_key()
        conn = socket.socket()
        conn.connect((SERVER_IP, SERVER_PORT))
        conn.send(self.crypt(self.node_id.zfill(8).encode()))
        conn.send(b"KEYX")
        key_len = str(len(str(self.diffie.public_key))).zfill(4).encode()
        conn.send(key_len)
        conn.send(str(self.diffie.public_key).encode())

        server_key_len = int(conn.recv(4))
        server_key = int(conn.recv(server_key_len))

        self.diffie.generate_shared_secret(server_key)
        conn.close()

    def crypt(self, text):
        key = self.diffie.shared_key
        if type(text) == str:
            text = text.encode()
        if type(key) == str:
            key = key.encode()
        assert type(text) == type(key) == bytes
        output_values = []
        for i, b in enumerate(text):
            output_values.append(b ^ key[i % len(key)])
        return bytes(output_values)
示例#5
0
    def __init__(self):
        self._sock_to_receiver = socket.socket(socket.AF_INET,
                                               socket.SOCK_STREAM)
        self._sock_to_mb = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        self._df = DiffieHellman()
        self._df.generate_private_key()
        self._df.generate_public_key()

        self._session_key = None
        self._k = None
        self._k_rand = None
示例#6
0
    def __init__(self, node_id):
        self.node_id = node_id
        self.authorised_users = []
        self.transaction_history = []

        # Set up crypto
        self.diffie = DiffieHellman()
        self.exchange_keys()

        self.sync()

        print("Node Established.")
示例#7
0
    def __init__(self, adress='127.0.0.1'):

        self.sock.connect((adress, 9876))

        self.cli = DiffieHellman()
        self.cli.generate_public_key()
        self.vyzadatKlic()

        iThread = threading.Thread(target=self.sendMessage)
        iThread.daemon = True
        iThread.start()
        self.run()
示例#8
0
class MessangerClient(asyncore.dispatcher):

    def __init__(self, host, port, login, password):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connect((host, port))
        self.login = login
        self.password = password
        self.Key = DiffieHellman()
        self.Key.generate_public_key()
        self.buffer = json.dumps({'action': 'handshake', 'data': {'pubkey': int_to_base_str(self.Key.public_key)}}).encode()
        self.cipher = None

    def handle_connect(self):
        pass

    def handle_close(self):
        self.close()

    def handle_read(self):
        data = self.recv(4024).decode('utf-8')
        if data:
            if self.cipher is not None:
                j = json.loads(self.cipher.decrypt(data))
            else:
                j = json.loads(data)
            print(j)

            if j["action"] == "handshake":
                tmp = base_str_to_int(j["data"]["pubkey"])
                h = SHA.new(j["data"]["pubkey"].encode()).digest()
                self.Key.generate_shared_secret(tmp)
                SignR = int(j["data"]["SignR"])
                SignS = int(j["data"]["SignS"])

                if not ElGamalKey.verify(h, (SignR, SignS)):
                    raise("BAD SIGNATURE")

                self.cipher = AESCipher(str(self.Key.shared_key).encode())
                self.buffer = json.dumps({'action': 'auth', 'data': {'login': login, 'pass': password}}).encode('utf-8')

    def writable(self):
        return len(self.buffer) > 0

    def handle_write(self):
        if self.cipher is not None:
            sent = self.send(self.cipher.encrypt(self.buffer.decode()))
            self.buffer = self.buffer[sent:]
        else:
            sent = self.send(self.buffer)
            self.buffer = self.buffer[sent:]
示例#9
0
    def __init__(self):
        self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self._sock_to_mb = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        self._sock.bind(ADDRESS)
        self._sock.listen(10)

        self._df = DiffieHellman()
        self._df.generate_private_key()
        self._df.generate_public_key()

        self._session_key = None
        self._k = None
        self._k_rand = None
示例#10
0
class client:
    def __init__(self,socet,ip_port,s):
        self.alice = DiffieHellman()
        self.key = None
        self.socet = socet
        self.ip = ip_port[0]
        self.port = ip_port[1]
        self.alice.generate_public_key() 
        #self.ip = ip
    def df(self):
        m_df = {["alice":self.alice.public_key]}        
        self.socet.send(json.dumps(m_df))
        data = self.socet.recv(json.dumps(m_df))
        if data: 
示例#11
0
def main():
    """Main loop

    See vpn.md for details
    """
    # Create the socket
    server_sckt = socket(AF_INET, SOCK_STREAM)
    server_sckt.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    server_sckt.bind((HOST, PORT))
    server_sckt.listen()
    print(f"Listening on {HOST}:{PORT}")
    conn, client = server_sckt.accept()
    print(f"New client: {client[0]}:{client[1]}")

    # Negotiating the cipher
    print("Negotiating the cipher")
    msg_in = conn.recv(4096).decode('utf-8')
    proposed = parse_proposal(msg_in)
    cipher_name, key_size = select_cipher(SUPPORTED_CIPHERS, proposed)
    print(f"We are going to use {cipher_name}{key_size}")
    msg_out = generate_cipher_response(cipher_name, key_size)
    conn.send(msg_out.encode())

    # Negotiating the key
    print("Negotiating the key")
    dh = DiffieHellman()
    dh.generate_public_key()
    msg_in = conn.recv(4096).decode('utf-8')
    client_public_key = parse_dhm_request(msg_in)
    dh.generate_shared_secret(client_public_key)
    msg_out = generate_dhm_response(dh.public_key)
    conn.send(msg_out.encode())
    cipher, key, iv = get_key_and_iv(dh.shared_key, cipher_name, key_size)
    print("The key has been established")

    print("Initializing cryptosystem")
    crypto = cipher.new(key, cipher.MODE_CBC, iv)
    hashing = HMAC.new(key, digestmod=SHA256)
    print("All systems ready")

    while True:
        msg_in = conn.recv(4096)
        if len(msg_in) < 1:
            conn.close()
            break
        msg, hmac = read_message(msg_in, crypto)
        validate_hmac(msg_in, hmac, hashing)
        print(f"Received: {msg}")
        msg_out = f"Server says: {msg[::-1]}"
        conn.send(msg_out.encode())
示例#12
0
def main():
    """Main event loop

    See vpn.md for details
    """

    # Start the server
    client_sckt = socket(AF_INET, SOCK_STREAM)
    client_sckt.connect((HOST, PORT))
    print(f"Connected to {HOST}:{PORT}")

    # Negotiating the cipher
    print("Negotiating the cipher")
    # Send proposal to the server
    msg_out = generate_cipher_proposal(SUPPORTED_CIPHERS)
    client_sckt.send(msg_out.encode())
    msg_in = client_sckt.recv(4096).decode('utf-8')
    cipher_name, key_size = parse_cipher_selection(msg_in)
    print(f"We are going to use {cipher_name}{key_size}")

    # Negotiating the key
    print("Negotiating the key")
    dh = DiffieHellman()
    dh.generate_public_key()
    msg_out = generate_dhm_request(dh.public_key)
    client_sckt.send(msg_out.encode())
    msg_in = client_sckt.recv(4096).decode('utf-8')
    server_public_key = parse_dhm_response(msg_in)
    dh.generate_shared_secret(server_public_key)
    cipher, key, iv = get_key_and_iv(dh.shared_key, cipher_name, key_size)
    print("The key has been established")

    # Initialize Cryptosystem
    print("Initializing cryptosystem")
    crypto = cipher.new(key, cipher.MODE_CBC, iv)
    hashing = HMAC.new(key, digestmod=SHA256)
    print("All systems ready")

    while True:
        msg = input("Enter message: ")
        if msg == "\\quit":
            client_sckt.close()
            break
        ciph_out, hmac_out = encrypt_message(msg, crypto, hashing)
        client_sckt.send(ciph_out + hmac_out.encode())
        msg_in = client_sckt.recv(4096)
        print(msg_in.decode("utf-8"))
示例#13
0
    def key_exchange(self, conn, addr):
        diffie = DiffieHellman()
        diffie.generate_public_key()
        public_key = diffie.public_key
        key_to_send = str(public_key).encode()
        key_len = str(len(key_to_send)).zfill(4).encode()

        client_key_len = int(conn.recv(4))
        client_key = int(conn.recv(client_key_len))
        conn.send(key_len)
        conn.send(key_to_send)

        diffie.generate_shared_secret(client_key)

        client_id = crypt(conn.recv(8), diffie.shared_key).decode()
        conn.close()

        self.store_node(client_id, addr, diffie.shared_key)
示例#14
0
    def session(self):
        alice = DiffieHellman(group=5, key_length=200)
        alice.generate_public_key()
        self.Message_send.message = str(alice.public_key)
        # send puzzle answer and ga mod p
        self.send_message()

        # receive the session key of server
        self.receive_message()

        alice.generate_shared_secret(int(self.Message_rec.gb_mod_p))
        # set up the session key Kas
        self.Kas = str(alice.shared_secret)[:16].encode()
        self.iv = self.Message_rec.iv
        # print("Shared secret is:", int.from_bytes(self.Kas, sys.byteorder))

        # Decryption
        plain_text = self.decryption_with_timestamp()

        # Verify signature
        correct_message = str(
            alice.public_key) + "|" + self.Message_rec.gb_mod_p
        correct_message = correct_message.encode()

        ## load public key
        with open("public_key.der", "rb") as key_file:
            public_key = serialization.load_der_public_key(
                key_file.read(), backend=default_backend())

        ##  verify the signature
        try:
            public_key.verify(
                plain_text, correct_message,
                paddings.PSS(mgf=paddings.MGF1(hashes.SHA256()),
                             salt_length=paddings.PSS.MAX_LENGTH),
                hashes.SHA256())
            # print("Signature verify success!")
        except:
            print('Error in verifying the signature!')
            sys.exit(1)
示例#15
0
class Sender:
    def __init__(self):
        self._sock_to_receiver = socket.socket(socket.AF_INET,
                                               socket.SOCK_STREAM)
        self._sock_to_mb = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        self._df = DiffieHellman()
        self._df.generate_private_key()
        self._df.generate_public_key()

        self._session_key = None
        self._k = None
        self._k_rand = None

    def connect(self, address):
        """
        The sender(S) in this connect method will attempt to connect
        to the receiver(R) by a regular sock connection. If the
        connection is set up successfully, S and R will execute a key
        exchange protocol then both of them will get a shared secret
        key. After that three keys (a session key Kssl, a key K used in our
        detection protocol, and a key Krand used as a seed) will be derived
        from this secret key. Then, S will try to connect to the middle-
        box by another regular sock connection. If the connection is
        set up successfully, S will execute a secure computation with MB
        so that MB can obtain rules encrypted with key K without knowing K.
        :param address: the receiver's address
        :return:
        """
        try:
            self._sock_to_receiver.connect(address)
        except socket.error as error:
            print(f'Could not connect with the receiver: {error}')
            exit(1)
        except TypeError as error:
            print(f'Type error: {error}')
            exit(1)
        else:
            self._key_exchange(self._df.public_key)
            self._derive_from_secret()
            print('session key', self._session_key)

        try:
            self._sock_to_mb.connect(BLINDBOX_ADDRESS)
        except socket.error as error:
            print(f'Could not connect with blindBox: {error}')
            exit(1)
        except TypeError as error:
            print(f'Type error: {error}')
            exit(1)
        else:
            self._rule_preparation()

    def _key_exchange(self, public_key):
        """
        After a key exchange using Diffie-Hellman algorithm,
        the sender will agree on a shared secret with the receiver.
        :param public_key: The sender's public key for key exchange.
        :return: None
        """
        key_to_bytes = str(public_key).encode()
        self._sock_to_receiver.sendall(key_to_bytes)

        data = self._sock_to_receiver.recv(20480)
        print(f'data received from the receiver {data}')

        try:
            pk_from_receiver = int(data)
        except ValueError:
            print('Invalid data type!')
        else:
            if self._df.verify_public_key(pk_from_receiver):
                self._df.generate_shared_secret(pk_from_receiver)
                print('I got the shared key:', self._df.shared_key)
            else:
                raise ValueError('Invalid public key from the sender!')

    def _derive_from_secret(self):
        """
        Use the shared key to derive three keys by using a pseudorandom
        generator.
        _session_key: used to encrypt the traffic in the socket.
        _k: used in the detection protocol
        _k_rand: used as a seed for randomness. Since both end-points have the same seed,
                 they will generate the same randomness.
        :return: None
        """
        key_to_bytes = str(self._df.shared_key).encode()

        randoms = Randoms()
        self._session_key = derive_key(key_to_bytes, randoms.random1)
        self._k = derive_key(key_to_bytes, randoms.random2)
        self._k_rand = derive_key(key_to_bytes, randoms.random3)

    def _rule_preparation(self):
        """
        Sender will use garbled circuits to compute AES(r,k) with the BlindBox while
        the sender do not know the rule and the BlindBox do not know the key k.
        :return:
        """
        key_numbers = int(self._sock_to_mb.recv(1024))
        for i in range(key_numbers):
            output = subprocess.getoutput(OBLIVC_AES_PATH + "/a.out 1235 -- " +
                                          self._k.decode())
            while output == "TCP accept failed":
                output = subprocess.getoutput(OBLIVC_AES_PATH +
                                              "/a.out 1235 -- " +
                                              self._k.decode())

    def send(self, data):
        encrypted_data = aes_encrypt(data.encode(), self._session_key)

        self._sock_to_mb.sendall(encrypted_data)
        sleep(0.4)

        tokens = nltk.word_tokenize(data)
        encrypted_tokens = b''
        for token in tokens:
            encrypted_tokens += dpi_encrypt(token.encode(), self._session_key)
            encrypted_tokens += b' '

        self._sock_to_mb.sendall(encrypted_tokens)
 def setUp(self):
     self.alice = DiffieHellman()
     self.bob = DiffieHellman()
class TestDiffieHellman(unittest.TestCase):
    def setUp(self):
        self.alice = DiffieHellman()
        self.bob = DiffieHellman()

    def test_equality_of_keys(self):
        self.alice.generate_public_key()
        self.bob.generate_public_key()

        alices_shared_key = self.alice.generate_shared_secret(
            self.bob.public_key)
        bobs_shared_key = self.bob.generate_shared_secret(
            self.alice.public_key)

        self.assertEqual(
            alices_shared_key, bobs_shared_key,
            "There is a mismatch between two shared secrets. Both shared secrets should be the same. This is bad."
        )

    def test_decorators_private_key(self):
        self.alice.generate_public_key()
        self.assertIn("_DiffieHellman__private_key", self.alice.__dict__)

    def test_generate_private_key(self):
        self.alice.generate_private_key()
        self.assertIn("_DiffieHellman__private_key", self.alice.__dict__)

    def test_generate_public_key(self):
        self.alice.generate_public_key()
        self.assertIn("public_key", self.alice.__dict__)

    def test_verify_public_key(self):
        self.alice.generate_public_key()
        self.bob.generate_public_key()
        self.assertTrue(self.alice.verify_public_key(self.bob.public_key))
        self.assertFalse(self.alice.verify_public_key(2))
        self.assertFalse(self.alice.verify_public_key(self.alice.prime - 1))
示例#18
0
class Client:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    mujAES = None
    cli = None
    cislo = 0

    def __init__(self, adress):

        self.sock.connect((adress, 9876))
        if os.path.isfile('User.private.pem') == False or os.path.isfile(
                'client1.cert.pem') == False:
            createCSR('User', 'heslo', {'CN': 'USER_FQDN'})
            self.poslatCertReq()
            print("ZADAM SI CERTIFIKAT")

        else:
            print("NACITAM ZE SLOZKY JAK BOSSs")
            self.cert = OpenSSL.crypto.load_certificate(
                crypto.FILETYPE_PEM,
                open('client1.cert.pem').read())
            self.poslatCert()

        self.cli = DiffieHellman()
        self.cli.generate_public_key()
        #presunout do runu
        self.vyzadatKlic()

        iThread = threading.Thread(target=self.sendMessage)
        iThread.daemon = True
        iThread.start()
        self.run()

    def run(self):

        while True:
            data = self.sock.recv(BUFSIZE)
            #misto na hrani si s daty
            if not data:
                #ukonceni komunikace
                break
            elif data[0:1] == b"\x66":
                with open('client1.cert.pem', 'wb') as cert:
                    cert.write(data[1:])
                self.nastavitCert(data[1:])
                #self.cert=OpenSSL.crypto.load_certificate(crypto.FILETYPE_PEM,data[1:])
            elif data[0:1] == b"\x11":
                #kdyz prijde ridici znak x11-posleme na vyzadani klic
                self.poslatKlic()
            elif data[0:1] == b"\x98":
                createCSR('User', 'heslo', {'CN': 'USER_FQDN'})
                self.poslatCertReq()

            elif data[0:1] == b"\x12":
                #kdyz prijde ridici znak x12 tak si nastavime klic ktery nasleduje po tomto bytu
                self.nastavitKlic(data[1:])

            elif data[0:1] == b"\x13":
                #nezasifrovana komunikace
                print(data.decode())
                #vynuceni DH pokud prijde nezasifrovana zprava
                #self.sock.send(b'\x11')
            elif data[0:1] == b"\x14":
                #nastaveni klice v pripade ze byl vyzadan nebo tak neco
                self.jinenastaveniklice(data[1:])
            elif data[0:1] == b'\x20':
                self.nastavitCert(data[1:])
            else:
                #vychozi stav- prijdou data bez ridiciho znaku-> predpokladame ze jsou zasifrovana AESem podle dohodnuteho hesla
                data = self.mujAES.decrypt(data)
                try:
                    print("client " + str(self.cislo) + ":" + data.decode())
                except:
                    continue

    def vyzadatCert(self):
        self.sock.send(b'\x65')

    def nastavitCert(self, data):
        #self.cert=OpenSSL.crypto.load_certificate_request(crypto.FILETYPE_PEM, data)
        self.cert = OpenSSL.crypto.load_certificate(crypto.FILETYPE_PEM, data)

    def poslatCert(self):
        text = OpenSSL.crypto.dump_certificate(crypto.FILETYPE_PEM, self.cert)
        self.sock.send(b'\x33' + text)

    def poslatCertReq(self):
        #posle certifikat na podepsani¨
        with open('User.CSR.pem') as cert:
            certificate = OpenSSL.crypto.load_certificate_request(
                crypto.FILETYPE_PEM, cert.read())
            certext = OpenSSL.crypto.dump_certificate_request(
                crypto.FILETYPE_PEM, certificate)
            print(certext)
            self.sock.send(b'\x15' + certext)

    def poslatKlic(self):
        #posle ridici znak nasledovany klicem
        self.sock.send(b'\x12' + str(self.cli.public_key).encode())

    def jinenastaveniklice(self, data):
        #dela zajimave veci, ale jen v urcitem pripade
        self.cli.generate_shared_secret(int(data.decode()),
                                        echo_return_key=True)
        superklic = str(self.cli.shared_secret)
        xy = hashlib.sha256(superklic.encode()).hexdigest()[:32]
        print("2222222222222222222222222222")
        self.cislo = 2
        print(xy)
        self.mujAES = Encryptor.Encryptor(xy)

    def nastavitKlic(self, data):
        #nastavuje klic na zaklade dat ktere dostane
        self.cli.generate_shared_secret(int(data.decode()),
                                        echo_return_key=True)
        superklic = str(self.cli.shared_secret)
        xy = hashlib.sha256(superklic.encode()).hexdigest()[:32]
        print("111111111111111111111")
        self.cislo = 1
        print(xy)
        self.mujAES = Encryptor.Encryptor(xy)
        self.sock.send(b'\x14' + str(self.cli.public_key).encode())

    def vyzadatKlic(self):
        #nemam klic ale chci, poslu ridici znak
        self.sock.send(b'\x11')

    def sendMessage(self):
        #hlavni chatova smycka

        while True:
            msg = str(input(""))

            if self.mujAES is not None:
                msg = self.mujAES.encrypt(msg.encode())
                self.sock.send(msg)
            else:
                msg = msg.encode()
                self.sock.send(b'\x13' + msg)
示例#19
0
def requestHandler(conn, addr):
    '''
		This method handles a new download request
	'''

    # First generate a public-private key pair
    dh = DiffieHellman()
    dh.generate_public_key()
    publicKey = dh.public_key

    # Next, send the public key using KEY_EXCHANGE. The segment size is 2479.
    conn.sendall(('KEY_EXCHANGE\n' + str(publicKey)).encode('utf-8',
                                                            errors='ignore'))

    # Receive a similar segment from client. This segment contains the client's public key.
    data = receiveData(conn, 2479)

    messageType = data.decode('utf-8', errors='ignore').split('\n')[0]
    if messageType != 'KEY_EXCHANGE':
        print("The client sent an illegal response. Closing connection..")
        conn.close()
        return

    clientPublicKey = int(data.decode('utf-8', errors='ignore').split('\n')[1])
    sharedKey = ''

    # Generate the shared key using Diffie Hellman algorithm and the public key of client and server
    try:
        dh.generate_shared_secret(clientPublicKey)
        sharedKey = bytes.fromhex(dh.shared_key)
    except Exception as e:
        print("The client sent an illegal response. Closing connection..")
        conn.close()
        return

    print('Key exchange successful: ' + dh.shared_key)

    print('Generating Ciphers..')

    # Generate a cipher which will use the shared key to encrypt all outgoing data

    cipher = AES.new(sharedKey, AES.MODE_CBC,
                     'jdirlfhixhtkwlif'.encode('utf-8'))

    print('Encrypting File list..')

    # Encrypt the file list with the cipher

    sharedFilesList = []

    for i in sharedFiles:
        sharedFilesList.append(i)

    fileList = ('\n'.join(sharedFilesList)).encode('utf-8')
    encryptedFileList = cipher.encrypt(pad(fileList, AES.block_size))
    requiredSize = len(encryptedFileList)

    # Send the file list size. We use FILELIST to send the file list size
    print('Sending File List..')

    conn.sendall(
        ('FILELIST\n' + padInteger(requiredSize, 20)).encode('utf-8',
                                                             errors='ignore'))

    # Wait till the server doesn't receive READY signal indicating that the client is ready to take the data
    data = receiveData(conn, 5).decode('utf-8', errors='ignore')

    if data != 'READY':
        print('Client is not ready to receive file list..')
        conn.close()
        return

    # Send the encrypted file list now. The segments contain only body and no header
    conn.sendall(encryptedFileList)

    # Wait for acknowloedgement
    data = receiveData(conn, 3).decode('utf-8', errors='ignore')
    if data == 'ACK':
        print('File list was received successfully by client..')
    else:
        print('No Acknowledgement received..')
        conn.close()
        return

    # Wait for a file request
    print('Waiting for request..')

    data = receiveData(conn, 28).decode('utf-8', errors='ignore').split('\n')
    idx = int(data[1])
    if data[0] != 'REQUEST':
        print('The client sent an illegal response. Closing connection..')
        conn.close()
    else:
        if idx < 0 or idx >= len(sharedFilesList):
            print(
                '\n\nThe client sent an illegal response. Closing connection..'
            )
            conn.close()
            return
        else:
            # Open the requested file. Encrypt it with the cipher and send it.
            fileName = sharedFilesList[idx].split('/')
            fileName = fileName[len(fileName) - 1]
            file = open(sharedFilesList[idx], 'rb')
            unencryptedData = file.read()
            file.close()
            cipher = AES.new(sharedKey, AES.MODE_CBC,
                             'jdirlfhixhtkwlif'.encode('utf-8'))
            encryptedData = cipher.encrypt(pad(unencryptedData,
                                               AES.block_size))
            requiredPackets = len(encryptedData)

            # Send the file size. We use FILE to send the file size
            conn.sendall(('FILE\n' + padInteger(requiredPackets, 20)).encode(
                'utf-8', errors='ignore'))

            # Wait for the ready signal
            data = receiveData(conn, 5).decode('utf-8', errors='ignore')
            if data != 'READY':
                print('Client is not ready to receive the file..')
                conn.close()
                return
            print("Sending the file '" + fileName + "'.")

            # Sent the encrypted file
            conn.sendall(encryptedData)
            print("Sent! Awaiting Acknowledgement..")

            # Wait for acknowledgement
            data = receiveData(conn, 3).decode('utf-8', errors='ignore')
            if data == 'ACK':
                print('Client received the file successfully')
                conn.close()
            else:
                print('An unknown error occured in file transfer')
                conn.close()
class TestDiffieHellman(unittest.TestCase):
    def setUp(self):
        self.alice = DiffieHellman()
        self.bob = DiffieHellman()

    def test_equality_of_keys(self):
        self.alice.generate_public_key()
        self.bob.generate_public_key()

        alices_shared_key = self.alice.generate_shared_secret(self.bob.public_key)
        bobs_shared_key = self.bob.generate_shared_secret(self.alice.public_key)

        self.assertEqual(alices_shared_key, bobs_shared_key,
                         "There is a mismatch between two shared secrets. Both shared secrets should be the same. This is bad.")

    def test_decorators_private_key(self):
        self.alice.generate_public_key()
        self.assertIn("_DiffieHellman__private_key", self.alice.__dict__)

    def test_generate_private_key(self):
        self.alice.generate_private_key()
        self.assertIn("_DiffieHellman__private_key", self.alice.__dict__)

    def test_generate_public_key(self):
        self.alice.generate_public_key()
        self.assertIn("public_key", self.alice.__dict__)

    def test_verify_public_key(self):
        self.alice.generate_public_key()
        self.bob.generate_public_key()
        self.assertTrue(self.alice.verify_public_key(self.bob.public_key))
        self.assertFalse(self.alice.verify_public_key(2))
        self.assertFalse(self.alice.verify_public_key(self.alice.prime - 1))
示例#21
0
    def handle_sock(self, sock, addr):  # sock 的流程
        ##############################
        #### Handle a new request#####
        ####                     #####
        ##############################
        while True:
            data = sock.recv(4096)
            # print ("I have received a new message!")
            MessageRec = COMM_MESSAGE()
            MessageRec.ParseFromString(data)

            if (MessageRec.type == COMM_MESSAGE.TYPE.LOGOUT):
                plain_text = self.decryption_with_timestamp_in_client(
                    MessageRec, self.socket_from_list[src][1],
                    self.socket_from_list[src][2])
                plain_text = plain_text.decode()
                print("I received log out request_1")
                print(plain_text)
                if (plain_text == "log out"):
                    MessageSend = COMM_MESSAGE()
                    MessageSend.type = COMM_MESSAGE.TYPE.CONFIRM
                    plain_text = 'log out confirmed'.encode() + str(
                        int(time.time())).encode()
                    MessageSend = self.encryption_in_client(
                        MessageSend, self.socket_from_list[src][1],
                        self.socket_from_list[src][2], plain_text)
                    self.socket_from_list[src][0].sendall(
                        MessageSend.SerializeToString())
                    self.socket_from_list[src][0].close()

                    del self.socket_from_list[src]
                    del self.user_online[src]

            if (MessageRec.type == COMM_MESSAGE.TYPE.CLIENT_TO_CLIENT):
                plain_text = self.decryption_of_ticket_with_timestamp(
                    MessageRec.ticket, MessageRec.ticket_tag)
                plain_text = plain_text.decode()
                src = plain_text.split(" ")[0]
                # self.socket_from_list[src] = []
                # self.socket_from_list[src].append (sock)
                kab_temp = plain_text.split(" ")[1].encode()
                iv_temp = plain_text.split(" ")[2].encode()
                plain_text = self.decryption_with_timestamp_in_client(
                    MessageRec, kab_temp, iv_temp)
                plain_text = plain_text.decode()

                N1 = int(plain_text)
                y = os.urandom(8)
                x = y.hex()
                N2 = int(x, 16)
                plain_text = (str(N1 - 1) + " " + str(N2)).encode() + str(
                    int(time.time())).encode()
                # .encode() + " ".encode + str(N2).encode()

                MessageSend = COMM_MESSAGE()

                bob = DiffieHellman(group=5, key_length=200)
                bob.generate_public_key()
                MessageSend.gb_mod_p = str(bob.public_key)
                MessageSend = self.encryption_in_client(
                    MessageSend, kab_temp, iv_temp, plain_text)
                sock.sendall(MessageSend.SerializeToString())

                MessageRec = COMM_MESSAGE()
                data = sock.recv(4096)
                MessageRec.ParseFromString(data)

                plain_text = self.decryption_with_timestamp_in_client(
                    MessageRec, kab_temp, iv_temp)
                N2_rec = int(plain_text.decode())
                if N2 - 1 == N2_rec:
                    bob.generate_shared_secret(int(MessageRec.message))
                    kas = str(bob.shared_secret)[:16].encode()
                    # self.socket_list[src].append(str(bob.shared_secret)[:16].encode())
                    temp = os.urandom(16)
                    iv = temp.hex()[:16].encode()
                    # self.socket_list[src].append(iv)

                    plain_text = ("Confirm " +
                                  self.client_name).encode() + str(
                                      int(time.time())).encode()
                    MessageSend = COMM_MESSAGE()
                    MessageSend.iv = iv
                    MessageSend = self.encryption_in_client(
                        MessageSend, kas, iv, plain_text)
                    sock.sendall(MessageSend.SerializeToString())

                    MessageRec = COMM_MESSAGE()
                    data = sock.recv(4096)
                    MessageRec.ParseFromString(data)

                    plain_text = self.decryption_with_timestamp_in_client(
                        MessageRec, kas, iv)
                    plain_text = plain_text.decode()
                    if plain_text.split(
                            " ")[0] == "Confirm" and plain_text.split(
                                " ")[1] == src:
                        client_sk = socket.socket()
                        client_sk.connect(('127.0.0.1', addr[1]))
                        # print ("I will use this socket to talk to",src,":", client_sk)
                        self.socket_from_list[src] = []
                        self.socket_from_list[src].append(client_sk)
                        self.socket_from_list[src].append(kas)
                        self.socket_from_list[src].append(iv)
                        # print("I have succeed in setting up connection with", src, "with session key:", kas)
                        # print("We use this socket to chatting:", sock)
                    else:
                        print("The adversary modify the CONFIRM message")
                else:
                    print("N2 puzzle wrong!")
                    sys.exit(1)
            else:
                plain_text = self.decryption_with_timestamp_in_client(
                    MessageRec, self.socket_from_list[src][1],
                    self.socket_from_list[src][2])
                plain_text = plain_text.decode()
                print("From", src, ":", plain_text)
示例#22
0
    def client_setup_connection(self, dest):
        client_sk = socket.socket()
        client_sk.connect(('127.0.0.1', int(self.user_online[dest][1])))
        self.socket_list[dest] = []
        self.socket_list[dest].append(client_sk)

        port = client_sk.getsockname()[1]
        # print ("Port is:", port)
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        server.bind(("127.0.0.1", port))

        #########################
        ### Set up         ######
        ### the connection ######
        #########################
        MessageSend = COMM_MESSAGE()
        MessageRec = COMM_MESSAGE()
        MessageSend.type = COMM_MESSAGE.TYPE.CLIENT_TO_CLIENT
        MessageSend.ticket = self.user_online[dest][4]
        MessageSend.ticket_tag = self.user_online[dest][5]
        kabtemp = self.user_online[dest][2].encode()
        ivtemp = self.user_online[dest][3].encode()
        y = os.urandom(8)
        x = y.hex()
        N1 = int(x, 16)
        plain_text = str(N1).encode() + str(int(time.time())).encode()
        MessageSend = self.encryption_in_client(MessageSend, kabtemp, ivtemp,
                                                plain_text)

        self.socket_list[dest][0].sendall(MessageSend.SerializeToString())

        data = self.socket_list[dest][0].recv(4096)
        MessageRec.ParseFromString(data)

        plain_text = self.decryption_with_timestamp_in_client(
            MessageRec, kabtemp, ivtemp)
        plain_text = plain_text.decode()
        N1_rec = int(plain_text.split(" ")[0])
        if N1 - 1 == N1_rec:
            MessageSend = COMM_MESSAGE()
            MessageSend.type = COMM_MESSAGE.TYPE.CLIENT_TO_CLIENT
            ### Set up the new Kab ###
            alice = DiffieHellman(group=5, key_length=200)
            alice.generate_public_key()
            MessageSend.message = str(alice.public_key)
            alice.generate_shared_secret(int(MessageRec.gb_mod_p))
            # set up the session key Kas
            self.socket_list[dest].append(
                str(alice.shared_secret)[:16].encode())
            N2_rec = int(plain_text.split(" ")[1])
            N2_send = N2_rec - 1
            plain_text = str(N2_send).encode() + str(int(time.time())).encode()
            MessageSend.iv = self.user_online[dest][3].encode()
            MessageSend = self.encryption_in_client(MessageSend, kabtemp,
                                                    ivtemp, plain_text)

            self.socket_list[dest][0].sendall(MessageSend.SerializeToString())

            data = self.socket_list[dest][0].recv(4096)
            MessageRec.ParseFromString(data)

            plain_text = self.decryption_with_timestamp_in_client(
                MessageRec, self.socket_list[dest][1], MessageRec.iv)
            plain_text = plain_text.decode()
            if plain_text.split(" ")[0] == "Confirm" and plain_text.split(
                    " ")[1] == dest:
                self.socket_list[dest].append(MessageRec.iv)
                plain_text = ("Confirm " + self.client_name).encode() + str(
                    int(time.time())).encode()
                MessageSend = COMM_MESSAGE()
                MessageSend.type = COMM_MESSAGE.TYPE.CLIENT_TO_CLIENT
                MessageSend.iv = self.socket_list[dest][2]
                self.socket_list[dest].append(server)
                client_thread_listen_from_existing_connection = threading.Thread(
                    target=self.listen_from_existed_connection,
                    args=(dest, ))  # 把sock 加入线程内
                client_thread_listen_from_existing_connection.start()  # 启动线程
                MessageSend = self.encryption_in_client(
                    MessageSend, self.socket_list[dest][1],
                    self.socket_list[dest][2], plain_text)
                self.socket_list[dest][0].sendall(
                    MessageSend.SerializeToString())
                # print ("I have succeed in setting up connection with", dest)
                # print("We use this socket to chatting:", self.socket_list[dest][0])
            else:
                print("Set up connection with", dest, "failed!")
                sys.exit(1)

        else:
            print("N1 verify failed!")
            sys.exit(1)
示例#23
0
 def _createAndSaveKeyHandler(self):
     keyHandler = DiffieHellman(key_length=200, group=5)
     keyHandler.generate_public_key()
     self._insertKeyHandlerIntoDb(keyHandler)
     return keyHandler
示例#24
0
 def setup_keys(self):
     self.dhke = DiffieHellman(key_length=1024)
     self.dhke.generate_public_key()
     self.__dh_sharedkey = None
     self.dh_pub = str(self.dhke.public_key).encode('utf8')
     (self.pubkey, self.__privkey) = rsa.newkeys(1024)
示例#25
0
class EncryptionPacket:
    PACKET_MAGIC_CODE = struct.pack('>BBBB', 0x43, 0x52, 0x59, 0x54)
    FUNCTION_INITIALIZE_HANDSHAKE = 0x00
    FUNCTION_SECURE_COMMUNICATION = 0x02

    def __init__(self, device, other):
        self.device = device
        self.other = other
        self._user = None

    def generate_key(self):
        self._user = DiffieHellman()
        self._user.generate_public_key()

    def send_complete_public_data(self):
        data = bytearray(EncryptionPacket.PACKET_MAGIC_CODE) + struct.pack(
            ">BB", EncryptionPacket.FUNCTION_INITIALIZE_HANDSHAKE, 0x55)
        self.other.send(data)

    def recv_public_data(self, data):
        hash_length = data[0]
        hash_value = data[1:hash_length + 1]
        hash_str = str()
        for i in range(0, len(hash_value)):
            hash_str += '{:02x}'.format(int(hex(hash_value[i]), 16))
        print("Digest: {}".format(hash_str))
        public_key_data = data[hash_length + 1:]
        public_key = str()
        for i in range(0, len(public_key_data)):
            public_key += '{:02X}'.format(int(hex(public_key_data[i]), 16))

        m = hashlib.sha256()
        m.update(public_key.encode('utf-8'))
        other_hash_value = m.hexdigest()

        print("Calculated digest: {}".format(other_hash_value))

        # the public key is not matched
        if hash_str != other_hash_value:
            return -1

        # Convert str to big-integer
        received_public_key = int(public_key)
        self._user.generate_shared_secret(received_public_key)
        print("Shared key: {}".format(self._user.shared_key))
        return 0

    def init_encryption_data(self, generated=True, mode=0):
        if generated:
            self.generate_key()
        if self.other is None:
            raise ConnectionError("You need to connect the other deivce!")
        else:
            print("Initializing encryption handshake ...", end='')
            key = str(self._user.public_key)
            key_array = bytearray()
            for i in range(0, len(key), 2):
                hex_number = key[i:i + 2]
                hex_number = '0x' + str(hex_number)
                key_array += struct.pack(">B", int(hex_number, base=16))

            print("Generated public key -> len=[{}]".format(len(key_array)))
            print("Sending the public key ...")

            m = hashlib.sha256()
            m.update(key.encode('utf-8'))
            result_hash = m.hexdigest()
            result_hash_array = bytearray()
            for i in range(0, len(result_hash), 2):
                hex_number = result_hash[i:i + 2]
                hex_number = '0x' + str(hex_number)
                result_hash_array += struct.pack(">B", int(hex_number,
                                                           base=16))
            fih = struct.pack(">B",
                              EncryptionPacket.FUNCTION_INITIALIZE_HANDSHAKE)
            hash_str_length = struct.pack(">B", len(result_hash_array))
            self.other.send(EncryptionPacket.PACKET_MAGIC_CODE + fih +
                            struct.pack(">B", mode) + hash_str_length +
                            result_hash_array + key_array)
            if mode == 0:
                print("Awaiting the received public key ...")
 def setUp(self):
     self.alice = DiffieHellman()
     self.bob = DiffieHellman()
示例#27
0
 def generate_key(self):
     self._user = DiffieHellman()
     self._user.generate_public_key()
示例#28
0
 def setup_keys(self):
     self.aes_keys = {}
     self.dhke = DiffieHellman()
     self.dhke.generate_public_key()
     self.dh_pub = str(self.dhke.public_key).encode('utf8')
     self.__dh_sharedkey = None
示例#29
0
import modbus_socket
import sys
import crypto
import time

from diffiehellman.diffiehellman import DiffieHellman

host = 'localhost'
port = 501

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 501))

data = 'CRYT'.encode('utf-8')

dh = DiffieHellman()
dh.generate_public_key()

# Generate user
ep = packet.EncryptionPacket(None, sock)
ep._user = dh

# Handshake
sock.send(data + struct.pack(">B", 0x00))

time.sleep(0.3)

# receiving initialize public key
data = sock.recv(2048)
ep.recv_public_data(data[6:])
time.sleep(0.3)
示例#30
0
class Client:

    def __init__(self, node_table):
        self.next_node = ""
        self.id = "client"
        self.node_table = node_table
        self.send_ops = {
            OP.CREATE: self.get_create_packet,
            OP.EXTEND: self.get_extend_packet
        }
        self.setup_keys()
        self.connect_to_signals()

    def setup_keys(self):
        self.aes_keys = {}
        self.dhke = DiffieHellman()
        self.dhke.generate_public_key()
        self.dh_pub = str(self.dhke.public_key).encode('utf8')
        self.__dh_sharedkey = None

    def connect_to_signals(self):
        dispatcher.connect(self.handle_created, signal=OP.CREATED, sender=dispatcher.Any)
        dispatcher.connect(self.handle_extended, signal=OP.EXTENDED, sender=dispatcher.Any)
        dispatcher.connect(self.handle_extended, signal=OP.EXTEND, sender=dispatcher.Any)

    def get_create_packet(self, receivers):
        iniciopKp=time.time()
        receiver = self.node_table[receivers[0]]
        msg = self.dh_pub
        enc_msg = rsa.encrypt(msg, receiver.pubkey)
        packet = Packet(src_id="client", op=OP.CREATE,
                        dest=receiver.id, payload=(enc_msg, None))
        print("client: Sending CREATE packet to {}".format(receiver))
        finpKp=time.time()
        print('########## Tiempo ##########:',(finpKp-iniciopKp), 'segundos')
        return packet

    def send_message(self, receivers, op):
        iniciopKp=time.time()
        receivers = receivers.split()
        self.next_node = receivers[len(receivers) - 1]
        packet = self.send_ops[op](receivers)
        dispatcher.send(signal=op, sender=self, packet=packet)
        finpKp=time.time()
        print('########## Tiempo ##########:',(finpKp-iniciopKp), 'segundos')

    def handle_created(self, packet):
        if packet.dest != self.id:
            return
        iniciopKp=time.time()
        print("client: Handling CREATED packet from {}".format(packet.src))
        (other_key, key_hash) = packet.msg
        # Generate the shared key
        self.dhke.generate_shared_secret(other_key)
        shared = self.dhke.shared_key
        m_key_hash = hashlib.sha1(str(shared).encode("utf-8")).hexdigest()

        if m_key_hash == key_hash:
            print("{}: DH Hash Comparison from {} SUCCESS".format(self.id, packet.src))
            self.__dh_sharedkey = shared
            self.aes_keys[packet.src] = shared
            print("client: Entry node is now set to: ", self.next_node)
            finpKp=time.time()
            print('########## Tiempo ##########:',(finpKp-iniciopKp), 'segundos')
            return
        print("{}: DH Hash Comparison from {} FAIL".format(self.id, packet.src))
        

    def handle_extended(self, packet):
        if packet.dest != self.id:
            return
        iniciopKp=time.time()
        print("client: Handling CREATED packet from {}".format(packet.src))
        if not packet.decrypt_aes(self.aes_keys[packet.src]):
            print("{}: Decryption of EXTENDED packet from {} FAIL".format(self.id, packet.src))
            return
        print("{}: Decryption of EXTENDED packet from {} SUCCESS".format(self.id, packet.src))
        (other_key, key_hash) = tuple(packet.msg.split('|||'))
        other_key = int(other_key)
        key_hash = key_hash.strip()
        self.dhke.generate_shared_secret(other_key)
        shared = self.dhke.shared_key
        m_key_hash = hashlib.sha1(str(shared).encode("utf-8")).hexdigest()

        if m_key_hash == key_hash:  # Only go through if hash matches
            print("{}: DH Hash Comparison from {} SUCCESS".format(self.id, packet.src))
            self.__dh_sharedkey = shared
            self.aes_keys[packet.src] = shared
            print("client: Connection established with {}".format(self.next_node))
            finpKp=time.time()
            print('########## Tiempo ##########:',(finpKp-iniciopKp), 'segundos')
            return

        print("{}: DH Hash Comparison from {} FAIL".format(self.id, packet.src))
        

    # Extend always gets wrapped with everything in the the AES Keys list
    def get_extend_packet(self, receivers):
        msg = "Type:     Extend"
        iniciopKp=time.time()
        extend_messages = {}
        for j in range(len(receivers) - 1):
            extend_messages[receivers[j]] = aes_encrypt(msg, self.aes_keys[receivers[j]])

        def recursive_extend(recs, node_index):
            if node_index == len(recs) - 1:
                create_packet = self.get_create_packet(recs[node_index:])
                create_packet.src = recs[node_index - 1]
                return create_packet
            return Packet(src_id="client", op=OP.EXTEND, dest=recs[0],
                          payload=(extend_messages[recs[node_index]], recursive_extend(recs, node_index + 1)))

        packet = recursive_extend(receivers, 0)
        finpKp=time.time()
        print('########## Tiempo ##########:',(finpKp-iniciopKp), 'segundos')
        return packet
示例#31
0
import json
from diffiehellman.diffiehellman import DiffieHellman

CERT = os.getcwd()+'/certs/cert.pem'

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server = ssl.wrap_socket(server,cert_reqs=ssl.CERT_REQUIRED, ca_certs = CERT)
server.settimeout(5)



IP_address = '192.168.168.184'
Port = 8202
server.connect((IP_address, Port))
bob = DiffieHellman()
bob.generate_public_key()
x = {"bob":bob.public_key}
server.send(json.dumps(x).encode("utf-8"))
total_data=""
# ########################################## REC #############################################
while True:
    try:        
        message = ""
        message = server.recv(100)
        while message is not "":             
            total_data+=message.decode("utf-8")
            message = "" 
            message = server.recv(100)
        else:
            break
示例#32
0
class Node:

    def __init__(self, id):
        self.setup_keys()
        self.connect_to_signals()
        self.id = id
        self.send_ops = {
            OP.CREATED: self.get_created_packet,
            OP.EXTENDED: self.get_extended_packet
        }
        self.hop_table = {1: HopPair(prev=None, next=None)}

    def setup_keys(self):
        self.dhke = DiffieHellman(key_length=1024)
        self.dhke.generate_public_key()
        self.__dh_sharedkey = None
        self.dh_pub = str(self.dhke.public_key).encode('utf8')
        (self.pubkey, self.__privkey) = rsa.newkeys(1024)

    def connect_to_signals(self):
        dispatcher.connect(self.handle_extend, signal=OP.EXTEND, sender=dispatcher.Any)
        dispatcher.connect(self.handle_create,
                           signal=OP.CREATE, sender=dispatcher.Any)
        dispatcher.connect(self.handle_created, signal=OP.CREATED, sender=dispatcher.Any)

    def handle_extend(self, packet):
        if packet.dest != self.id:
            return None
        iniciopKp=time.time()
        print("{}: Handling EXTEND packet from {}".format(self.id, packet.src))
        if packet.decrypt_aes(self.__dh_sharedkey):
            print("{}: Decryption of EXTEND packet from {} SUCCESS".format(self.id, packet.src))
            forward_packet = packet.payload
            self.hop_table[1].next = packet.dest
            dispatcher.send(signal=forward_packet.op, sender=self, packet=forward_packet)
            return
        print("{}: Decryption of EXTEND packet from {} FAIL".format(self.id, packet.src))
        finpKp=time.time()
        print('########## Tiempo ##########:',(finpKp-iniciopKp), 'segundos')

    def handle_create(self, packet):
        if packet.dest != self.id:
            return None
        iniciopKp=time.time()
        print("{}: Handling CREATE packet from {}".format(self.id, packet.src))
        if not packet.decrypt_rsa(self.__privkey):
            print("{}: Decryption of CREATE packet from {} FAIL".format(self.id, packet.src))
            return
        print("{}: Decryption of CREATE packet from {} SUCCESS".format(self.id, packet.src))
        other_key = int(packet.payload)
        self.dhke.generate_shared_secret(other_key)
        self.__dh_sharedkey = self.dhke.shared_key
        self.hop_table[1].prev = packet.src
        self.send_packet(self.hop_table[1].prev, OP.CREATED)
        finpKp=time.time()
        print('########## Tiempo ##########:',(finpKp-iniciopKp), 'segundos')

    def send_packet(self, receiver, op, payload=None):
        iniciopKp=time.time()
        packet = self.send_ops[op](receiver, payload)
        dispatcher.send(signal=op, sender=self, packet=packet)
        finpKp=time.time()
        print('########## Tiempo ##########:',(finpKp-iniciopKp), 'segundos')

    def get_created_packet(self, receiver, payload=None):
        iniciopKp=time.time()
        key_hash = hashlib.sha1(
            str(self.__dh_sharedkey).encode("utf-8")).hexdigest()
        msg = (self.dhke.public_key, key_hash)
        packet = Packet(src_id=self.id, op=OP.CREATED,
                        dest=receiver, payload=(msg, None))
        print("{}: Sending CREATED packet to {}".format(self.id, receiver))
        finpKp=time.time()
        print('########## Tiempo ##########:',(finpKp-iniciopKp), 'segundos')
        return packet

    def get_extended_packet(self, receiver, payload):
        iniciopKp=time.time()
        packet = Packet(self.id, OP.EXTENDED, receiver, payload)
        print("{}: Sending EXTENDED packet to {}".format(self.id, receiver))
        finpKp=time.time()
        print('########## Tiempo ##########:',(finpKp-iniciopKp), 'segundos')
        return packet

    def handle_created(self, packet):
        if packet.dest != self.id:
            return None
        iniciopKp=time.time()
        print("{}: Handling CREATE packet from {}".format(self.id, packet.src))
        dh_pub_key, key_hash = packet.msg
        encrypted_dh_pair = aes_encrypt("{}|||{}".format(dh_pub_key, key_hash), self.__dh_sharedkey)
        self.send_packet(self.hop_table[1].prev, OP.EXTENDED, (encrypted_dh_pair, None))
        finpKp=time.time()
        print('########## Tiempo ##########:',(finpKp-iniciopKp), 'segundos')

    def __str__(self):
        return self.id