2017-09-14 1 views
0

내가 추가 한 bcprov-jdk15on-1.58.jar Eclipse 프로젝트에서 파일 - 자바 BouncyCastleProvider 오랜 시간 실행

내가 문제가있는 ...> 라이브러리 - 자바 빌드 경로 : 내가 메인 클래스를 실행할 때 실행 너무 오랜 시간과 아무것도하지,하지만 javaw.exe 작업 관리자에서 CPU의 25 %를 사용하고 있습니다. 아래의 코드에서 프로세스는 3 (main method)을 인쇄하고 this => 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); 
} 

} 
+0

안녕하세요 당신은 아래 예를 시도 했습니까? –

답변

0

저는 비슷한 클립으로 작업 했으므로 그 당시 링크를 발견했습니다. 나는 당신의 질문에 왜 그런 일이 일어 났는지에 대한 답을 얻기 위해 참고를 취했다.

내 대답의 끝에서 링크의 실제 질문을 방문하시기 바랍니다, 즉 더 나은 방법으로 당신을 도울 수있을 수 있습니다

좀 다른 알고리즘 랜덤 키 쌍을 생성하는 당신에게 코드를 제공하기 위해 노력할 것입니다

하지만, 만약 당신이 정말로 서둘러이 일을한다면, 당신을 위해 더 빠르고 더 좋은 해결책이 될 수 있습니다.

우선 Java가 비즈니스 로직과 관련하여 확실히 빠르지 만 최적화 된 C 코드 (카운트가있는 어셈블리 포함)는 암호화와 관련하여 물 밖으로 날려 버릴 수 있습니다. Java는 BigInteger를 사용하여 이러한 계산을 수행하며, BigInteger는 내가 알고있는 한, 기본 최적화 된 Montgomery 배수를 포함하지 않습니다. 스크립팅 언어는 일반적으로 원시 코드를 호출하지 않는 한 Java보다 훨씬 나쁩니다.

Java는 또한 바이트 코드를 최적화하는 데 시간이 필요합니다. 즉, 여러 번 호출하면 더 빠르게 실행됩니다. 따라서 적어도 하나의 핵심 gen을 호출해야 응용 프로그램에서 이러한 메서드가 여러 번 호출되는 경우 어떤 일이 발생하는지 확인할 수 있습니다. 이 경우 런타임이 너무 높아서 이미 최적화 할 수 있습니다 (VM에 따라 다름).

그래서 실제로 사용되는 난수 생성기 구현은 많은 차이를 만듭니다. 특히 엔트로피가 충분하지 않으면 난수 생성기가 차단할 수있는 경우 특히 그렇습니다. 따라서 충분히 빠르고 안전한 것을 찾을 때까지 난수 생성기를 사용할 수 있습니다.

특정 길이의 프라임을 찾는 것은 지정된 런타임이없는 프로세스입니다. 매우 큰 숫자 (이 경우 약 2048 비트의 크기)가 선택되고 후속 숫자가 소수 인 경우 테스트를 시작합니다. 이것은 CPU를 망치는 것입니다. 따라서 프라임 생성의 평균 런타임을 계산해야합니다. 많은 시간을 생성하는 경우를 대비하여 - 또는 시간에 대한 불확실성을 가지고 살아야합니다.

당신은 몇 가지 할 수있는 키 쌍을 생성하는 빠른 방법이하려는 경우 :

  1. 가 다른 알고리즘에 당신
  2. 스위치에 대해이 작업을 수행하는 Java 공급자의 기본 구현을 취득을 이는 키 쌍 ​​생성은 타원 곡선 암호
  3. 로/OpenSSL을 그냥 가져 오기를 사용하여 키를 생성하는 Java 응용 프로그램에서 사용, 빠르고

일반적으로 키 쌍 생성기 대신 프로토콜을 수정해야합니다.

심판 : Why KeyPairGenerator.genKeyPair() so slow

0

나는 해결책을 가지고 당신은 DH 알고리즘에 대한 약간의 지식이 필요합니다 것을 이해하는 것이.

초 단위로 실행됩니다 !!!!!!!

이 stackexchange 링크를 참조하십시오 : 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); 
} 

} 
관련 문제