1// Aim: Program to perform Blowfish encryption with Diffie-Hellman key exchange and MD5 hash (Blowfish with Diffie-Hellman Key Exchange and MD5 Hash).
2import javax.crypto.*;
3import javax.crypto.spec.*;
4import java.util.*;
5import java.math.BigInteger;
6import java.security.MessageDigest;
7
8public class diffie_md5_blowfish {
9 public static void main(String[] args) throws Exception {
10 //diffie hellman
11 Scanner sc = new Scanner(System.in);
12 System.out.print("Enter a prime number (q): ");
13 BigInteger q = sc.nextBigInteger();
14 System.out.print("Enter a primitive root: ");
15 BigInteger a = sc.nextBigInteger();
16 System.out.print("Enter private key for user A: ");
17 BigInteger xA = sc.nextBigInteger();
18 System.out.print("Enter private key for user B: ");
19 BigInteger xB = sc.nextBigInteger();
20 BigInteger yA = a.modPow(xA, q);
21 BigInteger yB = a.modPow(xB, q);
22 BigInteger kA = yB.modPow(xA, q);
23 BigInteger kB = yA.modPow(xB, q);
24
25 if(!kA.equals(kB)){
26 System.out.println("error key mismatch");
27 return;
28 }
29
30 //blowfish keyy
31 byte[] keyBytes = Arrays.copyOf(kA.toByteArray(),16);
32 SecretKey key = new SecretKeySpec(keyBytes, "Blowfish");
33
34 //blowfish encryption
35 System.out.print("Enter message : ");
36 sc.nextLine();
37 String msg = sc.nextLine();
38 sc.close();
39
40 Cipher cpr = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");
41 cpr.init(Cipher.ENCRYPT_MODE, key);
42 byte[] encrypted = cpr.doFinal(msg.getBytes("UTF-8"));
43 String enctext = Base64.getEncoder().encodeToString(encrypted);
44
45 cpr.init(Cipher.DECRYPT_MODE, key);
46 byte[] decrypted = cpr.doFinal(Base64.getDecoder().decode(enctext));
47 String dectext = new String(decrypted, "UTF-8");
48
49 System.out.println("Shared Secret Key: " + kA);
50 System.out.println("Blowfish key : "+Base64.getEncoder().encodeToString(keyBytes));
51
52 System.out.println("Encrypted: " + enctext);
53 System.out.println("Decrypted: " + dectext);
54
55 //md5 integrityyyy
56 MessageDigest m = MessageDigest.getInstance("MD5");
57 byte[] digest = m.digest(msg.getBytes());
58 System.out.println("MD5 :"+Base64.getEncoder().encodeToString(digest));
59 StringBuilder hex = new StringBuilder();
60 for(byte b : digest){
61 String h =String.format("%2x",b);
62 hex.append(h);
63 }
64 System.out.println("hex :"+hex);
65
66 }
67}
68