我试图在我的应用程序中生成一个共享 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
应该来自后端。后端只是向我发送椭圆曲线上某点的
x
和y
值,现在我应该据此生成PublicKey
。但我只是想不通!如何仅从这两个值创建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
,您就可以使用PublicKey
生成KeyFactory
:KeyFactory keyFactory = KeyFactory.getInstance("EC");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
您可以找到有关此主题here的更多信息。
关于android - 根据椭圆曲线点的x和y值生成PublicKey,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30116758/