Generate ECPublicKey from ECPrivateKey(从 ECPrivateKey 生成 ECPublicKey)
问题描述
我正在尝试在给定私钥和已知曲线的情况下生成公钥.以下是我的代码:
I'm trying to generate a public key given a private key and known curve. Below is my code:
// Generate Keys
ECGenParameterSpec ecGenSpec = new ECGenParameterSpec("secp256r1");
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "BC");
keyPairGenerator.initialize(ecGenSpec, new SecureRandom());
java.security.KeyPair pair = keyPairGenerator.generateKeyPair();
ECPrivateKey privateKey = (ECPrivateKey) pair.getPrivate();
ECPublicKey publicKeyExpected = (ECPublicKey) pair.getPublic();
// Expected public key
System.out.print("Expected Public Key: " +
BaseEncoding.base64Url().encode(publicKeyExpected.getEncoded()));
// Generate public key from private key
X9ECParameters ecp = SECNamedCurves.getByName("secp256r1");
ECDomainParameters domainParams = new ECDomainParameters(ecp.getCurve(),
ecp.getG(), ecp.getN(), ecp.getH(),
ecp.getSeed());
ECPoint Q = domainParams.getG().multiply(privateKey.getS()); // is this correct?
KeyFactory kf = KeyFactory.getInstance("ECDSA", "BC");
ECPublicKey publicKeyGenerated =
(ECPublicKey) kf.generatePublic(new X509EncodedKeySpec(Q.getEncoded(false))); // exception here
// Generated public key from private key
System.out.print("Generated Public Key: " +
BaseEncoding.base64Url().encode(publicKeyGenerated.getEncoded()));
但是,当我调用时:kf.generatePublic(new X509EncodedKeySpec(Q.getEncoded(false)))我得到了异常:java.security.spec.InvalidKeySpecException:编码的密钥规范无法识别(不是我的拼写错误)
However, when I call: kf.generatePublic(new X509EncodedKeySpec(Q.getEncoded(false)))
I get the exception: java.security.spec.InvalidKeySpecException: encoded key spec not recognised (not my misspelling)
我似乎错误地计算了 Q,但我不确定我的错误在哪里.
I appears I'm incorrectly calculating Q, but I'm not sure where my error is.
感谢您的帮助!
推荐答案
万一我未来的自己需要解决方案:
In case my future self needs the solution:
// Generate Keys
ECGenParameterSpec ecGenSpec = new ECGenParameterSpec("secp256r1");
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "BC");
keyPairGenerator.initialize(ecGenSpec, new SecureRandom());
java.security.KeyPair pair = keyPairGenerator.generateKeyPair();
ECPrivateKey privateKey = (ECPrivateKey) pair.getPrivate();
ECPublicKey publicKeyExpected = (ECPublicKey) pair.getPublic();
// Expected public key
System.out.print("Expected Public Key: " +
BaseEncoding.base64Url().encode(publicKeyExpected.getEncoded()));
// Generate public key from private key
KeyFactory keyFactory = KeyFactory.getInstance("ECDSA", "BC");
ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1");
ECPoint Q = ecSpec.getG().multiply(privateKey.getD());
byte[] publicDerBytes = Q.getEncoded(false);
ECPoint point = ecSpec.getCurve().decodePoint(publicDerBytes);
ECPublicKeySpec pubSpec = new ECPublicKeySpec(point, ecSpec);
ECPublicKey publicKeyGenerated = (ECPublicKey) keyFactory.generatePublic(pubSpec);
// Generated public key from private key
System.out.print("Generated Public Key: " +
BaseEncoding.base64Url().encode(publicKeyGenerated.getEncoded()));
这篇关于从 ECPrivateKey 生成 ECPublicKey的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:从 ECPrivateKey 生成 ECPublicKey
基础教程推荐
- Struts2 URL 无法访问 2022-01-01
- 问题http://apache.org/xml/features/xinclude测试日志4j 2 2022-01-01
- RabbitMQ:消息保持“未确认"; 2022-01-01
- 修改 void 函数的输入参数,然后读取 2022-01-01
- Spring AOP错误无法懒惰地为此建议构建thisJoinPoin 2022-09-13
- REST Web 服务返回 415 - 不支持的媒体类型 2022-01-01
- 如何对 Java Hashmap 中的值求和 2022-01-01
- 无法复制:“比较方法违反了它的一般约定!" 2022-01-01
- 使用堆栈算法进行括号/括号匹配 2022-01-01
- 存储 20 位数字的数据类型 2022-01-01
