我需要编写以ASN.1格式输入Elliptic Curve密钥的代码。
输入字节数组是下一个:
308187020100301306072A8648CE3D020106082A8648CE3D030107046D306B0201010420E699203AC5BCFE36402EBD0AC9E8E21CC6FAD5828A61297EA747468FFF4DBB20A144034200047E05188A03EA81E853B9F6AC5F20DCA1A1CA828FD7CD5D92161FB2120C35EAC52EAB079ED01A510123057C322DDFF95E239D6063055BC90858D161D71DE707F8
在线解析器向我展示了下一个结构:
要根据需要使用密钥,我需要从此结构中获取public value X
,public value Y
和private value
,至少我是这么认为的。但我不知道如何。
我搜索了有关OBJECT IDENTIFIER 1.2.840.10045.2.1
和OBJECT IDENTIFIER 1.2.840.10045.3.1.7
的信息。我找到了this document。但是没有ASN.1结构字段的描述。
如何从导入的数据中获取所需的参数?
答案 0 :(得分: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。
哦,是的,公钥是未压缩的点格式。不要忘记从位串中剥离00
。
快乐解析。