我有myetherwallet的私有原始密钥,带有密码 "testwallet",现在我正在尝试使用OpenSSL将其转换为PEM格式.
echo "a140bd507a57360e2fa503298c035854f0dcb248bedabbe7a14db3920aaacf57" | xxd -r -p - | openssl ec -inform der -pubin -noout -passin pass:testwallet -text
Run Code Online (Sandbox Code Playgroud)
但是出现此错误:
read EC key
unable to load Key
140084694296480:error:0D06B08E:asn1 encoding routines:ASN1_D2I_READ_BIO:not enough data:a_d2i_fp.c:247:
Run Code Online (Sandbox Code Playgroud)
更新: 我没有公钥,而是我想生成它,以后我也可以生成以太网地址对应..
dav*_*085 12
您声称您的原始密钥是OpenSSL的DER格式,而不是.你也是,锁模私有密钥是一个公共密钥,它不是,并声称它的密码加密这是错误的两种方式:公开密钥从不加密密钥和私有密钥在OpenSSL的"传统"又名"遗产"的算法,具体DER格式(用于ECC,由SECG SEC1定义)无法加密.(PKCS8格式的OTOH私钥可以在DER或PEM中进行密码加密,虽然PEM更方便.而且FWIW PKCS12格式始终是密码加密的,并且始终是DER.)
ECC(ECDSA,ECDH,ECMQV等)键总是相对于某些"曲线"(更准确地说,曲线上的素数子群,其中已识别的生成器也称为基点).对于比特币这是secp256k1,但你的问题并不是说它仅限于比特币,这个答案需要修改其他使用其他曲线的应用程序.
如果你也有公共密钥(为未压缩点),你可以简单地使用从溶液https://bitcoin.stackexchange.com/questions/66594/signing-transaction-with-ssl-private-key-to-pem.连接十六进制字符串:
a pre_string : 30740201010420
the privkey : (32 bytes as 64 hexits)
a mid_string : a00706052b8104000aa144034200 (identifies secp256k1)
the pubkey : (65 bytes as 130 hexits)
Run Code Online (Sandbox Code Playgroud)
然后将十六进制转换为二进制并读取为DER,或将十六进制(可能通过二进制)转换为base64并用-----BEGIN/END EC PRIVATE KEY-----行包装以使其成为PEM.
如果您没有公钥,可以稍微修改一下.连接十六进制字符串
302e0201010420 privkey_32bytes_64hexits a00706052b8104000a
Run Code Online (Sandbox Code Playgroud)
并转换为二进制,然后读入openssl ec -inform d.注意OpenSSL将从给定曲线的私钥派生公钥,但实际上并不将其存储在PEM输出中,因此无法保证使用OpenSSL以外的软件进行读取.您可能需要使用openssl ec -text [-noout](在PEM或DER输入上方便)获取公钥值,然后返回并创建包含公钥的更全面的编码,如上所述.
补充:既然你似乎不理解答案中的单词,我会尽可能详细地说明这一点.
该值a140bd507a57360e2fa503298c035854f0dcb248bedabbe7a14db3920aaacf57是以十六进制表示的原始私钥.secp256k1私有值是二进制32字节; 当二进制以十六进制表示时,每个字节取两个十六进制数字,因此32个字节需要64个十六进制数 所有这些值都是原始私钥.没有任何由25位或25字节组成的部分具有任何有用的含义.不要拿这个值的任何25个部分.
要构造没有公钥的私钥的OpenSSL/SECG表示,请将表示私钥的十六进制字符串 - 所有这些,不加修改 - 放在我作为第二个选项显示的另外两个十六进制字符串之间:
302e0201010420 a140bd507a57360e2fa503298c035854f0dcb248bedabbe7a14db3920aaacf57 a00706052b8104000a
Run Code Online (Sandbox Code Playgroud)
然后将这个组合的十六进制字符串转换为二进制,并将结果读入openssl ec -inform d:
$ echo 302e0201010420 a140bd507a57360e2fa503298c035854f0dcb248bedabbe7a14db3920aaacf57 a00706052b8104000a | xxd -r -p >48101258.1
$ openssl ec -inform d <48101258.1
read EC key
writing EC key
-----BEGIN EC PRIVATE KEY-----
MC4CAQEEIKFAvVB6VzYOL6UDKYwDWFTw3LJIvtq756FNs5IKqs9XoAcGBSuBBAAK
-----END EC PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
结果是PEM格式 - 但PEM格式不包括您指定所需的公钥.要查看包含派生公钥的字段,请添加-text; 要仅查看字段而不是PEM输出,请添加-noout:
$ openssl ec -inform d <48101258.1 -text -noout
read EC key
Private-Key: (256 bit)
priv:
a1:40:bd:50:7a:57:36:0e:2f:a5:03:29:8c:03:58:
54:f0:dc:b2:48:be:da:bb:e7:a1:4d:b3:92:0a:aa:
cf:57
pub:
04:20:ea:6d:8c:e7:bc:bb:48:33:69:b2:91:1c:75:
e5:60:2a:34:28:be:44:96:e9:7f:14:ad:52:fd:4a:
6a:a0:e3:60:83:9c:6e:db:32:2a:22:55:7c:70:1e:
d0:fa:1e:06:cf:57:4f:be:17:bd:6a:85:51:69:c5:
65:96:72:cf:a9
ASN1 OID: secp256k1
Run Code Online (Sandbox Code Playgroud)
现在,如果你想有一个PEM格式的密钥包括公钥,采取既私钥的十六进制字符串(全部64位)和公开密钥对新出的十六进制值,并在我插上他们的第一选择.另请注意,ECC公钥是一个曲线点,可以是两种形式,压缩或未压缩; 这里生成的表单是未压缩的.如果你需要压缩,我稍后会添加.未压缩格式的secp256k1点为65字节,以十六进制表示为130十六进制数字.(openssl ec格式为4行,每行15个字节,剩下5个字节.)
$ echo 30740201010420 a140bd507a57360e2fa503298c035854f0dcb248bedabbe7a14db3920aaacf57 a00706052b8104000aa144034200 \
> 04:20:ea:6d:8c:e7:bc:bb:48:33:69:b2:91:1c:75: e5:60:2a:34:28:be:44:96:e9:7f:14:ad:52:fd:4a: \
> 6a:a0:e3:60:83:9c:6e:db:32:2a:22:55:7c:70:1e: d0:fa:1e:06:cf:57:4f:be:17:bd:6a:85:51:69:c5: \
> 65:96:72:cf:a9 | xxd -r -p >48101258.2
$ # note xxd -r -p ignores the colons; other hex programs may need them removed instead
$ openssl ec -inform d <48101258.2
read EC key
writing EC key
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIKFAvVB6VzYOL6UDKYwDWFTw3LJIvtq756FNs5IKqs9XoAcGBSuBBAAK
oUQDQgAEIOptjOe8u0gzabKRHHXlYCo0KL5Elul/FK1S/UpqoONgg5xu2zIqIlV8
cB7Q+h4Gz1dPvhe9aoVRacVllnLPqQ==
-----END EC PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
为DavidS增加了2019-02:正如k06a的回答中所正确显示的那样
我的midstring的第一部分(或我的private-only选项的整个后缀)a00706052b8104000a是a007OID标签的上下文标签和长度,0605包含的长度2b8104000a为1.3.132.0.10,即secp256k1和
我的midstring的其余部分a144034200是一个上下文标记和长度,包含BITSTRING的标记长度和unused-bits标头,它是作为未压缩点的原始公钥.
要改为执行secp256r1又名P-256或prime256v1,需要将AlgId.OID更改为编码为的1.2.840.10045.3.1.7a00a 0608 2a8648ce3d030107.p256r1的privatekey和publickey值与p256k1的大小相同,但是AlgId更长,因此您还需要更改外部SEQUENCE的长度
30770201010420 privatekey32bytes # note 77
a00a06082a8648ce3d030107 a144034200 publicpoint65bytes
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7680 次 |
| 最近记录: |