2017-03-07 2 views
2

J'essaie de générer une clé publique à partir d'une clé privée et d'une courbe connue. Ci-dessous mon code:Générer ECPublicKey à partir de 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())); 

Cependant, quand je l'appelle: kf.generatePublic(new X509EncodedKeySpec(Q.getEncoded(false))) je reçois l'exception: java.security.spec.InvalidKeySpecException: encoded key spec not recognised (pas mon mal orthographié)

I semble je ne calcule pas correctement Q, mais je ne suis pas sûr où est mon erreur.

Merci pour l'aide!

+0

Pourquoi pensez-vous que vous pouvez obtenir une clé publique d'une clé privée? – Egl

+0

En utilisant ECC c'est juste la multiplication de points si vous connaissez la courbe (secp256r1) – markw

+0

J'espère que ce n'est pas vrai dans le sens inverse. Je veux dire, j'espère qu'une clé privée ECC ne peut pas être obtenue simplement en connaissant la clé publique et la courbe. Est-ce? – Egl

Répondre

3

Dans le cas où mon futur moi a besoin de la solution:

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