Время создания DH Keypair на Android - PullRequest
3 голосов
/ 18 марта 2010

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

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

(без необходимой попытки / улова, конечно).

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

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

Вопросы:

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

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

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

Привет

1 Ответ

7 голосов
/ 24 марта 2010

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

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());
...