def __init__(self,ip,port,userId): try: self.id = userId key = generateRSAkey() self.pukey = key.publickey().exportKey() self.prkey = key.exportKey() #generating DH keys prDHKey = random.randint(100,1000) self.sessionKey = "" #Setting up socket server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.connect((ip,int(port))) server.send("User") brokerPbKey = exchangePublicKey(server, self.pukey) if brokerPbKey: print "User - Broker Key exchange successful" #Diffie-Hellman Key Exchange Starts here sendData(getDHkey(prDHKey), server, brokerPbKey) data = decryptMsg(server.recv(1024), key) brokerSessionKey = getSessionKey(data, prDHKey) sendData(getHash(brokerSessionKey), server, brokerPbKey) ack = decryptMsg(server.recv(1024), key) if ack == "ACK": print "DH Authentication successful" inp = raw_input("Enter the Seller IP address & port (format:-ipaddress:port): ") sendData(inp, server, brokerPbKey) sellerPbKey = "" sellerPbKey = server.recv(2048) print "Received Seller key in User" print sellerPbKey server.send("ACK") prDHKey = random.randint(100,1000) sendData(getDHkey(prDHKey), server, sellerPbKey) sellerNounce = decryptMsg(server.recv(2048), key) nounce = getSessionKey(sellerNounce.split("~")[0], prDHKey) if getHash(nounce) == sellerNounce.split("~")[1]: data = AESCipher(nounce).encrypt("NOUNCE VERIFIED") server.send(data) data = server.recv(2048) broucher = AESCipher(nounce).decrypt(data) print broucher inp = raw_input("Press the number to select any product: ") data = AESCipher(nounce).encrypt(inp) server.send(data) data = server.recv(1024) price = AESCipher(nounce).decrypt(data) sellerId = price.split(";")[1] price = price.split(";")[0] print "Price of the product you want to buy is $" + str(price) time.sleep(0.5) inp = raw_input("Are you sure you want to buy? [Y/N]: ") date = str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) dbTransact = str(self.id+";"+price+";"+sellerId+";"+date) sign = signData(dbTransact, self.prkey) if inp == "Y": data = AESCipher(getHash(brokerSessionKey)).encrypt(dbTransact+"~"+sign) server.send(data) data = server.recv(2048) imgSize = AESCipher(nounce).decrypt(data) print imgSize if imgSize.startswith('SIZE'): tmp = imgSize.split() size = int(tmp[1]) print 'got size' print 'size is %s' % size data = AESCipher(nounce).encrypt("GOT SIZE") server.send(data) imgData = server.recv(40960000) imageString = AESCipher(nounce).decrypt(imgData) output_file = open("Output/output_"+self.id+".jpg", "wb") output_file.write(imageString.decode('base64')) output_file.close() server.close() print "Transaction completed successfully. Hope to see you soon again" else: print "Error in getting image size" server.close() else: sendData("No Purchase", server, key) else: data = AESCipher(nounce).encrypt("NOUNCE MISMATCH") server.send(data) print "Unable to authenticate seller" server.close() else: sendData("Error", server, brokerPbKey) else: print "Improper Broker Public key" server.close() except Exception as e: print e server.close()