Having trouble decrypting a message in server-client chat application

89 views Asked by At

I'm attempting to create a chatroom in python with login and fernet encryption. For some reason I'm not able to get the client to decrypt the messages, however the server can.

SERVER CODE:

import socket
import threading
from cryptography.fernet import Fernet

# Generate a secret key for encryption
key = Fernet.generate_key()
cipher_suite = Fernet(key)
print(key.decode())

# Store username-password pairs (for demo purposes)
user_credentials = {
    "user1": "password1",
    "user2": "password2",
}

# Store connected clients
connected_clients = {}

def handle_client(client_socket):
    username = client_socket.recv(1024).decode('utf-8')
    password = client_socket.recv(1024).decode('utf-8')

    if username in user_credentials and user_credentials[username] == password:
        client_socket.send("Authenticated".encode('utf-8'))
        print(f"{username} has connected.")
        connected_clients[username] = client_socket

        while True:
            try:
                message = client_socket.recv(1024).decode('utf-8')
                decrypted_message = cipher_suite.decrypt(message.encode('utf-8'))
                decoded_message = decrypted_message.decode('utf-8')
                encrypted_message = cipher_suite.encrypt(decoded_message.encode('utf-8'))
                if not message:
                    del connected_clients[username]
                    client_socket.close()
                    print(f"{username} has disconnected.")
                    break
                print(f"Received from {username}: {decoded_message}")
                broadcast_message(username, encrypted_message)
            except Exception as e:
                print(str(e))
                break
    else:
        client_socket.send("Authentication failed".encode('utf-8'))
        client_socket.close()

def broadcast_message(sender, message):
    for username, client_socket in connected_clients.items():
        if username != sender:
            try:
                encrypted_message = cipher_suite.encrypt(f"{sender}: {message}".encode('utf-8'))
                client_socket.send(encrypted_message)
            except Exception as e:
                print(str(e))
                continue


def main():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(("IP_HERE", PORT_HERE))
    server.listen(5)
    print("Server listening on port 5052")

    while True:
        client_socket, addr = server.accept()
        client_handler = threading.Thread(target=handle_client, args=(client_socket,))
        client_handler.start()

if __name__ == "__main__":
    main()

CLIENT CODE:

import socket
from cryptography.fernet import Fernet
import threading

key = input("Enter the secret key: ")
key = key.encode()

def send_message(client_socket):
    while True:
        message = input()
        client_socket.send(Fernet(key).encrypt(message.encode()))

def receive_message(client_socket):
    while True:
        try:
            message = client_socket.recv(1024)
            decrypted_message = Fernet(key).decrypt(message)
            decoded_message = decrypted_message.decode('utf-8')
            print(decoded_message)
        except Exception as e:
            print(str(e))
            break


def main():
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(("IP_HERE", PORT_HERE))

    username = input("Username: ")
    password = input("Password: ")

    client.send(username.encode())
    client.send(password.encode())

    response = client.recv(1024).decode()
    if response == "Authenticated":
        print("Authentication successful. You are now connected to the chatroom.")
        send_thread = threading.Thread(target=send_message, args=(client,))
        receive_thread = threading.Thread(target=receive_message, args=(client,))

        send_thread.start()
        receive_thread.start()
    else:
        print("Authentication failed. Closing connection.")
        client.close()

if __name__ == "__main__":
    main()

I've tried copying code that works normally into it and it still doesn't decrypt the message.

1

There are 1 answers

0
7ven Perks On

the issue was that I was encrypting the data twice