Python Forum

Full Version: need help one time pad encryption implementation !
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello guys ! i want to implemante a onetimepad encryption to my socket chat program..but i dont know how !
this is the onetimepad library : https://pypi.org/project/onetimepad/

Client code :
#!/usr/bin/env python3

import select
import socket
import sys

# usage: ./client.py [PORT] [HOST]

if __name__ == "__main__":

	if len(sys.argv) == 1:
		HOST = ("localhost", 10000)
	elif len(sys.argv) == 2:
		HOST = ("localhost", int(sys.argv[1]))
	else:
		HOST = (sys.argv[2], int(sys.argv[1]))

	main_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

	try:
		main_socket.connect(HOST)
		sys.stdout.write("Connected to " + HOST[0] + ":" + str(HOST[1]) + '\n')
		sys.stdout.flush()
	except:
		sys.stdout.write("Could not connect to " + HOST[0] + ":" + str(HOST[1]) + '\n')
		sys.stdout.flush()
		exit(2)

	while True:
		read_buffers = [sys.stdin, main_socket]
		try:
			read_list, write_list, error_list = select.select(read_buffers, [], [])

			for sock in read_list:
				if sock == main_socket:
					data = sock.recv(4096)
					if data:
						data = data.decode()
						sys.stdout.write(data)
						sys.stdout.flush()
					else:
						print("Disconnected from server!")
						exit(2)
				else:
					msg = sys.stdin.readline()
					sys.stdout.write("You> " + msg)
					sys.stdout.flush()
					main_socket.send(msg.encode())

		except KeyboardInterrupt:
			print("Disconnected from server!")
			exit(1)
Server code :

#!/usr/bin/env python3

import socketserver
import sys
import threading

# usage: ./server.py [PORT] [HOST]

CLIENTS = []


class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
	pass


class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):

	# Class is instantiated once per connection to the server

	def handle(self):
		CLIENTS.append(self.request)
		welcomeMsg = self.client_address[0] + ":" + str(self.client_address[1]) + " joined." + '\n'
		sys.stdout.write(welcomeMsg)
		sys.stdout.flush()
		for cli in CLIENTS:
			if cli is not self.request:
				cli.sendall(welcomeMsg.encode())
		while True:
			data = self.request.recv(4096)
			if data:
				data = data.decode()
				sendMsg = self.client_address[0] + ":" + str(self.client_address[1]) + "> " + data
				sys.stdout.write(sendMsg)
				sys.stdout.flush()
				for cli in CLIENTS:
					if cli is not self.request:
						cli.sendall(sendMsg.encode())
			else:
				sendMsg = self.client_address[0] + ":" + str(self.client_address[1]) + " left." + '\n'
				sys.stdout.write(sendMsg)
				sys.stdout.flush()
				CLIENTS.remove(self.request)
				for cli in CLIENTS:
					cli.sendall(sendMsg.encode())
				break


if __name__ == "__main__":

	if len(sys.argv) == 1:
		HOST = ("localhost", 10000)
	elif len(sys.argv) == 2:
		HOST = ("localhost", int(sys.argv[1]))
	else:
		HOST = (sys.argv[2], int(sys.argv[1]))

	server = ThreadedTCPServer(HOST, ThreadedTCPRequestHandler)
	server.daemon_threads = True

	server_thread = threading.Thread(target=server.serve_forever)

	# Exit the server thread when the main thread terminates
	server_thread.daemon = True
	server_thread.start()

	sys.stdout.write("Server is up." + '\n')
	sys.stdout.flush()

	# Main execution will push
	while True:
		try:
			msg = sys.stdin.readline()
			msg = "Server> " + msg
			sys.stdout.write(msg)
			sys.stdout.flush()
			for client in CLIENTS:
				client.sendall(msg.encode())

		except KeyboardInterrupt:
			break

	server.shutdown()
	server.server_close()
	sys.stdout.write("Server is closed." + '\n')
	sys.stdout.flush()
note : i think only the client code will be modified . i want only clients can decrypt onetimepad .
and the server will log only ciphred messages !