从椭圆曲线点的 x 和 y 值生成 PublicKey
Generating PublicKey from x and y values of elliptic curve point
我正在尝试在我的应用中生成一个共享密钥,如下所示:
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
,您可以使用 KeyFactory
:
生成 PublicKey
KeyFactory keyFactory = KeyFactory.getInstance("EC");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
您可以找到有关此主题的更多信息here。
我正在尝试在我的应用中生成一个共享密钥,如下所示:
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
,您可以使用 KeyFactory
:
PublicKey
KeyFactory keyFactory = KeyFactory.getInstance("EC");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
您可以找到有关此主题的更多信息here。