从椭圆曲线点的x和y值生成PublicKey

Dat*_*shi 8 android bouncycastle spongycastle

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

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

这工作正常,但PublicKey我在这里使用的应该来自​​后端.

后端只是向我发送椭圆曲线上的点xy值,现在我应该从中生成PublicKey.但我无法弄明白!如何PublicKey从这两个值创建实例?

Xav*_*ler 9

这其实很简单!但除了xy值之外你还需要一件事.你还需要一个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);
Run Code Online (Sandbox Code Playgroud)

现在用它ECPublicKeySpec可以生成PublicKey使用KeyFactory:

KeyFactory keyFactory = KeyFactory.getInstance("EC");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
Run Code Online (Sandbox Code Playgroud)

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