2017-09-14 170 views
0

我已經加入bcprov-jdk15on-1.58.jar在Eclipse項目文件 - Java構建路徑 - >庫...的Java BouncyCastleProvider運行很長時間

我有一個問題:當我運行的主類是運行時間太長而沒有做任何事情,但任務管理器中的javaw.exe正在使用25%的CPU。在我的代碼下面的過程是打印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); 
} 

} 
+0

嘿,你試過下面的例子嗎? –

回答

0

我工作的東西類似這樣,所以我在當時遇到下面的鏈接。我已經參考回答你的問題爲什麼會發生。

請登陸我的回答的最後環節的實際問題,可能是能夠幫助你更好地

我會盡量給你一段代碼,生成隨機密鑰對一些另外的算法,但如果你真的很急於完成這項工作,那麼對你來說,這也是一個更好更快的解決方案。首先,雖然Java在業務邏輯方面速度肯定快,但是當涉及到密碼學時,優化的C代碼(包含它在其中的程序集)將使它無法實現。 Java將使用BigInteger來執行這些計算,並且據我所知BigInteger不包含本地優化蒙哥馬利乘數。腳本語言通常比Java更糟,除非他們調用本地代碼。

Java還需要時間來優化字節碼。這意味着如果它被多次調用,它運行得更快。因此,如果在應用程序中多次調用這種方法,您至少需要調用一個關鍵gen來查看會發生什麼情況。在這種情況下,運行時可能非常高以至於已經能夠優化 - 這取決於VM。

因此,實際使用的隨機數生成器實現會產生很大的差異 - 尤其是如果隨機數生成器可以阻止,如果沒有足夠的熵可用。因此,請隨意使用可用的隨機數生成器,直到找到足夠快速和安全的生成器爲止。

找到一定長度的素數是一個沒有指定運行時的進程。挑選一個非常大的數字(在這種情況下,大小約爲2048位),並在隨後的數字爲素數時開始測試。這是什麼錘擊你的CPU。因此,您需要計算生成素數的平均運行時間(如果您正在生成大量素數),或者您將不得不忍受所花時間的不確定性。

如果你想有生成密鑰對的一個更快的方法,你可以做幾件事情:

  1. 獲得本地實現一個Java供應商,這是否對你
  2. 切換到另一個算法的該密鑰對生成速度快,如 橢圓曲線加密
  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); 
} 

}