2012-04-12 3 views
1

Мне нужно преобразовать открытый ключ в BigInteger. В приведенном ниже коде я извлек закрытый ключ и сохранил его как BigInteger. Но когда я следил за тем же методом для публики, он не работает.Как преобразовать открытый ключ в BigInteger

public static void main(String[] args) throws Exception { 
    Security.addProvider(new BouncyCastleProvider()); 
    BigInteger ZERO=new BigInteger("0"); 
    int c; 
    // ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("P-224"); 
    ECCurve curve = new ECCurve.Fp(
      new  BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839"), // q 
      new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16), // a 
      new BigInteger("6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a", 16)); // b 

    ECParameterSpec ecSpec = new ECParameterSpec(
      curve, 
      curve.decodePoint(Hex.decode("020ffa963cdca8816ccc33b8642bedf905c3d358573d3f27fbbd3b3cb9aaaf")), // G 
       new BigInteger("883423532389192164791648750360308884807550341691627752275345424702807307")); // n 
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECDSA", "BC"); 
    kpg.initialize(ecSpec, new SecureRandom()); 
    KeyPair keyPair = kpg.generateKeyPair(); 
    PublicKey pubKey = keyPair.getPublic(); 
    System.out.println(pubKey); 
    PrivateKey privKey = keyPair.getPrivate(); 
    System.out.println(privKey); 
    BigInteger s = ((ECPrivateKey) privKey).getS(); 
    System.out.println(s); 
+2

Как он работает? Вы получаете исключение? – serg10

+0

@ user1208304 Возможно, вы захотите указать, где вы [получили этот код] (http://www.bouncycastle.org/wiki/display/JA1/Elliptic+Curve+Key+Pair+Generation+and+Key+Factories) , – martijno

ответ

1

В ECDSA закрытый ключ является BigInteger, но открытый ключ является ECPoint (состоящий из двух BigInteger значений). Преобразование его в BigInteger не будет работать. Использовать

ECPoint w = ((ECPublicKey)pubKey).getW(); 
BigInteger wx = w.getAffineX(), wy = w.getAffineY(); 
System.out.println(wx); 
System.out.println(wy); 
Смежные вопросы