Experiment 7: IT117-Jaimish Trivedi
Experiment 7: IT117-Jaimish Trivedi
EXPERIMENT 7
AIM: Write a program to implement the Diffie-Hellman Key exchange algorithm and perform
encryption and decryption.
import java.util.*;
import java.math.BigInteger;
class DHAlgo{
//Initializing global q and alpha variables
private static BigInteger q = new BigInteger("761");
private static BigInteger alpha = new BigInteger("6");
//Keys
private BigInteger publicKey;
private BigInteger privateKey;
public BigInteger sessionKey;
//Constructor
public DHAlgo(int key){
this.privateKey = BigInteger.valueOf(key);
this.publicKey = calcPublicKey();
}
//Helper function to calculate public key based on the given private key
private BigInteger calcPublicKey(){
return DHAlgo.alpha.modPow(privateKey, DHAlgo.q);
}
//Getter method
public BigInteger getPublicKey(){
return this.publicKey;
}
//Getter method
public BigInteger getPrivateKey(){
return this.privateKey;
}
//Encryption
public int encrypt(int text){
return BigInteger.valueOf(text).add(this.sessionKey).mod(DHAlgo.q).intValue();
}
IT117-Jaimish Trivedi
//Decryption
public int decrypt(int text){
return BigInteger.valueOf(text).subtract(this.sessionKey).mod(DHAlgo.q).intValue();
}
}
Server Class:
import java.net.*;
import java.io.*;
import java.math.BigInteger;
import java.lang.*;
import java.util.*;
//Constructor
public ServerDH(int port){
try{
//Starting the server in listening mode
server = new ServerSocket(port);
System.out.println("\tServer started");
System.out.println("\tWaiting for a client ...");
//Getting private key from server and generating its public key
Scanner sc = new Scanner(System.in);
System.out.print("Enter server's private key : ");
DHAlgo dh = new DHAlgo(sc.nextInt());
int publicKey = dh.getPublicKey().intValue();
System.out.println("\tServer's public key : " + publicKey);
IT117-Jaimish Trivedi
try{
//Getting public key from client
String clientPublicKey = in.readUTF();
out.writeUTF(""+publicKey);
System.out.println("\tClient's Public Key : " + clientPublicKey);
//Generating session key using client's public key and server's private key
dh.generateSessionKey(new BigInteger(clientPublicKey), dh.getPrivateKey());
System.out.println("\tSession key : " + dh.sessionKey);
}catch(IOException i){
System.out.println(i);
}
System.out.println("\tClosing connection");
socket.close();
in.close();
}catch(IOException i){
System.out.println(i);
}
}
//Driver main
public static void main(String args[]){
new ServerDH(5000);
}
}
IT117-Jaimish Trivedi
Client Class:
import java.util.*;
import java.net.*;
import java.io.*;
import java.math.BigInteger;
import java.lang.*;
//Getting private key from client and generating its public key
Scanner sc = new Scanner(System.in);
System.out.print("Enter client's private key : ");
DHAlgo dh = new DHAlgo(sc.nextInt());
int publicKey = dh.getPublicKey().intValue();
System.out.println("\tClient's public key : " + publicKey);
try{
//Sending client's public key to the server
out.writeUTF(""+publicKey);
//Generating session key using server's public key and client's private key
dh.generateSessionKey(new BigInteger(serverPublicKey), dh.getPrivateKey());
System.out.println("\tSession key : " + dh.sessionKey);
input.close();
out.close();
socket.close();
}catch(IOException i){
System.out.println(i);
}
}
//Driver main
public static void main(String args[]){
new ClientDH("127.0.0.1", 5000);
}
}
Server Output:
IT117-Jaimish Trivedi
Client Output: