Client.py

import socket 
from Crypto.Cipher import AES
import base64
import os
import Crypto              
import os, shutil
import sys
from stat import ST_SIZE
sys.path.insert(0, '/home/ubuntu/finalpro/server')
import keygen


    # Create a socket object
    s = socket.socket()         
    host = socket.gethostname() 
    port = 12345                
    s.connect((host, port))
    print s.recv(1024)

    #Taking input from User
    print("----------------------------------------------------------------------")
    print("*******************IMPROVED AUTHENTICATION PROTOCOL*******************")
    print("----------------------------------------------------------------------")
    username=raw_input("ENTER CLIENT ID:       ")
    password=raw_input("ENTER CLIENT PASSWORD: ")
    print("----------------------------------------------------------------------")
    print("Authentication in progress...")
    print("Encrypting Data...")

    #Encrypting Data
    BLOCK_SIZE = 16

    # the character used for padding--with a block cipher such as AES, the value
    # you encrypt must be a multiple of BLOCK_SIZE in length.  This character is
    # used to ensure that your value is always a multiple of BLOCK_SIZE
    PADDING = '{'

    # one-liner to sufficiently pad the text to be encrypted
    pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING

    # one-liners to encrypt/encode and decrypt/decode a string
    # encrypt with AES, encode with base64
    EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
    DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)

    # generate a random secret key
    secret = os.urandom(BLOCK_SIZE)


    # create a cipher object using the random secret
    cipher = AES.new(secret)

    # encode a string
    encrypted_username = EncodeAES(cipher, username)
    print 'Encrypted string:', encrypted_username
    print("Encrypting CLIENT ID...                                         [Done]")

    encrypted_password = EncodeAES(cipher, password)
    print 'Encrypted string:', encrypted_password
    print("Encrypting CLIENT PASSWORD...                                   [Done]")

    encrypted_username = keygen.publickey.encrypt(username, 32)
    #print(encrypted_username)
    print("Encrypting CLIENT ID...                                         [Done]")
    encrypted_password = keygen.publickey.encrypt(password, 32)
    #print(encrypted_password)
    print("Encrypting CLIENT PASSWORD...                                   [Done]")

    #Copy encrypted data into file
    f=open("encrypt.txt",'w')
    f.write(chr(len(encrypted_username)))
    f.write(str(encrypted_username))
    f.write("\n")
    f.write(chr(len(encrypted_password)))
    f.write(str(encrypted_password))
    f.close()

    print("Sending Data to server for Validation...")
    f=open("encrypt.txt",'rb')
    fsize=os.stat(f.name)[ST_SIZE]
    s.sendall(str(fsize).zfill(8))
    sfile = s.makefile("wb")
    shutil.copyfileobj(f, sfile)
    sfile.close()
    f.close()
    print("Sending Data to server for Validation...                        [DONE]")

    print("Encrypting Secret Key...                                        [Done]")
    encrypted_key=keygen.publickey.encrypt(secret, 32)
    f1=open("encrypted_key.txt",'w')
    f1.write(chr(len(encrypted_key)))
    f1.write(str(encrypted_key))
    f1.close()

    print("Sending Secret Key to server for Validation...")
    f1=open("encrypted_key.txt",'rb')
    f1size=os.stat(f1.name)[ST_SIZE]
    s.sendall(str(f1size).zfill(8))
    s1file = s.makefile("wb")
    shutil.copyfileobj(f1, s1file)
    s1file.close()
    f1.close()
    print("Sending Secret Key to server for Validation...                  [DONE]")


    #Sending Data to Server

    s.close()

Server.py

import socket 
from Crypto.Cipher import AES
import base64
import os
import Crypto             
import shutil
import keygen
import sys
readsize = 127
writesize = 128

s = socket.socket()         
host = socket.gethostname() 
port = 12345                
s.bind((host, port))        

print("-----------------------------------------------------------------------------")
print("*******************IMPROVED AUTHENTICATION PROTOCOL SERVER*******************")
print("-----------------------------------------------------------------------------")

# Now wait for client connection.
s.listen(5)                
conn, addr = s.accept()                
print("Got Connection at address:",addr)
conn.sendall('READY')

# the block size for the cipher object; must be 16 per FIPS-197
BLOCK_SIZE = 16

# the character used for padding--with a block cipher such as AES, the value
# you encrypt must be a multiple of BLOCK_SIZE in length.  This character is
# used to ensure that your value is always a multiple of BLOCK_SIZE
PADDING = '{'

# one-liner to sufficiently pad the text to be encrypted
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING

# one-liners to encrypt/encode and decrypt/decode a string
# encrypt with AES, encode with base64
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING)

#Reading all data and creating a file on server

f = open("encrypt_key.txt",'wb')
fsize=int(conn.recv(8))               
print("Recieved File size:",fsize)
sfile = conn.makefile("rb")
shutil.copyfileobj(sfile, f)
sfile.close()
f.write(conn.recv(fsize))           
f.close()

#Again reading file,storing it in variables and decrypting it
with open("encrypt_key.txt",'r') as myfile:
    data=myfile.readlines()
encrypted_key=str(data)
dc=keygen.privatekey.decrypt(encrypted_key)
cipher1 = AES.new(dc)
myfile.close()

#Reading all data and creating a file on server
f1 = open("encrypt.txt",'wb')
f1size=int(conn.recv(8))               
print("Recieved File size:",f1size)
s1file = conn.makefile("rb")
shutil.copyfileobj(s1file, f1)
s1file.close()
f1.write(conn.recv(f1size))           
f1.close()

#Again reading file and storing it in variables
with open("encrypt.txt",'r') as myfile1:
    data=myfile1.readlines()
encrypted_username=str(data[0])
encrypted_password=str(data[1])


#Decrypting username and password
decoded = DecodeAES(cipher1, encoded)
print 'Decrypted string:', decoded

decoded1 = DecodeAES(cipher1, encoded1)
print 'Decrypted string:', decoded1

conn.close()
s.close()
Traceback (most recent call last):
  File "server.py", line 58, in 
    dc=keygen.privatekey.decrypt(encrypted_key)
  File "/usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.py", line 174, in decrypt
    return pubkey.pubkey.decrypt(self, ciphertext)
  File "/usr/lib/python2.7/dist-packages/Crypto/PublicKey/pubkey.py", line 93, in decrypt
    plaintext=self._decrypt(ciphertext)
  File "/usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.py", line 237, in _decrypt
    cp = self.key._blind(ciphertext, r)
ValueError: Message too large

keygen.py

#Key Generation Program
import Crypto
from Crypto.PublicKey import RSA
from Crypto import Random




random_generator = Random.new().read
key = RSA.generate(1024, random_generator) #generate pub and priv key

publickey = key.publickey() # pub key 
privatekey= key # pub key