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