首页 > 解决方案 > How to generating key pair from private key using Bouncy Castle

问题描述

How can I generate key pairs from private key stored as string? First I generate random key pairs like here:

ECNamedCurveParameterSpec curve = ECNamedCurveTable.getParameterSpec("secp256k1");
ECDomainParameters domainParams = new ECDomainParameters(curve.getCurve(), curve.getG(), curve.getN(), curve.getH(), curve.getSeed());

SecureRandom secureRandom = new SecureRandom();
ECKeyGenerationParameters keyParams = new ECKeyGenerationParameters(domainParams, secureRandom);

ECKeyPairGenerator generator = new ECKeyPairGenerator();//("ECDSA");
generator.init(keyParams);
AsymmetricCipherKeyPair keyPair = generator.generateKeyPair();

ECPrivateKeyParameters privkey = (ECPrivateKeyParameters) keyPair.getPrivate();
String privateKey = privkey.getD().toString();
ECPublicKeyParameters pubkey = (ECPublicKeyParameters) keyPair.getPublic();
String publicKey = pubkey.getQ().toString();

Now I have privateKey. How can I now generate AsymetricCipherKeyPair using that private key?

标签: javacryptographybouncycastle

解决方案


AsymmetricCipherKeyPair有一个构造函数,它期望第一个参数中的公钥和第二个参数中的私钥,两者都是 type ,和AsymmetricKeyParameter的公共基类。ECPrivateKeyParametersECPublicKeyParameters

AsymmetricCipherKeyPair从 an派生实例的一种ECPrivateKeyParameters方法是首先派生一个ECPublicKeyParameters实例,然后使用上述构造函数,例如:

// Your code
...
ECPrivateKeyParameters privkey = (ECPrivateKeyParameters) keyPair.getPrivate();
...

// Create AsymmetricCipherKeyPair from ECPrivateKeyParameters 
BigInteger d = privkey.getD();
ECPoint q = privkey.getParameters().getG().multiply(d);
ECPublicKeyParameters pubkeyRecreated = new ECPublicKeyParameters(q, privkey.getParameters());      
AsymmetricCipherKeyPair keyPairRecreated = new AsymmetricCipherKeyPair(pubkeyRecreated, privkey);

请注意,从技术上讲AsymmetricCipherKeyPair,也可以仅使用私钥创建实例,即如果为null公钥传递。但是,在这种情况下,AsymmetricKeyParameter#getPublic()返回null与上面的代码不同。同样,AsymmetricCipherKeyPair也可以仅使用公钥创建实例。

为了完整性:虽然从私钥派生公钥是可能的,但反过来当然是不可能的,因为否则,正如评论中已经指出的那样,整个公钥密码学将毫无意义。


推荐阅读