/**	
* Program to compute A's private key given A's Diffie Helman parameters are 
* (P, g) = (24691, 106)
* Public key Ya = 12375
* 
* Author: Shweta Agrawal
* Date: 27th aug, 2003
*/

public class DifHel {
	
	/*Diffie Helman parameters*/
	static int p = 24691;	// Large prime number
	static int g = 106;		// primitive root
	static int ya = 12375;	// Public key ya = g^a modp
	static int a;			// Private key

	public static void main(String args[]) {

		/*Accept parameters from console if given*/
		if (args.length > 0) {
			if (args.length != 3) {
				System.out.println("Usage: java DifHel <prime number> <primitive root> <public key>");
				System.out.println("or java DifHel");
				return;
			} else {
				p = Integer.parseInt(args[0]);
				g = Integer.parseInt(args[1]);
				ya = Integer.parseInt(args[2]);
			}
		}
		/*Compute the private key*/
		a = computePrivateKey(p, g, ya);
		if ( a==0 )
			System.out.println("Some error in the parameters, private key not found");
		else
			System.out.println("The private key a= " + a);
	}

	private static int computePrivateKey(int p, int g, int ya) {
	
		System.out.println("The parameters: \n Prime number p = " + p + "\n primitive root g = " + g + "\n Public key Ya = " + ya);
		
		/*Multiply g by itself and take take modulo p till we get ya*/
		int newy = 1;
		for (int a=1; a < p; a++) {
			newy = (g * newy) % p; //ya = g^a mod p
			if (ya == newy )   
				return a;
		}
		return 0;
	}
}
