2017-09-14 4 views
0

>ライブラリ...javaのBouncyCastleProvider長時間実行

は私が問題を抱えている:私はそれが実行されているメインクラスを実行すると時間がかかりすぎて何もしないが、タスクマネージャのjavaw.exeはCPUの25%を使用している。私のコードでは、プロセスは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は私が知る限り、ネイティブに最適化されたMontgomery乗数を含んでいません。スクリプト言語は、ネイティブコードを呼び出さない限り、一般にJavaよりもはるかに悪いです。

Javaもバイトコードを最適化する時間が必要です。これは、複数回呼び出された場合、より速く実行されることを意味します。したがって、アプリケーションでこのようなメソッドが複数回呼び出されると、何が起こるかを知るために、少なくとも1つの主要なgenを呼び出す必要があります。この場合、ランタイムは非常に高く、すでに最適化できます。これはVMに依存します。

実際に使用される乱数ジェネレータの実装は、特に乱数ジェネレータが十分なエントロピーが利用できない場合にブロックすることができる場合、大きな違いをもたらします。高速で安全なものが見つかるまで、利用可能な乱数ジェネレータで遊んでください。

特定の長さの素数を見つけることは、指定された実行時間を持たないプロセスです。非常に大きな数(この場合は約2048ビット)が選択され、後続の数値が素数であるかどうかのテストが開始されます。これがあなたのCPUを叩くものです。したがって、素数を生成する場合のために素数を生成する平均ランタイムを計算する必要があります。そうしないと、不確実性が生まれることになります。

あなたはいくつかのことを行うことができます鍵ペアを生成するより高速な方法が欲しい場合:

  1. のための別のアルゴリズムにあなた
  2. スイッチのためにこれを行うJavaプロバイダのネイティブ実装を取得その鍵ペアの生成は、このような 楕円曲線暗号
  3. として/ opensslのとちょうどインポートを使用してキーを生成するJavaアプリケーションでそれらを使用し、高速で

通常、鍵ペア生成プログラムの代わりにプロトコルを修正する必要があります。

参考:Why KeyPairGenerator.genKeyPair() so slow

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); 
} 

} 
関連する問題