Генерация PublicKey из значений x и y точки эллиптической кривой

Я пытаюсь создать общий секрет в своем приложении следующим образом:

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

Это работает нормально, но PublicKey, который я здесь использую, должен исходить из бэкенда.

Серверная часть просто отправляет мне значения x и y точки на эллиптической кривой, и теперь я должен сгенерировать из них PublicKey. Но я просто не могу понять это! Как я могу создать экземпляр PublicKey только из этих двух значений?


person Datenshi    schedule 08.05.2015    source источник


Ответы (1)


Это на самом деле очень просто! Но помимо значений x и y вам понадобится еще кое-что. Вам также нужен ECParameterSpec! ECParameterSpec описывает используемую вами эллиптическую кривую, и ваше приложение должно использовать ту же ECParameterSpec, что и ваш сервер!


Со значениями x и y вы можете создать экземпляр ECPoint, а вместе со своим ECParameterSpec вы можете создать ECPublicKeySpec:

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

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

И теперь с этим ECPublicKeySpec вы можете сгенерировать PublicKey с помощью KeyFactory:

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

Дополнительную информацию по этой теме можно найти здесь.

person Xaver Kapeller    schedule 12.05.2015