2017-09-14 132 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); 
} 

} 
相关问题