2015-05-08 11 views
5

Sto cercando di generare un segreto condiviso nella mia app come questo:Generazione PublicKey da valori x e y del ellittica punto curva

public static byte[] generateSharedSecret(PrivateKey privateKey PublicKey publicKey) { 
    KeyAgreement keyAgreement = KeyAgreement.getInstance("ECDH", "SC"); 
    keyAgreement.init(privateKey); 
    keyAgreement.doPhase(publicKey, true); 
    return keyAgreement.generateSecret(); 
} 

Questo sta lavorando bene, ma il PublicKey che uso qui dovrebbe provenire il back-end.

Il backend mi invia semplicemente il valore x e di un punto su una curva ellittica e ora dovrei generare lo PublicKey da quello. Ma non riesco a capirlo! Come posso creare un'istanza PublicKey solo da questi due valori?

risposta

6

In realtà è piuttosto semplice! Ma hai bisogno di un'altra cosa oltre ai valori x e . Hai anche bisogno di un ECParameterSpec! Il ECParameterSpec descrive la curva ellittica che stai utilizzando e l'app deve utilizzare lo stesso ECParameterSpec come fa il tuo backend!


Con i valori x e y è possibile creare un'istanza ECPoint e insieme al vostro ECParameterSpec è possibile creare un ECPublicKeySpec:

ECParameterSpec ecParameters = ...; 
BigInteger x = ...; 
BigInteger y = ...; 

ECPoint ecPoint = new ECPoint(x, y); 
ECPublicKeySpec keySpec = new ECPublicKeySpec(ecPoint, ecParameters); 

E ora con che ECPublicKeySpec è possibile generare il PublicKey utilizzando un KeyFactory :

KeyFactory keyFactory = KeyFactory.getInstance("EC"); 
PublicKey publicKey = keyFactory.generatePublic(keySpec); 

È possibile trovare ulteriori informazioni su questo argomento here.