简体   繁体   中英

Encrypted chat app using python and RSA algorithm

I am trying to create an encrypted chat application using RSA algo in python but I am getting error messages. I am unable to find the errors in the code and the chat system is not working at all. The client.py is terminating with showing this error

File "client.py", line 17, in

           server_string = server.recv(1024)

           OSError: [Errno 107] Transport endpoint is not connected

The codes are:

the server.py is:

import socket
from Crypto.PublicKey import RSA
from Crypto import Random

#Generate private and public keys
random_generator = Random.new().read
private_key = RSA.generate(1024, random_generator)
public_key = private_key.publickey()

#Declartion
mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname(socket.getfqdn())
port = 8888
encrypt_str = "encrypted_message="

if host == "127.0.1.1":
    import commands
    host = commands.getoutput("hostname -I")
print("host = " + host)

#Prevent socket.error: [Errno 98] Address already in use
mysocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

mysocket.bind((host, port))

mysocket.listen(5)

c, addr = mysocket._accept()

while True:

    #Wait until data is received.
    data = c.recv(1024)
    data = data.replace("\r\n", '') #remove new line character

    if data == "Client: OK":
        c.send("public_key=" + public_key.exportKey() + "\n")
        print("Public key sent to client.")

    elif encrypt_str in data: #Reveive encrypted message and decrypt it.
        data = data.replace(encrypt_str, '')
        print("Received:\nEncrypted message = "+str(data))
        encrypted = eval(data)
        decrypted = private_key.decrypt(encrypted)
        c.send("Server: OK")
        print("Decrypted message = " + decrypted)

    elif data == "Quit": break

#Server to stop
c.send("Server stopped\n")
print("Server stopped")
c.close()

The client.py is

import socket
from Crypto.PublicKey import RSA
import sys 
import os 

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "127.0.0.1"
port = 7777

server.bind(("my_IP_addr_goes_here", 8880))
#data= "Client: OK"

#Tell server that connection is OK
#server.sendall("Client : OK")

#Receive public key string from server
server_string = server.recv(1024)

#Remove extra characters
server_string = server_string.replace("public_key=", '')
server_string = server_string.replace("\r\n", '')

#Convert string to key
server_public_key = RSA.importKey(server_string)

#Encrypt message and send to server
message = "This is my secret message."
encrypted = server_public_key.encrypt(message, 32)
server.sendall("encrypted_message="+str(encrypted))

#Server's response
server_response = server.recv(1024)
server_response = server_response.replace("\r\n", '')
if server_response == "Server: OK":
    print("Server decrypted message successfully")

#Tell server to finish connection
server.sendall("Quit")
print(server.recv(1024)) #Quit server response
server.close()

The errors are: The server script is running but when I am terminating the script it's showing

For server.py: ^CTraceback (most recent call last):

           File "server.py", line 28, in <module>

           c, addr = mysocket._accept()

           KeyboardInterrupt

For client.py: File "client.py", line 17, in

           server_string = server.recv(1024)

           OSError: [Errno 107] Transport endpoint is not connected

You want to capture SIGINT... See How do I capture SIGINT in Python?

import signal
import sys
def stop_server(sig, frame):
        server.sendall("Quit")
        print(server.recv(1024)) #Quit server response
        server.close()
        sys.exit(0)
signal.signal(signal.SIGINT, stop_server)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM