Время создания 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 минут на создание ключа.
Вопросы:
- Кто-нибудь еще получает такие же результаты?
- Есть ли какая-то оптимизация, которую нужно запустить, чтобы добиться меньшего времени?
- От чего зависит высокая флуктуация? (т.е. для генерации 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());