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

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实例?

最佳答案

实际上很简单!但是,除了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);

现在,有了ECPublicKeySpec,您就可以使用PublicKey生成KeyFactory:
KeyFactory keyFactory = KeyFactory.getInstance("EC");
PublicKey publicKey = keyFactory.generatePublic(keySpec);

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

关于android - 根据椭圆曲线点的x和y值生成PublicKey,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30116758/

10-12 04:30