javabouncycastlediffie-hellman

Java Diffie-Hellman key exchange


I'm trying to execute code to perform the Diffie-Hellman key exchange. I sourced the code from an example online (forget where now). I had to import the bouncycastle.jar, which I assumed worked up until execution.

stacktrace screenshot

my code:

package testproject;

import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.MessageDigest;
import java.security.SecureRandom;
import java.security.Security;
import javax.crypto.KeyAgreement;
import javax.crypto.spec.DHParameterSpec;

public class KeyGen {

  private static BigInteger g512 = new BigInteger("1234567890", 16);
  //generates a random, non-negative integer for Base

  private static BigInteger p512 = new BigInteger("1234567890", 16);
  //generates a random, non-negative integer for Prime

  public static void main(String[] args) throws Exception {
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    DHParameterSpec dhParams = new DHParameterSpec(p512, g512);
    //Specify parameters to use for the algorithm
    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH", "BC");
    //Define specific algorithm to use "diffie-hellman", with provider "bc"

    keyGen.initialize(dhParams, new SecureRandom());
    //initialize with parameters & secure random seed

    KeyAgreement aKeyAgree = KeyAgreement.getInstance("DH", "BC");
    //define algorithm for A's key agreement
    KeyPair aPair = keyGen.generateKeyPair();
    //generate keyPair for A

    KeyAgreement bKeyAgree = KeyAgreement.getInstance("DH", "BC");
    //define algorithm for B's key agreement
    KeyPair bPair = keyGen.generateKeyPair();
    //generate keyPair for B

    aKeyAgree.init(aPair.getPrivate());
    //initialize A's keyAgreement with A's private key
    bKeyAgree.init(bPair.getPrivate());
    //initialize B's keyAgreement with B's private key

    aKeyAgree.doPhase(bPair.getPublic(), true);
    //do last phase of A's keyAgreement with B's public key
    bKeyAgree.doPhase(aPair.getPublic(), true);
    //do last phase of B's keyAgreement with A's public key

    MessageDigest hash = MessageDigest.getInstance("SHA1", "BC");

    System.out.println(new String(hash.digest(aKeyAgree.generateSecret())));
    //generate secret key for A, hash it.
    System.out.println(new String(hash.digest(bKeyAgree.generateSecret())));
    //generate secret key for B, hash it.
  }
}

This is the line causing the problem:

KeyPair aPair = keyGen.generateKeyPair();

I'm confused as to what the error is, as I've found each of the methods it's returning 'unknown source' for.

Any light shed on this would be much appreciated.

Continued(Edit): Java - Diffie-Hellman Encryption - Wrong Output


Solution

  • You already preferred bouncycastle version. But I implemented a little helloworld version of it for learning purposes. Maybe it can be helpful for those who simply wants to use Diffie-Hellman in pure Java without dependencies:

    // 1. ------------------------------------------------------------------
    // This is Alice and Bob
    // Alice and Bob want to chat securely. But how?
    
    final Person alice = new Person();
    final Person bob   = new Person();
    
    //    ?                                        ?
    //
    //    O                                        O
    //   /|\                                      /|\
    //   / \                                      / \
    //
    //  ALICE                                     BOB
    
    // 2. ------------------------------------------------------------------
    // Alice and Bob generate public and private keys.
    
    alice.generateKeys();
    bob.generateKeys();
    
    //
    //    O                                        O
    //   /|\                                      /|\
    //   / \                                      / \
    //
    //  ALICE                                     BOB
    //  _ PUBLIC KEY                              _ PUBLIC KEY
    //  _ PRIVATE KEY                             _ PRIVATE KEY
    
    // 3. ------------------------------------------------------------------
    // Alice and Bob exchange public keys with each other.
    
    alice.receivePublicKeyFrom(bob);
    bob.receivePublicKeyFrom(alice);
    
    //
    //    O                                        O
    //   /|\                                      /|\
    //   / \                                      / \
    //
    //  ALICE                                     BOB
    //  + public key                              + public key
    //  + private key                             + private key
    //  _ PUBLIC KEY <------------------------->  _ PUBLIC KEY
    
    // 4. ------------------------------------------------------------------
    // Alice generates common secret key via using her private key and Bob's public key.
    // Bob generates common secret key via using his private key and Alice's public key.
    // Both secret keys are equal without TRANSFERRING. This is the magic of Diffie-Hellman algorithm.
    
    alice.generateCommonSecretKey();
    bob.generateCommonSecretKey();
    
    //
    //    O                                        O
    //   /|\                                      /|\
    //   / \                                      / \
    //
    //  ALICE                                     BOB
    //  + public key                              + public key
    //  + private key                             + private key
    //  + public key                              + public key
    //  _ SECRET KEY                              _ SECRET KEY
    
    // 5. ------------------------------------------------------------------
    // Alice encrypts message using the secret key and sends to Bob
    
    alice.encryptAndSendMessage("Bob! Guess Who I am.", bob);
    
    //
    //    O                                        O
    //   /|\ []-------------------------------->  /|\
    //   / \                                      / \
    //
    //  ALICE                                     BOB
    //  + public key                              + public key
    //  + private key                             + private key
    //  + public key                              + public key
    //  + secret key                              + secret key
    //  + message                                 _ MESSAGE
    
    // 6. ------------------------------------------------------------------
    // Bob receives the important message and decrypts with secret key.
    
    bob.whisperTheSecretMessage();
    
    //
    //    O                     (((   (((   (((   \O/   )))
    //   /|\                                       |
    //   / \                                      / \
    //
    //  ALICE                                     BOB
    //  + public key                              + public key
    //  + private key                             + private key
    //  + public key                              + public key
    //  + secret key                              + secret key
    //  + message                                 + message
    

    https://github.com/firatkucuk/diffie-hellman-helloworld