Как построить закрытый ключ из сгенерированной ранее ECDSA пары кодированных ключей? - PullRequest
0 голосов
/ 13 декабря 2018

Сгенерировав закрытый ключ следующим образом:

    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 байтов.

1 Ответ

0 голосов
/ 13 декабря 2018

Поскольку ключ кодируется с использованием стандарта Key.getEncoded(), должно работать следующее стандартное решение:

val keyFactory = KeyFactory.getInstance("EC")
val privSpec = PKCS8EncodedKeySpec(privateEncoded)
val generatedPrivate = keyFactory.generatePrivate(privSpec)

Кодированный ключ должен содержать всю необходимую информацию для перестройки закрытого ключа без указания дополнительных параметров, таких каквам нужно сделать для сокращенного открытого ключа.

...