2017-03-07 2 views
2

Ich versuche, einen öffentlichen Schlüssel mit einem privaten Schlüssel und einer bekannten Kurve zu generieren. Unten ist mein Code:Erzeuge ECPublicKey von ECPrivateKey

// Generate Keys 
ECGenParameterSpec ecGenSpec = new ECGenParameterSpec("secp256r1"); 
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "BC"); 
keyPairGenerator.initialize(ecGenSpec, new SecureRandom()); 
java.security.KeyPair pair = keyPairGenerator.generateKeyPair(); 
ECPrivateKey privateKey = (ECPrivateKey) pair.getPrivate(); 
ECPublicKey publicKeyExpected = (ECPublicKey) pair.getPublic(); 

// Expected public key 
System.out.print("Expected Public Key: " + 
     BaseEncoding.base64Url().encode(publicKeyExpected.getEncoded())); 

// Generate public key from private key 
X9ECParameters ecp = SECNamedCurves.getByName("secp256r1"); 
ECDomainParameters domainParams = new ECDomainParameters(ecp.getCurve(), 
     ecp.getG(), ecp.getN(), ecp.getH(), 
     ecp.getSeed()); 
ECPoint Q = domainParams.getG().multiply(privateKey.getS()); // is this correct? 
KeyFactory kf = KeyFactory.getInstance("ECDSA", "BC"); 
ECPublicKey publicKeyGenerated = 
     (ECPublicKey) kf.generatePublic(new X509EncodedKeySpec(Q.getEncoded(false))); // exception here 

// Generated public key from private key 
System.out.print("Generated Public Key: " + 
     BaseEncoding.base64Url().encode(publicKeyGenerated.getEncoded())); 

jedoch, wenn ich rufe: kf.generatePublic(new X509EncodedKeySpec(Q.getEncoded(false))) ich die Ausnahme erhalten: java.security.spec.InvalidKeySpecException: encoded key spec not recognised (nicht meine Rechtschreibfehler)

I I Q falsch bin Berechnung erscheint, aber ich bin nicht sicher, wo mein Fehler ist.

Danke für die Hilfe!

+0

Warum denken Sie, Sie einen öffentlichen Schlüssel aus einem privaten Schlüssel zu bekommen? – Egl

+0

Mit ECC ist es nur Punktmultiplikation, wenn Sie die Kurve kennen (secp256r1) – markw

+0

Ich hoffe, dass es in der umgekehrten Weise nicht wahr ist. Ich meine, ich hoffe, dass ein privater ECC-Schlüssel nicht erhalten werden kann, wenn man nur den öffentlichen Schlüssel und die Kurve kennt. Ist es? – Egl

Antwort

3

Falls meine Zukunft selbst braucht die Lösung:

// Generate Keys 
ECGenParameterSpec ecGenSpec = new ECGenParameterSpec("secp256r1"); 
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "BC"); 
keyPairGenerator.initialize(ecGenSpec, new SecureRandom()); 
java.security.KeyPair pair = keyPairGenerator.generateKeyPair(); 
ECPrivateKey privateKey = (ECPrivateKey) pair.getPrivate(); 
ECPublicKey publicKeyExpected = (ECPublicKey) pair.getPublic(); 

// Expected public key 
System.out.print("Expected Public Key: " + 
     BaseEncoding.base64Url().encode(publicKeyExpected.getEncoded())); 

// Generate public key from private key 
KeyFactory keyFactory = KeyFactory.getInstance("ECDSA", "BC"); 
ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1"); 

ECPoint Q = ecSpec.getG().multiply(privateKey.getD()); 
byte[] publicDerBytes = Q.getEncoded(false); 

ECPoint point = ecSpec.getCurve().decodePoint(publicDerBytes); 
ECPublicKeySpec pubSpec = new ECPublicKeySpec(point, ecSpec); 
ECPublicKey publicKeyGenerated = (ECPublicKey) keyFactory.generatePublic(pubSpec); 

// Generated public key from private key 
System.out.print("Generated Public Key: " + 
     BaseEncoding.base64Url().encode(publicKeyGenerated.getEncoded()));