java - 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?
解决方案
AsymmetricCipherKeyPair
有一个构造函数,它期望第一个参数中的公钥和第二个参数中的私钥,两者都是 type ,和AsymmetricKeyParameter
的公共基类。ECPrivateKeyParameters
ECPublicKeyParameters
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
也可以仅使用公钥创建实例。
为了完整性:虽然从私钥派生公钥是可能的,但反过来当然是不可能的,因为否则,正如评论中已经指出的那样,整个公钥密码学将毫无意义。
推荐阅读
- kubernetes - ReplicaSet 不会删除 Replication Controller pod?
- javascript - React Javascript,从现有的数组中创建新的数组
- c++ - 编译后的代码不执行文件写入
- python - Python:使用自定义指标生成 Voronoi 细分
- excel - Excel:查找从购买之日起库存的存货时间以及范围
- matlab - 带 e 的 Matlab 数
- java - 当组 DN 名称上有斜杠时,无法使用 ldap api 将用户添加到组
- python - 为什么在对元组进行排序时,我得到一个列表作为 sorted() 函数的最终输出?
- layout - 无法使用 Nebular NbLayoutComponent 在整个可用屏幕上显示页面内容
- python - 我想计算特定项目的数量