java BouncyCastleProvider长时间运行

时间:2017-09-14 11:03:40

标签: java security cryptography jce

我在Eclipse项目中添加了bcprov-jdk15on-1.58.jar文件 - Java Build Path - >图书馆......

我遇到了一个问题:当我运行主类时,它运行时间太长而没有做任何事情,但任务管理器中的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);
}

}

2 个答案:

答案 0 :(得分:0)

我曾经做过类似的事情,所以当时我遇到了下面的链接。我已经参考了回答你的问题为什么会发生这种情况。

请在我的答案结尾处访问链接中的实际问题,可能会更好地帮助您

我会尝试给你一个代码片段,用另一种算法生成随机密钥对,但如果你真的急于解决这个问题,那么同样可能是一个更好,更快的解决方案。

首先,尽管Java在业务逻辑方面肯定是快速的,但是在加密方面,优化的C代码(具有重要性的程序集)将会被淘汰出局。 Java将使用BigInteger来执行这些计算,而据我所知,BigInteger不包含原生优化的蒙哥马利乘数。脚本语言通常比Java差得多,除非它们调用本机代码。

Java还需要时间来优化字节代码。这意味着如果多次调用它会运行得更快。所以你需要至少调用一个密钥gen才能看到如果在你的应用程序中多次调用这样的方法会发生什么。在这种情况下,运行时可能非常高,以至于它已经能够进行优化 - 这取决于VM。

因此,使用的实际随机数生成器实现会产生很大的不同 - 特别是如果随机数生成器可以阻止,如果没有足够的熵可用。因此,请使用随机数生成器,直到找到足够快速且安全的生成器。

查找特定长度的素数是一个没有指定运行时的过程。拾取一个非常大的数字(在这种情况下大小约为2048位)并开始测试后续数字是否为素数。这是锤击你的CPU的原因。因此,您需要计算生成素数的平均运行时间 - 如果您生成了大量素数 - 或者您将不得不忍受所需时间的不确定性。

如果您希望更快地生成密钥对,可以执行以下操作:

  1. 获取为您执行此操作的Java提供程序的本机实现
  2. 切换到另一种快速生成密钥对的算法,例如  椭圆曲线密码学
  3. 使用openssl生成密钥,只需在Java应用程序中导入/使用它们
  4. 通常你需要修复协议而不是密钥对生成器。

    参考:Why KeyPairGenerator.genKeyPair() so slow

答案 1 :(得分: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);
}

}