Как указано, закрытый ключ имеет формат 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 зашифрован).