2015-05-08 26 views
5

próbuję wygenerować wspólne hasło w mojej aplikacji tak:Generowanie PublicKey od xiy wartości eliptycznej punktu krzywej

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

to działa dobrze, ale PublicKey używam tutaj należy pochodzących z backend.

Serwer pocztowy wysyła mi po prostu wartość x i y punktu na krzywej eliptycznej, a teraz mam wygenerować z tego PublicKey. Ale po prostu nie mogę tego rozgryźć! Jak mogę utworzyć instancję PublicKey tylko z tych dwóch wartości?

Odpowiedz

6

To naprawdę proste! Ale potrzebujesz jeszcze jednej rzeczy oprócz wartości x i y. Potrzebujesz również ECParameterSpec! ECParameterSpec opisuje krzywą eliptyczną, z której korzystasz, a Twoja aplikacja musi używać tego samego ECParameterSpec, tak jak to robi twój backend!


z wartościami x i y można utworzyć instancję ECPoint i razem ze swoim ECParameterSpec można utworzyć ECPublicKeySpec:

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

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

A teraz z tego ECPublicKeySpec można wygenerować PublicKey użyciu KeyFactory :

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

Możesz znaleźć więcej informacji na ten temat here.