我在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);
}
}
答案 0 :(得分:0)
我曾经做过类似的事情,所以当时我遇到了下面的链接。我已经参考了回答你的问题为什么会发生这种情况。
请在我的答案结尾处访问链接中的实际问题,可能会更好地帮助您
我会尝试给你一个代码片段,用另一种算法生成随机密钥对,但如果你真的急于解决这个问题,那么同样可能是一个更好,更快的解决方案。
首先,尽管Java在业务逻辑方面肯定是快速的,但是在加密方面,优化的C代码(具有重要性的程序集)将会被淘汰出局。 Java将使用BigInteger来执行这些计算,而据我所知,BigInteger不包含原生优化的蒙哥马利乘数。脚本语言通常比Java差得多,除非它们调用本机代码。
Java还需要时间来优化字节代码。这意味着如果多次调用它会运行得更快。所以你需要至少调用一个密钥gen才能看到如果在你的应用程序中多次调用这样的方法会发生什么。在这种情况下,运行时可能非常高,以至于它已经能够进行优化 - 这取决于VM。
因此,使用的实际随机数生成器实现会产生很大的不同 - 特别是如果随机数生成器可以阻止,如果没有足够的熵可用。因此,请使用随机数生成器,直到找到足够快速且安全的生成器。
查找特定长度的素数是一个没有指定运行时的过程。拾取一个非常大的数字(在这种情况下大小约为2048位)并开始测试后续数字是否为素数。这是锤击你的CPU的原因。因此,您需要计算生成素数的平均运行时间 - 如果您生成了大量素数 - 或者您将不得不忍受所需时间的不确定性。
如果您希望更快地生成密钥对,可以执行以下操作:
通常你需要修复协议而不是密钥对生成器。
答案 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);
}
}