Время создания DH Keypair на Android

Это код, который я использую для создания пары ключей DH:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH");
keyGen.initialize(1024, new SecureRandom());
KeyPair ackp = keyGen.generateKeyPair();

(без необходимости попробовать / поймать, конечно).

Я провел несколько тестов, выполняющих такой код итеративно и меняющих размер ключа (в частности, увеличение от 128 с шагом 128 до 1024. 1024 будет желательным размером).

Прежде всего, выполнение каждого поколения генерации 10 раз с некоторым минимальным отклонением стандартного отклонения результатов дает ВЫСОКУЮ флуктуацию результатов, в любом случае, в среднем, время, необходимое для создания ключей (1024 бит), составляет: 683027 мс, что округляет до примерно 11 минут на создание ключа.

Вопросы:

  1. Кто-нибудь еще получает такие же результаты?
  2. Есть ли какая-то оптимизация, которую нужно запустить, чтобы добиться меньшего времени?
  3. От чего зависит высокая флуктуация? (т.е. для генерации 1024-битного ключа это может занять от 18 секунд до 30 минут...)

Тесты были проведены на телефоне Nexus-One

Заранее спасибо за то, что пролили свет на проблему

С уважением

1 ответ

Решение

Я провел дальнейшее кодирование / исследование, и, видимо, вызов, который занимает больше всего времени (батареи?):

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());
Другие вопросы по тегам