Nov-28-2020, 06:01 PM
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 :
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()
