从十六进制DER返回二进制私钥secp256k1

问题描述 投票:1回答:1

我想从private_key.pem中获取foo_priv.key

$ openssl ecparam -genkey -name secp256k1 -rand /dev/urandom -out private_key.pem   
$ openssl ec -in private_key.pem -outform DER|tail -c +8|head -c 32 |xxd -p -c 32 > foo_priv.key

我尝试过

$ openssl ec -noout -text -inform DER -in foo_priv.key
read EC key
unable to load Key

$ openssl x509 -in foo_priv.key -inform DER -outform PEM
unable to load certificate
4486393452:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1220:
4486393452:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:386:Type=X509

$ cat foo_priv.key | xxd -r -p  > test.bin  
$ openssl ec -in test.bin -inform DER -pubin -text -noout                
read EC key
unable to load Key
4456304236:error:0D06B08E:asn1 encoding routines:ASN1_D2I_READ_BIO:not enough data:a_d2i_fp.c:247:
openssl private-key encryption-asymmetric der
1个回答
0
投票

您的tailhead机制来提取密钥的私有部分只会给您它的字节。但是,OpenSSL需要的不仅仅是存储私钥信息。如果使用的是OpenSSL 1.1.1,则可以使用-no_public工具的ec选项提取所需的字节,如下所示:

$ openssl ec -in private_key.pem -outform DER -no_public | xxd -p -c 32
read EC key
writing EC key
302e020101042031792710388085aaec53a04072a231116dc102e63cccdf5e85
ddd875cab6be6da00706052b8104000a

将其与您的原始方法进行比较,您会发现那里的信息丢失了:

$ openssl ec -in private_key.pem -outform DER | tail -c +8 | head -c 32 | xxd -p -c 32
read EC key
writing EC key
31792710388085aaec53a04072a231116dc102e63cccdf5e85ddd875cab6be6d

通常,这些文件以ASN.1格式存储,您不破坏它就不容易对其进行修改。要感受一下您删除的其他信息,可以使用

$ openssl ec -in private_key.pem -no_public | openssl asn1parse
    0:d=0  hl=2 l=  46 cons: SEQUENCE          
    2:d=1  hl=2 l=   1 prim: INTEGER           :01
    5:d=1  hl=2 l=  32 prim: OCTET STRING      [HEX DUMP]:31792710388085AAEC53A04072A231116DC102E63CCCDF5E85DDD875CAB6BE6D
   39:d=1  hl=2 l=   7 cons: cont [ 0 ]        
   41:d=2  hl=2 l=   5 prim: OBJECT            :secp256k1

请注意OCTET STRING节中的32个字节,正是您要提取的32个字节。但是,还有其他有关曲线类型以及关键点格式的版本号的信息。这遵循RFC 5915: Elliptic Curve Private Key Structure第3节中概述的私有EC密钥格式。没有这些信息,OpenSSL无法重建私有密钥。

© www.soinside.com 2019 - 2024. All rights reserved.