我用这种方式生成私钥:
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变换的这里
发布于 2018-11-01 21:49:27
如前所述,私钥采用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 )。
https://stackoverflow.com/questions/53045840
复制相似问题