Создав такой закрытый ключ:
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 байтов.
.format
ключа, напримерval privFormat = privateKey.format
- person President James K. Polk   schedule 14.12.2018Security.addProvider (provider)
устанавливает поставщика в конце, поэтому, если в системе есть другой поставщик, способный обрабатывать ключи EC, он будет использоваться, и вы можете получить неожиданные результаты. Вы можете использоватьSecurity.insertProviderAt (sc, 1);
или указать его при вызовеKeyFactory.getInstance ("ECDSA", "SC")
- person pedrofb   schedule 19.12.2018publicKey.q.getEncoded(true)
, похоже, не компилируется в моей среде. ДляECPublicKey
нет свойстваq
. Конечно, я действительно не знаю Kotlin, кроме слепых поисков в среде IDE. - person President James K. Polk   schedule 19.12.2018