diff --git a/Client_1.py b/Client_1.py index 42dbcdf..9b9a776 100644 --- a/Client_1.py +++ b/Client_1.py @@ -1,34 +1,22 @@ """ Script for Tkinter GUI chat client. """ + import tkinter from socket import AF_INET, socket, SOCK_STREAM from threading import Thread -def generateKeys(): +#finds N and phi of N +def RSA(): e = d = N = 0 - p = 5099 q = 4759 - N = p * q phiN = (p - 1) * (q - 1) - - while True: - e = 1013 - if (isCoPrime(e, phiN)): - break - - d = modularInv(e, phiN) + e = 1013 + #find d using e and phi + d = inverse(e, phiN) return e, d, N -def isCoPrime(p, q): - return gcd(p, q) == 1 - -def gcd(p, q): - while q: - p, q = q, p % q - return p - def egcd(a, b): s = 0; old_s = 1 t = 1; old_t = 0 @@ -42,13 +30,15 @@ def egcd(a, b): # return gcd, x, y return old_r, old_s, old_t -def modularInv(a, b): +#d is the inverse of e and phi +def inverse(a, b): gcd, x, y = egcd(a, b) if x < 0: x += b return x +#decrypts each character def decrypt(d, N, cipher): msg = "" parts = cipher.split() @@ -58,35 +48,34 @@ def decrypt(d, N, cipher): msg += chr(pow(c, d, N)) return msg +#encrypts each character def encrypt(e, N, msg): cipher = "" for c in msg: m = ord(c) cipher += str(pow(m, e, N)) + " " - return cipher -e, d, N = generateKeys() +e, d, N = RSA() + + def receive(): """ Handles receiving of messages. """ while True: try: - msg = (sock.recv(1024)).decode() - dec = decrypt(d, N, msg) - print(dec) - msg_list.insert(tkinter.END, dec) + msg = sock.recv(BUFSIZ).decode("utf8") + msg_list.insert(tkinter.END, msg) except OSError: # Possibly client has left the chat. break def send(event=None): """ Handles sending of messages. """ msg = my_msg.get() - enc = encrypt(e, N, msg) - print(enc) - + print("Encrypted message", enc) + dec = decrypt(d, N, enc) my_msg.set("") # Clears input field. - sock.send(enc.encode()) + sock.send(dec.encode()) if msg == "#quit": sock.close() top.quit() diff --git a/Client_2.py b/Client_2.py index 2cf635e..9b9a776 100644 --- a/Client_2.py +++ b/Client_2.py @@ -1,34 +1,22 @@ """ Script for Tkinter GUI chat client. """ + import tkinter from socket import AF_INET, socket, SOCK_STREAM from threading import Thread -def generateKeys(): +#finds N and phi of N +def RSA(): e = d = N = 0 - p = 5099 q = 4759 - N = p * q phiN = (p - 1) * (q - 1) - - while True: - e = 1013 - if (isCoPrime(e, phiN)): - break - - d = modularInv(e, phiN) + e = 1013 + #find d using e and phi + d = inverse(e, phiN) return e, d, N -def isCoPrime(p, q): - return gcd(p, q) == 1 - -def gcd(p, q): - while q: - p, q = q, p % q - return p - def egcd(a, b): s = 0; old_s = 1 t = 1; old_t = 0 @@ -42,13 +30,15 @@ def egcd(a, b): # return gcd, x, y return old_r, old_s, old_t -def modularInv(a, b): +#d is the inverse of e and phi +def inverse(a, b): gcd, x, y = egcd(a, b) if x < 0: x += b return x +#decrypts each character def decrypt(d, N, cipher): msg = "" parts = cipher.split() @@ -58,37 +48,34 @@ def decrypt(d, N, cipher): msg += chr(pow(c, d, N)) return msg +#encrypts each character def encrypt(e, N, msg): cipher = "" for c in msg: m = ord(c) cipher += str(pow(m, e, N)) + " " - return cipher -e, d, N = generateKeys() +e, d, N = RSA() + def receive(): """ Handles receiving of messages. """ while True: try: - #msg = sock.recv(BUFSIZ).decode("utf8") - msg = (sock.recv(1024)).decode() - dec = decrypt(d, N, msg) - print(dec) - msg_list.insert(tkinter.END, dec) + msg = sock.recv(BUFSIZ).decode("utf8") + msg_list.insert(tkinter.END, msg) except OSError: # Possibly client has left the chat. break def send(event=None): """ Handles sending of messages. """ msg = my_msg.get() - enc = encrypt(e, N, msg) - print(enc) - + print("Encrypted message", enc) + dec = decrypt(d, N, enc) my_msg.set("") # Clears input field. - sock.send(enc.encode()) + sock.send(dec.encode()) if msg == "#quit": sock.close() top.quit() diff --git a/Client_3.py b/Client_3.py index 054d30c..9b9a776 100644 --- a/Client_3.py +++ b/Client_3.py @@ -4,6 +4,60 @@ from socket import AF_INET, socket, SOCK_STREAM from threading import Thread +#finds N and phi of N +def RSA(): + e = d = N = 0 + p = 5099 + q = 4759 + N = p * q + phiN = (p - 1) * (q - 1) + e = 1013 + #find d using e and phi + d = inverse(e, phiN) + + return e, d, N + +def egcd(a, b): + s = 0; old_s = 1 + t = 1; old_t = 0 + r = b; old_r = a + + while r != 0: + quotient = old_r // r + old_r, r = r, old_r - quotient * r + old_s, s = s, old_s - quotient * s + old_t, t = t, old_t - quotient * t + # return gcd, x, y + return old_r, old_s, old_t + +#d is the inverse of e and phi +def inverse(a, b): + gcd, x, y = egcd(a, b) + + if x < 0: + x += b + return x + +#decrypts each character +def decrypt(d, N, cipher): + msg = "" + parts = cipher.split() + for part in parts: + if part: + c = int(part) + msg += chr(pow(c, d, N)) + return msg + +#encrypts each character +def encrypt(e, N, msg): + cipher = "" + for c in msg: + m = ord(c) + cipher += str(pow(m, e, N)) + " " + return cipher + +e, d, N = RSA() + def receive(): """ Handles receiving of messages. """ @@ -17,8 +71,11 @@ def receive(): def send(event=None): """ Handles sending of messages. """ msg = my_msg.get() + enc = encrypt(e, N, msg) + print("Encrypted message", enc) + dec = decrypt(d, N, enc) my_msg.set("") # Clears input field. - sock.send(bytes(msg, "utf8")) + sock.send(dec.encode()) if msg == "#quit": sock.close() top.quit() @@ -67,4 +124,4 @@ def on_closing(event=None): receive_thread = Thread(target=receive) receive_thread.start() -tkinter.mainloop() # Starts GUI execution. \ No newline at end of file +tkinter.mainloop() # Starts GUI execution. diff --git a/Client_4.py b/Client_4.py index 054d30c..9b9a776 100644 --- a/Client_4.py +++ b/Client_4.py @@ -4,6 +4,60 @@ from socket import AF_INET, socket, SOCK_STREAM from threading import Thread +#finds N and phi of N +def RSA(): + e = d = N = 0 + p = 5099 + q = 4759 + N = p * q + phiN = (p - 1) * (q - 1) + e = 1013 + #find d using e and phi + d = inverse(e, phiN) + + return e, d, N + +def egcd(a, b): + s = 0; old_s = 1 + t = 1; old_t = 0 + r = b; old_r = a + + while r != 0: + quotient = old_r // r + old_r, r = r, old_r - quotient * r + old_s, s = s, old_s - quotient * s + old_t, t = t, old_t - quotient * t + # return gcd, x, y + return old_r, old_s, old_t + +#d is the inverse of e and phi +def inverse(a, b): + gcd, x, y = egcd(a, b) + + if x < 0: + x += b + return x + +#decrypts each character +def decrypt(d, N, cipher): + msg = "" + parts = cipher.split() + for part in parts: + if part: + c = int(part) + msg += chr(pow(c, d, N)) + return msg + +#encrypts each character +def encrypt(e, N, msg): + cipher = "" + for c in msg: + m = ord(c) + cipher += str(pow(m, e, N)) + " " + return cipher + +e, d, N = RSA() + def receive(): """ Handles receiving of messages. """ @@ -17,8 +71,11 @@ def receive(): def send(event=None): """ Handles sending of messages. """ msg = my_msg.get() + enc = encrypt(e, N, msg) + print("Encrypted message", enc) + dec = decrypt(d, N, enc) my_msg.set("") # Clears input field. - sock.send(bytes(msg, "utf8")) + sock.send(dec.encode()) if msg == "#quit": sock.close() top.quit() @@ -67,4 +124,4 @@ def on_closing(event=None): receive_thread = Thread(target=receive) receive_thread.start() -tkinter.mainloop() # Starts GUI execution. \ No newline at end of file +tkinter.mainloop() # Starts GUI execution. diff --git a/Server.py b/Server.py index c0bbd4b..a5d2198 100644 --- a/Server.py +++ b/Server.py @@ -1,72 +1,8 @@ """ Script for TCP chat server - relays messages to all clients """ + from socket import AF_INET, socket, SOCK_STREAM from threading import Thread -def generateKeys(): - e = d = N = 0 - - p = 5099 - q = 4759 - - N = p * q - phiN = (p - 1) * (q - 1) - - while True: - e = 1013 - if (isCoPrime(e, phiN)): - break - - d = modularInv(e, phiN) - - return e, d, N - -def isCoPrime(p, q): - return gcd(p, q) == 1 - -def gcd(p, q): - while q: - p, q = q, p % q - return p - -def egcd(a, b): - s = 0; old_s = 1 - t = 1; old_t = 0 - r = b; old_r = a - - while r != 0: - quotient = old_r // r - old_r, r = r, old_r - quotient * r - old_s, s = s, old_s - quotient * s - old_t, t = t, old_t - quotient * t - # return gcd, x, y - return old_r, old_s, old_t - -def modularInv(a, b): - gcd, x, y = egcd(a, b) - - if x < 0: - x += b - return x - -def decrypt(d, N, cipher): - msg = "" - parts = cipher.split() - for part in parts: - if part: - c = int(part) - msg += chr(pow(c, d, N)) - return msg - -def encrypt(e, N, msg): - cipher = "" - for c in msg: - m = ord(c) - cipher += str(pow(m, e, N)) + " " - - return cipher - -e, d, N = generateKeys() - clients = {} addresses = {} @@ -77,52 +13,43 @@ def encrypt(e, N, msg): SOCK = socket(AF_INET, SOCK_STREAM) SOCK.bind(ADDR) + def accept_incoming_connections(): """Sets up handling for incoming clients.""" while True: client, client_address = SOCK.accept() print("%s:%s has connected." % client_address) - greet = "Greetings from the Chat Room!" - enc = encrypt(e, N, greet) - client.send(enc.encode()) - inst = "Please type your name and press enter!" - enc2 = encrypt(e, N, inst) - client.send(enc2.encode()) + client.send("Greetings from the ChatRoom! ".encode("utf8")) + client.send("Please type your name and press enter!".encode("utf8")) addresses[client] = client_address Thread(target=handle_client, args=(client, client_address)).start() def handle_client(conn, addr): # Takes client socket as argument. """Handles a single client connection.""" - name = conn.recv(1024).decode() - dec = decrypt(d, N, name) - name = dec + name = conn.recv(BUFSIZ).decode("utf8") welcome = '\nWelcome %s! If you ever want to quit, type #quit to exit.' % name - enc = encrypt(e, N, welcome) - conn.send(enc.encode()) + conn.send(bytes(welcome, "utf8")) + msg = "\n%s from [%s] has joined the chat!" % (name, "{}:{}".format(addr[0], addr[1])) + broadcast(bytes(msg, "utf8")) clients[conn] = name - quuit = "#quit" while True: - msg = conn.recv(1024) - dec2 = decrypt(d, N, msg) - msg = dec2 + msg = conn.recv(BUFSIZ) if msg != bytes("#quit", "utf8"): broadcast(msg, name + ": ") else: - encQuit = encrypt(e, N, quuit) - quuit = encQuit - conn.send(quuit.encode()) + conn.send(bytes("#quit", "utf8")) conn.close() del clients[conn] broadcast(bytes("\n%s has left the chat." % name, "utf8")) break + def broadcast(msg, prefix=""): # prefix is for name identification. """Broadcasts a message to all the clients.""" for sock in clients: - enc = encrypt(e, N, msg) - msg = enc - sock.send(msg.encode()) + sock.send(bytes(prefix, "utf8") + msg) + if __name__ == "__main__": SOCK.listen(5) # Listens for 5 connections at max.