Beispiel #1
0
    def listen(self, theSystem=''):
        self.tcpSerSocket.listen(10)

        while True:  # waiting for client connection

            temClientsocket, addr = self.tcpSerSocket.accept()

            dataEnsemble = b''
            while True:
                data = temClientsocket.recv(1024)

                if data.decode():
                    dataEnsemble += data
                else:
                    temClientsocket.close()
                    break
            if dataEnsemble:
                msgdecoder = messageclass.message()
                try:
                    datadecoded = msgdecoder.decode_message(
                        dataEnsemble.decode())
                    self.checkReceivedData(datadecoded, dataEnsemble)
                except:
                    errormsg = msgdecoder.create_Error(0, self.myID)
                    sendMode = 'backward'
                    self.sendRsp(errormsg, sendMode)
Beispiel #2
0
    def checkReceivedData(self, datadecoded, data):
        msgdecoder = messageclass.message()
        if datadecoded[0] == 0:  # is key init msg

            if datadecoded[1] == self.address and self.diffkey.key_id != int(
                    datadecoded[2]):
                print('Relay ' + str(self.myID) + ' received: key init msg')
                self.diffkey.key_id = int(datadecoded[2])
                self.diffkey.generator = datadecoded[3]
                self.diffkey.prime = datadecoded[4]
                self.diffkey.generate_private_key()
                self.diffkey.generate_public_key()
                self.diffkey.generate_shared_secret(datadecoded[5])
                self.aeskey = self.diffkey.shared_key[:16]
                B = self.diffkey.public_key

                print('Relay ' + str(self.myID) +
                      ' calculated shared secret: ' + str(self.aeskey))
                sendMode = 'backward'
                destination = '172.16.1.1'
                keyRespose = msgdecoder.create_KeyReply(
                    destination, datadecoded[2], B)
                self.sendRsp(keyRespose, sendMode)
            if datadecoded[1] != self.address:
                sendMode = 'forward'
                self.sendRsp(data.decode(), sendMode)
        if datadecoded[0] == 1:  # is key reply msg
            sendMode = 'backward'
            self.sendRsp(data.decode(), sendMode)
        if datadecoded[0] == 2:  # is msg relay

            seq_num = datadecoded[1]
            key_id = datadecoded[2]
            chiperPart = datadecoded[3]
            if key_id == self.diffkey.key_id:
                AESObj = AES_128.AES_128(self.aeskey)
                decruptxt = AESObj.decrypt(chiperPart)

                nextHob = str(int(decruptxt[0:8], 2)) + '.' + str(
                    int(decruptxt[8:16], 2)) + '.' + str(
                        int(decruptxt[16:24], 2)) + '.' + str(
                            int(decruptxt[24:32], 2))
                for addr in self.connectionAfter:
                    if addr[0] == nextHob:
                        sendMode = 'P2P'
                        forwardmsg = decruptxt[32:]
                        self.sendRsp(forwardmsg, sendMode, dest=addr)
            else:
                errormsg = msgdecoder.create_Error(1, self.myID)
                sendMode = 'backward'
                self.sendRsp(errormsg, sendMode)
        if datadecoded[0] == 3:  # is error msg
            sendMode = 'backward'
            self.sendRsp(data.decode(), sendMode)
Beispiel #3
0
    def listen(self, theSystem=''):
        self.tcpSerSocket.listen(10)

        # waiting for connection
        while True:

            temClientsocket, addr = self.tcpSerSocket.accept()

            while True:
                data = temClientsocket.recv(4096)
                if data:
                    datadecoder = messageclass.message()
                    decodeddata = datadecoder.decode_message(data)
                    if decodeddata[0] == 0:
                        self.textout.insert(
                            END,
                            'Alice Received: ' + str('Key init msg') + '\n')
                    if decodeddata[0] == 1:
                        nodeNum = self.keyIDList.index(int(decodeddata[2]))

                        if self.keyIDReceivedList[nodeNum] == 0:

                            self.keyList[nodeNum].generate_shared_secret(
                                decodeddata[3])
                            self.keyIDReceivedList[nodeNum] = 1
                            targetAESKey = self.keyList[
                                nodeNum].shared_key[:16]
                            self.textout.insert(
                                END, 'Key reply msg from: ' +
                                self.nameList[self.path[nodeNum + 1] - 1] +
                                ' Shared secret (AES key): ' +
                                str(targetAESKey) + '\n')
                            self.sendKeyInitMsg()
                            if sum(self.keyIDReceivedList) == len(
                                    self.keyIDList):
                                self.textout.insert(
                                    END, 'All key replies received ' + '\n')
                    if decodeddata[0] == 3:
                        error_code = decodeddata[1]
                        expNode = decodeddata[2]
                        if error_code == 1:
                            self.textout.insert(
                                END, 'Invalid KeyID error from Node ' +
                                str(expNode) + '\n')
                        if error_code == 0:
                            self.textout.insert(
                                END, 'Message decode error from Node ' +
                                str(expNode) + '\n')

                else:
                    break

            temClientsocket.close()
    def checkData(self,data):
        msgdecoder = messageclass.message()
        try:
            datadecoded = msgdecoder.decode_message(data.decode())
            if datadecoded[0] == 0:  # is key init msg

                if datadecoded[1] == self.address and self.diffkey.key_id != int(datadecoded[2]):
                    print('Bob received: key init msg')
                    self.diffkey.key_id = int(datadecoded[2])
                    self.diffkey.generator = datadecoded[3]
                    self.diffkey.prime = datadecoded[4]
                    self.diffkey.generate_private_key()
                    self.diffkey.generate_public_key()
                    self.diffkey.generate_shared_secret(datadecoded[5])
                    self.aeskey = self.diffkey.shared_key[:16]
                    print('Bob calculated shared secret: ' + str(self.aeskey))
                    B = self.diffkey.public_key
                    sendMode = 'backward'
                    destination = '172.16.1.1'
                    keyRespose = msgdecoder.create_KeyReply(destination, datadecoded[2], B)
                    self.sendRsp(keyRespose, sendMode)

            if datadecoded[0] == 2:  # is msg relay

                seq_num = datadecoded[1]
                key_id = datadecoded[2]
                chiperPart = datadecoded[3]
                if key_id == self.diffkey.key_id:
                    AESObj = AES_128.AES_128(self.aeskey)
                    decruptxt = AESObj.decrypt(chiperPart)

                    nextHob = str(int(decruptxt[0:8], 2)) + '.' + str(int(decruptxt[8:16], 2)) + '.' + str(
                        int(decruptxt[16:24], 2)) + '.' + str(int(decruptxt[24:32], 2))

                    if nextHob == self.address:
                        receivedmsg = decruptxt[32:]

                        print('Bob: My name is Bob, I hereby certify that I received a message: ' + str(receivedmsg))
                        print('Bob: YEAH! ')
                else:
                    errormsg = msgdecoder.create_Error(1, 99)
                    sendMode = 'backward'
                    self.sendRsp(errormsg, sendMode)
        except:
            errormsg = msgdecoder.create_Error(0, 99)
            sendMode = 'backward'
            self.sendRsp(errormsg, sendMode)
Beispiel #5
0
    def sendMsg(self, path, keyList, keyIDList, message, destination=''):
        fixHOST = '127.0.0.1'

        if not message:
            self.textout.insert(
                END,
                'Nothing to send, please input message to monsieur Bob to text box'
                + '\n')
            return
        if not path:
            self.textout.insert(
                END,
                "Please firstly click 'calc. direction and distribute key' bottom "
                + '\n')
        else:
            for node in range(len(path) - 1):

                hob_key = keyList[-(node + 1)].shared_key[:16]  #AESkey
                hob_keyID = keyIDList[-(node + 1)]
                if node == 0:
                    hob_num = path[-1]  # node number
                    hob_IP = self.iplist[hob_num - 1]
                else:
                    hob_num = path[-(node)]  # node number
                    hob_IP = self.iplist[hob_num - 1]
                messagetreator = messageclass.message()
                message = messagetreator.create_MessageRelay(
                    hob_keyID, hob_IP, node, message, hob_key)
            hob_num = path[1]  # node number
            nextHobAlice = self.iplist[hob_num - 1]

            senderIdx = self.iplist.index(nextHobAlice)
            if self.IPfailed:
                ADDR1 = (fixHOST, self.portList[senderIdx])
            else:
                ADDR1 = (nextHobAlice, self.portList[senderIdx])
            tcpClientSocket = socket(AF_INET, SOCK_STREAM)

            tcpClientSocket.connect(ADDR1)
            tcpClientSocket.sendall(message.encode())
            tcpClientSocket.close()
            self.textout.insert(
                END, 'Sent relay msg to next hob: ' + str(nextHobAlice) +
                ' represented by: ' + str(ADDR1) + '\n')
Beispiel #6
0
    def distributeKey(self):
        Topology_1 = Topology.Topology()
        Topology_1.config_construct('config/topology.ini')

        G1 = nx.DiGraph()
        G1.add_edge(1,
                    2,
                    weight=Topology_1.costs.get(('172.16.1.1', '172.16.2.1')))
        G1.add_edge(2,
                    5,
                    weight=Topology_1.costs.get(('172.16.2.1', '172.16.5.3')))
        G1.add_edge(2,
                    6,
                    weight=Topology_1.costs.get(('172.16.2.1', '172.16.6.4')))
        G1.add_edge(2,
                    7,
                    weight=Topology_1.costs.get(('172.16.2.1', '172.16.7.5')))

        G1.add_edge(5,
                    3,
                    weight=Topology_1.costs.get(('172.16.5.3', '172.16.3.2')))

        G1.add_edge(5,
                    4,
                    weight=Topology_1.costs.get(('172.16.5.3', '172.16.4.2')))
        G1.add_edge(7,
                    3,
                    weight=Topology_1.costs.get(('172.16.7.5', '172.16.3.2')))

        G1.add_edge(7,
                    5,
                    weight=Topology_1.costs.get(('172.16.7.5', '172.16.5.3')))

        G1.add_edge(6,
                    4,
                    weight=Topology_1.costs.get(('172.16.6.4', '172.16.4.2')))
        G1.add_edge(4,
                    8,
                    weight=Topology_1.costs.get(('172.16.4.2', '172.16.8.6')))
        G1.add_edge(3,
                    4,
                    weight=Topology_1.costs.get(('172.16.3.2', '172.16.4.2')))

        self.path = self.dijkstra(G1, 1, 8)
        self.textout.insert(END,
                            'Random path to Bob: ' + str(self.path) + '\n')

        pathLength = len(self.path)
        self.keyList = []  #list of AES keys
        self.keyIDList = []  #list of keyIDs
        self.keyIDReceivedList = [
        ]  # indicates the receiving status of each key reply

        for idx in range(pathLength - 1):
            key_id = random.randint(1, 1000000)
            NewKey = diff.DiffieHellman(key_id=key_id)
            NewKey.generate_private_key()
            NewKey.generate_public_key()
            self.keyList.append(NewKey)
            self.keyIDList.append(key_id)
            self.keyIDReceivedList.append(0)

            destination = self.iplist[self.path[idx + 1] -
                                      1]  # get destination ip
            msgGenerator = messageclass.message()
            keyInitMsg = msgGenerator.create_KeyInit(destination, key_id,
                                                     NewKey.generator,
                                                     NewKey.prime,
                                                     NewKey.public_key)
            self.keyMessageQueue.put(keyInitMsg)
            if idx == 0:
                self.sendKeyInitMsg()