Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sending Encrypted strings using socket in Python

I made a simple server program that is able to receive data from 4 different clients at a time. Now I want to send some data with AES-128 Encryption but that should be decoded at the server side. Here is my code for server:

from socket import *
from threading import Thread

def clientHandler():
    conn, addr = s.accept()
    print addr, "is connected"
    while 1:
        data = conn.recv(1024)
        if not data:
            break
        print "Received Message", repr(data)


HOST = "" #localhost
PORT = 15000


s = socket(AF_INET, SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(4)

print "Server is runnig"
#Thread(target=clientHandler).start()
#Thread(target=clientHandler).start()
#Thread(target=clientHandler).start()

for i in range(4):
    Thread(target=clientHandler).start()

s.close()

And I am sending data like this from my client side

from socket import *
s = socket()
s.connect(("localhost",15000))
s.send()

How should I modify my client code and server code to include AES-128 Encryption inside of it .. Kindly help me in this regard.

like image 303
Asad Irfan Avatar asked Dec 04 '14 05:12

Asad Irfan


1 Answers

Use Python's Crypto module which supports AES. You need a symmetric key (same key used to encrypt and decrypt). The same key can be generated in both server and client if the same passphrase and the initialization vector(IV) are used.

Summary: 1. Same key to be used to encrypt and decrypt 2. Use Crypto.Cipher.AES

AES has methods to generate key, encrypt and decrypt data. Following links have the actual code. pycrypto stackoverflow

Client - Call this method to encrypt your data and send the encrypted data

from Crypto.Cipher import AES

def do_encrypt(message):
    obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
    ciphertext = obj.encrypt(message)
    return ciphertext

Server - Receive data and call this method to decrypt the data

from Crypto.Cipher import AES

def do_decrypt(ciphertext):
    obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
    message = obj2.decrypt(ciphertext)
    return message

This is a sample code, make sure you choose a strong passphrase and IV.

like image 73
helloV Avatar answered Oct 02 '22 06:10

helloV