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.
the issue was that I was encrypting the data twice