Сгенерировав закрытый ключ следующим образом:
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 байтов.