android - 如何从先前生成的 ECDSA 两个编码密钥对构造私钥?
问题描述
生成了这样的私钥:
fun getKeyPair(): Pair<ByteArray, ByteArray> {
Security.addProvider(provider)
val generator = KeyPairGenerator.getInstance("ECDSA")
val ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1")
generator.initialize(ecSpec)
val keyPair = generator.generateKeyPair()
val publicKey = keyPair.public as ECPublicKey
val privateKey = keyPair.private
return Pair(publicKey.q.getEncoded(true), privateKey.getEncoded())
}
可以像这样再次重建公钥:
Security.addProvider(...spongy castle provider)
val ecSpecs = ECNamedCurveTable.getParameterSpec("secp256r1")
val q = ecSpecs.curve.decodePoint(publicKeyEncoded)
val pubSpec = ECPublicKeySpec(q, ecSpecs)
val keyFactory = KeyFactory.getInstance("ECDSA")
val generatedPublic = keyFactory.generatePublic(pubSpec)
怎么可能从字节中重建私钥呢?
更新:
此代码在实际应用程序中运行良好,但在 JUnit 测试中不起作用:
val keyFactory = KeyFactory.getInstance("ECDSA")
val privSpec = PKCS8EncodedKeySpec(privateEncoded)
val generatedPrivate = keyFactory.generatePrivate(privSpec)
在 JUnit 测试中,我收到此错误:
java.security.spec.InvalidKeySpecException: encoded key spec not recognised
我作为编码字节的私钥有 150 字节大小。
解决方案
由于密钥是使用标准编码的Key.getEncoded()
,因此以下标准解决方案应该有效:
val keyFactory = KeyFactory.getInstance("EC")
val privSpec = PKCS8EncodedKeySpec(privateEncoded)
val generatedPrivate = keyFactory.generatePrivate(privSpec)
编码后的密钥应包含重建私钥所需的所有信息,而无需像为缩减的公钥那样指定额外的参数。
推荐阅读
- java - mxGraph 中的 java 对象
- r - 如何在R中为间隔创建多列假人
- amazon-web-services - 有什么方法可以限制 IAM 用户/假定角色在 AWS cognito 中启用未经身份验证的用户身份?
- python - 实验室:计算折扣
- javascript - 如何在猫鼬的路由器中等待函数完成其所有内部表达式?
- anylogic - 道路交通图书馆的奇怪行为
- kubernetes - Filebeat:再次删除字段 kubernetes
- python - 使用 unittest 框架回滚 SQLAlchemy
- mysql - 如何创建一个忽略对第三个表具有特定引用的行的选择查询?
- r - 如何更改 $ 运算符在环境中的行为?