9

我正在尝试在我的应用程序中生成一个共享密钥,如下所示:

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我在这里使用的应该来自​​后端。

后端只是向我发送椭圆曲线上一个点的xy值,现在我应该从中生成PublicKey。但我就是想不通!如何PublicKey仅从这两个值创建实例?

4

1 回答 1

12

其实很简单!x但是除了andy值之外,您还需要一件事。你还需要一个ECParameterSpec!描述了您正在使用的ECParameterSpec椭圆曲线,并且您的应用程序必须使用与ECParameterSpec后端相同的方法!


使用xy值,您可以创建一个ECPoint实例,并与您一起ECParameterSpec创建一个ECPublicKeySpec

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

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

现在有了它,ECPublicKeySpec您可以PublicKey使用 a生成KeyFactory

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

您可以在此处找到有关此主题的更多信息。

于 2015-05-12T07:37:44.583 回答