Java BouncyCastleProvider долгое время работать
Я добавил файл bcprov-jdk15on-1.58.jar в проект Eclipse - Путь сборки Java -> Библиотеки...
У меня проблема: когда я запускаю основной класс, он работает слишком долго и ничего не делает, но javaw.exe в диспетчере задач использует 25% процессорного времени. в моем коде ниже процесс печатает 3 (основной метод) и ждет этого => kpg.genKeyPair(), который не заканчивается;
Может кто-нибудь объяснить, почему это происходит и как это исправить?
package dhcrypto;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PublicKey;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class MyMain {
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException, InvalidKeyException{
Security.addProvider(new BouncyCastleProvider());
System.out.println("1");
KeyPairGenerator kpg = KeyPairGenerator.getInstance("DH","BC");
System.out.println("2");
kpg.initialize(2048);
System.out.println("3");
KeyPair kp = kpg.genKeyPair();
System.out.println("4");
PublicKey userPublicKey = kp.getPublic();
System.out.println("5");
System.out.println("Public Key: "+userPublicKey);
}
}
2 ответа
Я работал над чем-то похожим на это, поэтому я наткнулся на ссылку ниже. Я взял ссылку, чтобы ответить на ваш вопрос, почему это происходит.
Пожалуйста, посетите актуальный вопрос по ссылке в конце моего ответа, может быть, это может помочь вам лучше
Я постараюсь дать вам фрагмент кода для генерации случайной пары ключей с помощью другого алгоритма, но это может быть лучшим и более быстрым решением для вас, если вы действительно торопитесь с этим работать.
Во-первых, хотя Java, безусловно, быстр в отношении бизнес-логики, оптимизированный код C (со сборкой, где он имеет значение) выбьет его из воды, когда дело доходит до криптографии. Java будет использовать BigInteger для выполнения этих вычислений, а BigInteger - насколько я знаю - не содержит встроенного оптимизированного множителя Монтгомери. Языки сценариев, как правило, намного хуже, чем Java, если они не вызывают нативный код.
Java также нужно время для оптимизации байтового кода. Это означает, что он работает быстрее, если он вызывается несколько раз. Поэтому вам нужно как минимум вызвать один ключевой ген, прежде чем посмотреть, что произойдет, если такой метод вызывается несколько раз в вашем приложении. В этом случае время выполнения может быть настолько высоким, что его уже можно оптимизировать - это зависит от виртуальной машины.
Таким образом, используемая реализация генератора случайных чисел имеет большое значение, особенно если генератор случайных чисел может блокироваться, если недостаточно энтропии. Так что поиграйте с генераторами случайных чисел, пока не найдете достаточно быстрый и безопасный.
Поиск простого числа определенной длины - это процесс, который не имеет назначенного времени выполнения. Выбирается очень большое число (в данном случае размером около 2048 бит) и начинается тестирование, если последующие числа являются простыми. Это то, что забивает ваш процессор. Таким образом, вам нужно рассчитать среднее время выполнения генерации простого числа - в случае, если вы генерируете много из них - или вам придется жить с неопределенностью относительно времени, которое требуется.
Если вы хотите иметь более быстрый способ генерации пар ключей, вы можете сделать несколько вещей:
- получить нативную реализацию Java-провайдера, которая сделает это за вас
- переключиться на другой алгоритм, для которого генерируется пара ключей, такой как криптография с эллиптической кривой
- сгенерируйте ключи с помощью openssl и просто импортируйте / используйте их в вашем Java-приложении
Обычно, хотя вам нужно будет исправить протокол вместо генератора пар ключей.
Я получил решение и понял, что вам нужно немного знать об алгоритме DH.
Теперь он работает за доли секунды!!!!!!!
Пожалуйста, обратитесь к этой ссылке на обмен стеками: https://security.stackexchange.com/questions/45963/diffie-hellman-key-exchange-in-plain-english
Обратитесь к пункту "1". по этой ссылке вы должны придумать 2 простых числа, и это то, что я сделал в вашей программе.
Надеюсь, это поможет вам.
package test;
import java.math.BigInteger;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Security;
import javax.crypto.spec.DHParameterSpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class MyMain {
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException, InvalidKeyException{
BigInteger g512 = BigInteger.valueOf(2);
final byte skip1024ModulusBytes[] = { (byte) 0xF4,
(byte) 0x88, (byte) 0xFD, (byte) 0x58, (byte) 0x4E, (byte) 0x49,
(byte) 0xDB, (byte) 0xCD, (byte) 0x20, (byte) 0xB4, (byte) 0x9D,
(byte) 0xE4, (byte) 0x91, (byte) 0x07, (byte) 0x36, (byte) 0x6B,
(byte) 0x33, (byte) 0x6C, (byte) 0x38, (byte) 0x0D, (byte) 0x45,
(byte) 0x1D, (byte) 0x0F, (byte) 0x7C, (byte) 0x88, (byte) 0xB3,
(byte) 0x1C, (byte) 0x7C, (byte) 0x5B, (byte) 0x2D, (byte) 0x8E,
(byte) 0xF6, (byte) 0xF3, (byte) 0xC9, (byte) 0x23, (byte) 0xC0,
(byte) 0x43, (byte) 0xF0, (byte) 0xA5, (byte) 0x5B, (byte) 0x18,
(byte) 0x8D, (byte) 0x8E, (byte) 0xBB, (byte) 0x55, (byte) 0x8C,
(byte) 0xB8, (byte) 0x5D, (byte) 0x38, (byte) 0xD3, (byte) 0x34,
(byte) 0xFD, (byte) 0x7C, (byte) 0x17, (byte) 0x57, (byte) 0x43,
(byte) 0xA3, (byte) 0x1D, (byte) 0x18, (byte) 0x6C, (byte) 0xDE,
(byte) 0x33, (byte) 0x21, (byte) 0x2C, (byte) 0xB5, (byte) 0x2A,
(byte) 0xFF, (byte) 0x3C, (byte) 0xE1, (byte) 0xB1, (byte) 0x29,
(byte) 0x40, (byte) 0x18, (byte) 0x11, (byte) 0x8D, (byte) 0x7C,
(byte) 0x84, (byte) 0xA7, (byte) 0x0A, (byte) 0x72, (byte) 0xD6,
(byte) 0x86, (byte) 0xC4, (byte) 0x03, (byte) 0x19, (byte) 0xC8,
(byte) 0x07, (byte) 0x29, (byte) 0x7A, (byte) 0xCA, (byte) 0x95,
(byte) 0x0C, (byte) 0xD9, (byte) 0x96, (byte) 0x9F, (byte) 0xAB,
(byte) 0xD0, (byte) 0x0A, (byte) 0x50, (byte) 0x9B, (byte) 0x02,
(byte) 0x46, (byte) 0xD3, (byte) 0x08, (byte) 0x3D, (byte) 0x66,
(byte) 0xA4, (byte) 0x5D, (byte) 0x41, (byte) 0x9F, (byte) 0x9C,
(byte) 0x7C, (byte) 0xBD, (byte) 0x89, (byte) 0x4B, (byte) 0x22,
(byte) 0x19, (byte) 0x26, (byte) 0xBA, (byte) 0xAB, (byte) 0xA2,
(byte) 0x5E, (byte) 0xC3, (byte) 0x55, (byte) 0xE9, (byte) 0x2F,
(byte) 0x78, (byte) 0xC7 };
BigInteger p512 = new BigInteger(1, skip1024ModulusBytes);
Security.addProvider(new BouncyCastleProvider());
System.out.println("1");
DHParameterSpec dhParams = new DHParameterSpec(p512, g512);
KeyPairGenerator kpg = KeyPairGenerator.getInstance("DH","BC");
kpg.initialize(dhParams, new SecureRandom());
System.out.println("2");
kpg.initialize(2048);
System.out.println("3");
KeyPair kp = kpg.genKeyPair();
System.out.println("4");
PublicKey userPublicKey = kp.getPublic();
System.out.println("5");
System.out.println("Public Key: "+userPublicKey);
}
}