Android 由椭圆曲线点的x和y值生成公钥

Android 由椭圆曲线点的x和y值生成公钥,android,bouncycastle,spongycastle,Android,Bouncycastle,Spongycastle,我正在尝试在我的应用程序中生成一个共享秘密,如下所示: public static byte[] generateSharedSecret(PrivateKey privateKey PublicKey publicKey) { KeyAgreement keyAgreement = KeyAgreement.getInstance("ECDH", "SC"); keyAgreement.init(privateKey); keyAgreement.doPhase(pub

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

public static byte[] generateSharedSecret(PrivateKey privateKey PublicKey publicKey) {
    KeyAgreement keyAgreement = KeyAgreement.getInstance("ECDH", "SC");
    keyAgreement.init(privateKey);
    keyAgreement.doPhase(publicKey, true);
    return keyAgreement.generateSecret();
} 
这很好,但是我在这里使用的
公钥应该来自后端


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

实际上非常简单!但是除了
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
可以使用
KeyFactory
生成
PublicKey

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

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