Я провел дальнейшее кодирование / исследование, и, видимо, вызов, который потребляет больше всего времени (батареи?):
new SecureRandom()
В частности, тем не менее, поскольку для DH параметры (g, p, l) могут быть предварительно вычислены и жестко запрограммированы, целесообразно сделать это заранее и использовать сгенерированные значения для генерации пары ключей (которая будет быть почти мгновенным).
Пример кода:
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH");
keyGen.initialize(new DHParameterSpec(p, g, l));
KeyPair ackp = keyGen.generateKeyPair();
Где p, g и l:
final BigInteger p = new BigInteger("X");
final BigInteger g = new BigInteger("Y");
final int l = 1023;
И X и Y могут быть сгенерированы в автономном режиме с помощью:
AlgorithmParameterGenerator paramGen = AlgorithmParameterGenerator.getInstance("DH");
paramGen.init(1024, new SecureRandom());
AlgorithmParameters params = paramGen.generateParameters();
DHParameterSpec dhSpec = (DHParameterSpec)params.getParameterSpec(DHParameterSpec.class);
System.out.println("p: " + dhSpec.getP() + "\ng: " + dhSpec.getG() + " \nl: " + dhSpec.getL());