CNS Assignment 6
CNS Assignment 6
Client:
import socket
import random
from math import gcd
def gcd_extended(a, b):
if b == 0:
return a, 1, 0
else:
d, x, y = gcd_extended(b, a % b)
return d, y, x - y * (a // b)
def generate_prime(p, q):
t = (p - 1) * (q - 1)
n=p*q
for e in range(2, t):
if gcd(e, t) == 1:
break
for i in range(1, 10):
x=1+i*t
if x % e == 0:
d = int(x / e)
break
return e, d, n
def main():
# Get user input for p and q
p = int(input("Enter the value of p: "))
q = int(input("Enter the value of q: "))
# Generate keys using user input
e, d, n = generate_prime(p, q)
# Create a UDP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Connect to the server
client_socket.connect(("127.0.0.1", 20003))
print("Connected to server")
# Send public key to server
public_key_message = "Hello Server {} {}".format(p, q)
client_socket.sendall(public_key_message.encode())
# Receive public key from server
public_key = client_socket.recv(1024).decode()
e_str, n_str = public_key.split()
e = int(e_str)
n = int(n_str)
print("Received public key from server:", e, n)
# Generate challenge
challenge = random.randint(1, n-1)
print("Generated challenge:", challenge)
# Sign the challenge using private key
signature = pow(challenge, d, n)
print("Generated signature:", signature)
# Send the signature to the server
signature_message = "Received signature {} {}".format(challenge, signature)
client_socket.sendall(signature_message.encode())
# Receive the response from the server
response = client_socket.recv(1024).decode()
print("Response from server:", response) # Close the socket
client_socket.close()
if __name__ == '__main__':
main()
Server:
import socket
from math import gcd
def gcd_extended(a, b):
if b == 0:
return a, 1, 0
else:
d, x, y = gcd_extended(b, a % b)
return d, y, x - y * (a // b)
def generate_prime(p, q):
t = (p - 1) * (q - 1)
n=p*q
for e in range(2, t):
if gcd(e, t) == 1:
break
for i in range(1, 10):
x=1+i*t
if x % e == 0:
d = int(x / e)
break
return e, d, n
def main():
# Create a UDP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Set up server address and port
server_address = ('', 20003)
# Bind the socket to the server address
server_socket.bind(server_address)
print(f"Server listening on {server_address[0]}:{server_address[1]}")
while True:
# Receive data from client
data, address = server_socket.recvfrom(1024)
client_message = data.decode()
if client_message.startswith("Hello Server"):
print(f"Received public key from client: {client_message}")
# Split the received message to extract p and q values
_, _, p_str, q_str = client_message.split()
p = int(p_str)
q = int(q_str)
# Generate keys based on client's p and q values
e, d, n = generate_prime(p, q)
# Send the public key to the client
server_socket.sendto(str.encode(f"{e} {n}"), address)
elif client_message.startswith("Received signature"):
# Extract the challenge and received signature from the message
_, _, challenge_str, signature_str = client_message.split()
challenge = int(challenge_str)
signature = int(signature_str)
# Verify the signature
decrypted_signature = pow(signature, e, n)
if decrypted_signature == challenge:
verification_result = "Valid" print("Signature verification: Valid - Signature verified successfully")
else:
verification_result = "Invalid"
print("Signature verification: Invalid - Signature verification failed")
# Send the verification result to the client
server_socket.sendto(str.encode(verification_result), address)
# Run the server
if __name__ == '__main__':
main()