下面是一个示例ECDSA私钥(我没有将它用于任何事情):
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIFL3sLnioGcDvHWM/BPlNw96BOx1KKco2qsq4UwhQUosoAcGBSuBBAAK
oUQDQgAEXs1Fmq4QdPAbn3NycdEU+HOjc3kW9efbso2kI/vdDTWcSCMk310s53G3
tRClDBPPuuJAsKghbPfaTaUpmXFCNA==
-----END EC PRIVATE KEY-----下面是OpenSSL的asn1parse对它的看法:
0:d=0 hl=2 l= 116 cons: SEQUENCE
2:d=1 hl=2 l= 1 prim: INTEGER :01
5:d=1 hl=2 l= 32 prim: OCTET STRING
39:d=1 hl=2 l= 7 cons: cont [ 0 ]
41:d=2 hl=2 l= 5 prim: OBJECT :1.3.132.0.10
48:d=1 hl=2 l= 68 cons: cont [ 1 ]
50:d=2 hl=2 l= 66 prim: BIT STRING我的问题是:这个格式是在哪里定义的?
发布于 2017-06-29 05:09:16
您可以在RFC 5915中找到定义。
它定义了一个ECPrivateKey对象:
ECPrivateKey ::= SEQUENCE {
version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
privateKey OCTET STRING,
parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
publicKey [1] BIT STRING OPTIONAL
}来自第3节:
ECPrivateKey类型的字段具有以下含义:
version指定椭圆曲线私钥结构的语法版本号。对于文档的这个版本,它将被设置为ecPrivkeyVer1,它的类型为INTEGER,其值为1 (1)。privateKey是私钥。它是一个长度上限(\log_2(n)/8)的八进制字符串(其中n是曲线的顺序),它是通过RFC3447中定义的整数到八进制字符串-原语(I2OSP)从无符号整数中获得的。parameters指定与私钥关联的椭圆曲线域参数。ECParameters类型在RFC5480中进行了讨论。正如RFC5480中所指定的,只允许使用namedCurve选择。namedCurve是一个对象标识符,它完全标识特定一组椭圆曲线域参数所需的值。尽管ASN.1表示参数字段是可选的,但符合此文档的实现必须始终包括参数字段。publicKey包含与所述私钥相关联的椭圆曲线公钥。公钥的格式在RFC5480第2.2节中指定。尽管ASN.1表示publicKey是可选的,但符合此文档的实现应该始终包括publicKey字段。当公钥通过另一种机制分发时,可以省略publicKey字段,这超出了本文档的范围。给定私钥和参数,可以始终重新计算公钥;该字段的存在是为了方便使用者。正如注释中指出的那样,OpenSSL实际上使用了一种稍微不同的格式,即在SEC1的椭圆曲线密码学中找到的SEC1格式。来自这个openssl ec命令的描述:
-inform DER+PEM
然而,如前所述,即使值得注意,差异也是很小的。来自RFC 5915's附录B:
本附录列出了本文档与SECG1之间的差异:
https://crypto.stackexchange.com/questions/48707
复制相似问题