从导入的 ASN.1 格式的椭圆曲线密钥中获取密钥参数

Get key parameters from imported Elliptic Curve key in ASN.1 format

我需要编写代码以获取 ASN.1 格式的输入椭圆曲线密钥。

下一个输入字节数组:

308187020100301306072A8648CE3D020106082A8648CE3D030107046D306B0201010420E699203AC5BCFE36402EBD0AC9E8E21CC6FAD5828A61297EA747468FFF4DBB20A144034200047E05188A03EA81E853B9F6AC5F20DCA1A1CA828FD7CD5D92161FB2120C35EAC52EAB079ED01A510123057C322DDFF95E239D6063055BC90858D161D71DE707F8

在线解析器显示下一个结构:

要根据需要使用密钥,我需要从该结构中获取 public value Xpublic value Yprivate value,至少我是这么认为的。但是我不知道怎么办。

我搜索了有关 OBJECT IDENTIFIER 1.2.840.10045.2.1OBJECT IDENTIFIER 1.2.840.10045.3.1.7 的信息。我找到了 this document。但是没有描述ASN.1结构的字段。

如何从导入的数据中获取所需的参数?

俗称PKCS#8结构,即“私钥信息语法规范”。它仅包含 PKCS#8 私钥的 未加密 部分。

所以这是 PKCS#8:

PrivateKeyInfo ::= SEQUENCE {
    version Version,
    privateKeyAlgorithm AlgorithmIdentifier {{PrivateKeyAlgorithms}},
    privateKey PrivateKey,
    attributes [0] Attributes OPTIONAL
}

AlgorithmIdentifier 是 taken from PKCS#5

AlgorithmIdentifier { ALGORITHM-IDENTIFIER:InfoObjectSet } ::= SEQUENCE {
    algorithm ALGORITHM-IDENTIFIER.&id({InfoObjectSet}),
    parameters ALGORITHM-IDENTIFIER.&Type({InfoObjectSet}
    {@algorithm}) OPTIONAL
}

Elliptic Curve Private Key structure:

ECPrivateKey ::= SEQUENCE {
    version        INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
    privateKey     OCTET STRING,
    parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
    publicKey  [1] BIT STRING OPTIONAL
}

哦,在 DER 中编码,Distinguished Encoding Rules (study version) - 您可能无法完全排除 BER,这是一个定义更松散因此更难解析的结构)。不幸的是,PKCS#8 定义了 BER。

哦,是的,public 密钥是未压缩的点格式。不要忘记从位串中去掉 00

解析愉快。