【问题标题】:java BouncyCastleProvider long time runjava BouncyCastleProvider长时间运行
【发布时间】:2017-09-14 11:03:39
【问题描述】:

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

我有一个问题:当我运行主类时,它运行的时间太长,什么也没做,但是任务管理器中的 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);
}

}

【问题讨论】:

  • 嘿,你试过下面的例子吗?

标签: java security cryptography jce


【解决方案1】:

我做过类似的事情,所以当时我看到了下面的链接。我参考了回答你的问题为什么会这样。

请访问我答案末尾的链接中的实际问题,这可能会以更好的方式帮助您

我将尝试为您提供一个代码 sn-p 以使用其他算法生成随机密钥对,但如果您真的急于处理此问题,这对您来说可能是一个更好更快的解决方案。

首先,尽管 Java 在业务逻辑方面确实很快,但在涉及密码学时,优化的 C 代码(在重要的地方使用汇编)将把它从水中吹走。 Java 将使用 BigInteger 来执行这些计算,而 BigInteger - 据我所知 - 不包含本机优化的蒙哥马利乘数。脚本语言通常比 Java 差得多,除非它们调用本机代码。

Java 也需要时间来优化字节码。这意味着如果多次调用它,它会运行得更快。因此,您至少需要先调用一个密钥生成器,然后才能查看如果在您的应用程序中多次调用此类方法会发生什么。在这种情况下,运行时可能会很高,以至于它已经能够优化 - 这取决于 VM。

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

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

如果您想以更快的方式生成密钥对,您可以执行以下操作:

  1. 获取为您执行此操作的 Java Provider 的本机实现
  2. 切换到另一种密钥对生成速度较快的算法,例如 椭圆曲线密码学
  3. 使用 openssl 生成密钥,然后在您的 Java 应用程序中导入/使用它们

虽然您通常需要修复协议而不是密钥对生成器。

参考:Why KeyPairGenerator.genKeyPair() so slow

【讨论】:

    【解决方案2】:

    我得到了一个解决方案,并且了解您需要对 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);
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 2018-04-07
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      相关资源
      最近更新 更多