Kotlin конвертировать PKCS1 в PKCS8 - PullRequest
0 голосов
/ 29 октября 2018

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

val keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "SC")
val spec = ECGenParameterSpec("secp256k1")
keyPairGenerator.initialize(spec, SecureRandom())
keyPairGenerator.genKeyPair()
val kp = keyPairGenerator.generateKeyPair()

И я получаю закрытый ключ длиной 144. Затем я конвертирую свой закрытый ключ в PKCS1 формат:

val pkInfo = PrivateKeyInfo.getInstance(kp.private.encoded)
val encodable = pkInfo.parsePrivateKey()
val primitive = encodable.toASN1Primitive()
val pkcs1 = primitive.encoded //118 length here

В некоторых случаях мне нужно конвертировать pkcs1 обратно в pkcs8. И это неясно для меня. Не могу найти никакого рабочего решения. Это вообще возможно?

P.S. преобразование pkcs8 в pkcs1 найдено здесь

1 Ответ

0 голосов
/ 02 ноября 2018

Как указано, закрытый ключ имеет формат X9.62. Он не может быть в формате PKCS # 1, потому что этот формат указывает RSA, а не ECC.

Кроме того, ваш закрытый ключ PKCS # 8 содержит больше информации, чем закрытый ключ X9.62, который вы извлекли из него. Вы можете увидеть расшифровку PKCS # 8 здесь :

SEQUENCE (3 elem)
  INTEGER 0
  SEQUENCE (2 elem)
    OBJECT IDENTIFIER 1.2.840.10045.2.1 ecPublicKey (ANSI X9.62 public key type)
    OBJECT IDENTIFIER 1.3.132.0.10 secp256k1 (SECG (Certicom) named elliptic curve)
  OCTET STRING (1 elem)
    SEQUENCE (4 elem)
      INTEGER 1
      OCTET STRING (32 byte) 9CDDA50E9E839066257291DBCBDBD9A8A177F350AA522A128163AB7E955622C5
      [0] (1 elem)
        OBJECT IDENTIFIER 1.3.132.0.10 secp256k1 (SECG (Certicom) named elliptic curve)
      [1] (1 elem)
        BIT STRING (520 bit) ... the optional public key ...

Внутренний ключ X9.62 - это последовательность внутри строки октетов, а секрет (S) - это 32-байтовая строка октетов.

Так что вы должны добавить информацию обратно. Это AlgorithmIdentifier, который указывает ecPublicKey операции , а также используемую кривую (повторяется для открытого ключа).

Итак, без лишних слов, операции по воссозданию структуры PKCS # 8 (с заменой x962 pkcs1):

ASN1Primitive prim = ASN1Primitive.fromByteArray(x962);
PrivateKeyInfo keyInfo = new PrivateKeyInfo(new AlgorithmIdentifier(
        X9ObjectIdentifiers.id_ecPublicKey,
        SECObjectIdentifiers.secp256k1), prim);

обратите внимание, что это незашифрованный вариант PKCS # 8, который просто показывает тип закрытого ключа. Зашифрованный вариант шифрует эту структуру и добавляет информацию об используемом механизме упаковки (например, AES зашифрован).

...