java - 从 ECPrivateKey 生成 ECPublicKey

标签 java security cryptography bouncycastle public-key

我正在尝试在给定私钥和已知曲线的情况下生成公钥。下面是我的代码:

// 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: encoded key spec not recognised (不是我的拼写错误)

我似乎计算错误 Q ,但我不确定我的错误在哪里。

谢谢您的帮助!

最佳答案

如果我 future 的自己需要解决方案:

// 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()));

关于java - 从 ECPrivateKey 生成 ECPublicKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42639620/

相关文章:

c# - 如何在 SQL Server 2012 中加密某些行的某些列

java - 在小程序中运行桌面应用程序是否更安全?

python - 足够安全的 8 字符短唯一随机字符串

java - 打包 JCE Unlimited Strength Policy 文件; JCE 的替代品?

java - 指定使用 T 的类

java - 使用变量获取变量

security - 本地主机上是否需要 SSL?

cryptography - HMAC 实现 - 伪代码

java - Android图像/视频 slider 库

java - Jackson Objectmapper 读取具有可变字段/值类型的对象