在生成DH参数时,我在使用Bouncy Castle Provider时遇到了一些性能问题。任何人都知道为什么下面的Bouncy Castle示例比使用标准提供程序慢大约50倍?
使用Bouncy Castle提供者:
Security.addProvider(new BouncyCastleProvider());
AlgorithmParameterGenerator generator = AlgorithmParameterGenerator.getInstance("DH", "BC");
for (int i = 0; i < 3; i++) {
generator.init(1024, new SecureRandom());
AlgorithmParameters params = generator.generateParameters();
DHParameterSpec dhSpec = (DHParameterSpec) params.getParameterSpec(DHParameterSpec.class);
System.out.println("P: " + dhSpec.getP() + ", G:" + dhSpec.getG());
}
使用标准提供者:
AlgorithmParameterGenerator generator = AlgorithmParameterGenerator.getInstance("DH");
for (int i = 0; i < 3; i++) {
generator.init(1024, new SecureRandom());
AlgorithmParameters params = generator.generateParameters();
DHParameterSpec dhSpec = (DHParameterSpec) params.getParameterSpec(DHParameterSpec.class);
System.out.println("P: " + dhSpec.getP() + ", G:" + dhSpec.getG());
}
答案 0 :(得分:4)
速度差异的原因是BC提供商正在搜索“Safe Prime”,即素数p:p = 2q + 1,其中q也是素数。
正如你所注意到的,这比找到素数慢得多。标准提供商没有这样做,因为很容易验证。
寻找安全素数可能是过度的,因为对于某些R而言p = 2Rq + 1可能就足够了,这允许实现相当快的速度,同时仍然确保(p-1)的大素因子。 / p>
没有必要经常自己生成这些参数(如果有的话)。单个集合可以用于许多密钥对,并且有一些标准化的参数集可以更好地使用。