Процедуры кодирования ASN.1: OPENSSL_internal: HEADER_TOO_LONG - PullRequest
0 голосов
/ 05 декабря 2018

У меня проблема с созданием закрытого ключа из массива байтов в Kotlin (с помощью Android Studio).

Я должен загрузить закрытый ключ, который я определил, как показано ниже.Из того, что я знаю, этот закрытый ключ EC имеет длину 32 байта, что соответствует кривой secp256r1

0x3C, 0x6D, etc... (this have 32 in total)

Вот что у меня есть:

val privateKeyArray = arrayOf(0x3C, 0x6D, etc...) //this have 32 size

Затем я пытаюсь преобразовать его вbyteArray:

val privateKeyBytes = privateKeyArray.map { it.toByte() }.toByteArray())

И затем я хочу подписать с ним некоторые данные:

val keyFactory = KeyFactory.getInstance("EC")
val privateKey = keyFactory.generatePrivate(PKCS8EncodedKeySpec(privateKeyBytes))  //THIS line gives the Exception

val content = "random string".toByteArray()
val signer = Signature.getInstance("SHA256withECDSA")
signer.initSign(privateKey)
signer.update(content)
val signature = signer.sign()

Однако, когда я пытаюсь сгенерировать privateKey из keyFactory, я получаю следующее исключение:

java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: ошибка: 0c000079: подпрограммы кодирования ASN.1: OPENSSL_internal: HEADER_TOO_LONG в android.app.ActivityThread.performLaunchAava: Activity2927)

Как правильно прочитать закрытый ключ в этом случае?

1 Ответ

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

Я использовал BouncyCastle в качестве поставщика безопасности, так что вы можете попробовать его.похоже, что используемая вами спецификация secp256r1.в этом случае попробуйте следующий код, чтобы восстановить объект PrivateKey из байтового массива, который представляет ключ.помните, что байтовый массив - это просто BigInteger в Java.

дайте мне знать, работает ли он или нет.

public PrivateKey generatePrivateKey(byte[] keyBin) throws InvalidKeySpecException, NoSuchAlgorithmException {
    ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("secp256r1");
    KeyFactory kf = KeyFactory.getInstance("ECDSA", new BouncyCastleProvider());
    ECNamedCurveSpec params = new ECNamedCurveSpec("secp256r1", spec.getCurve(), spec.getG(), spec.getN());
    ECPrivateKeySpec privKeySpec = new ECPrivateKeySpec(new BigInteger(keyBin), params);
    return kf.generatePrivate(privKeySpec);
}
...