4

在生成 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());
}
4

1 回答 1

4

速度差异的原因是 BC 提供者正在搜索“安全素数”,即素数 p:p = 2q + 1,其中 q 也是素数。

正如您所注意到的,这比仅找到素数要慢得多。标准提供者没有这样做,这很容易被验证。

寻找一个安全的素数可能是矫枉过正,因为对于一些 R 来说 p = 2Rq + 1 就足够了,这可以实现相当快的实现,同时仍然确保 (p - 1) 的大素数因子。

不需要经常自己生成这些参数(如果有的话)。一组密钥可用于许多密钥对,并且有标准化的参数集,您最好使用它们。

于 2012-11-13T10:40:12.767 回答