2012-04-12 57 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 2012-04-12 06:38:01

+0

@ user1208304您可能想提一下[獲取那一點代碼](http://www.bouncycastle.org/wiki/display/JA1/Elliptic+Curve+Key+Pair+Generation+and+Key+Factories) 。 – martijno 2012-12-27 21:38:03

回答

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