gpt4 book ai didi

openssl - 如何将ECDSA key 转换为PEM格式

转载 作者:行者123 更新时间:2023-12-03 23:59:13 30 4
gpt4 key购买 nike

我有一个私有(private)原始 key myetherwallet 和一个密码“testwallet”,现在我正在按照此答案尝试使用OpenSSL将其转换为PEM格式。

echo "a140bd507a57360e2fa503298c035854f0dcb248bedabbe7a14db3920aaacf57" | xxd -r -p - | openssl ec -inform der -pubin -noout -passin pass:testwallet -text

但是出现此错误:
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:

更新:
我没有公钥,但是我想生成它,所以以后我还可以生成对应的以太坊地址。

最佳答案

您声称您的原始 key 是OpenSSL的DER格式,不是。另外,您还声称私有(private) key 不是公共(public) key ,而是声称它是用密码加密的,无论哪种方式都是错误的:公共(public) key 从不加密,并且私有(private) key 在OpenSSL的“传统”(也称为“旧版”)算法中无法加密DER格式(对于ECC,由SECG SEC1定义)。 (尽管PEM更加方便,但PKCS8格式的OTOH私钥可以用DER或PEM进行密码加密。FWIWPKCS12格式始终是密码加密,并且始终是DER。)

ECC(ECDSA,ECDH,ECMQV等)键相对于总是“”一些“曲线”(更确切地说,是具有已标识的生成器即基点的曲线的素数子组)。对于比特币,这是 secp256k1 ,但是您的问题并不只限于比特币,而且此答案需要使用其他曲线的其他应用程序进行修改。

如果您还有公共(public) key (作为未压缩点),则可以简单地使用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)

然后将十六进制转换为二进制并读取为DER,或者将十六进制(可能通过二进制)转换为base64并用-----BEGIN/END EC PRIVATE KEY-----行换行以使其成为PEM。

如果没有公用 key ,则可以对其进行一些修改。连接十六进制字符串
302e0201010420 privkey_32bytes_64hexits a00706052b8104000a 

并转换为二进制,然后读入openssl ec -inform d。注意OpenSSL将根据给定曲线的私钥派生公钥,但实际上不会将其存储在PEM输出中,因此不能保证使用OpenSSL以外的软件进行读取。您可能需要使用openssl ec -text [-noout](为方便起见,在PEM或DER输入上使用)来获取公钥值,然后返回并创建包含上述公钥的更完整的编码。

添加:,因为您似乎不理解答案中的单词,因此,我将尽可能详细地说明这一点。

a140bd507a57360e2fa503298c035854f0dcb248bedabbe7a14db3920aaacf57是十六进制表示的原始私钥。 secp256k1私有(private)值是32字节的二进制值;当二进制以十六进制表示时,每个字节占用两个十六进制数字,因此32个字节占用64个十六进制数字。所有这些值都是原始私钥。没有由25位数字或25个字节组成的部分具有任何有用的含义。请勿使用此值的25%的任何部分。

要构造不带公钥
私钥的OpenSSL/SECG表示形式,请将代表私钥的十六进制字符串(全部未经修改)放置在我作为第二个选项显示的其他两个十六进制字符串之间:
 302e0201010420 a140bd507a57360e2fa503298c035854f0dcb248bedabbe7a14db3920aaacf57 a00706052b8104000a 

然后将此组合的十六进制字符串转换为二进制,并将结果读入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-----

结果为PEM格式-但PEM格式不包括您表示想要的公用 key 。要查看包含派生公钥的字段,请添加-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

现在,如果您想要一个包含公共(public) key
的PEM格式 key ,请同时获取私有(private) key 的十六进制字符串(全部为64位数字)和新显示的公共(public) key 的十六进制值,然后将它们插入我的第一个选项中。还要注意,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-----

已为DavidS添加2019-02:正确显示在k06a's answer
  • 我的中间字符串的第一部分(或我的仅供私有(private)使用的选项的整个后缀)a00706052b8104000a是OID标签的上下文标签和长度a007,长度0605包含2b8104000a1.3.132.0.10 which is secp256k1
  • 我的中间字符串a144034200的其余部分是上下文标记和长度,其中包含标记长度和BITSTRING的未使用位头,BITSTRING是未压缩的原始公钥。

  • 要改用 secp256r1 akap-256或prime256v1,您需要将AlgId.OID更改为1.2.840.10045.3.1.7,其编码为a00a 0608 2a8648ce3d030107。 p256r1的privatekey和publickey值与p256k1的大小相同,但是AlgId较长,因此您还需要更改外部SEQUENCE的长度,
    30770201010420 privatekey32bytes # note 77 
    a00a06082a8648ce3d030107 a144034200 publicpoint65bytes

    关于openssl - 如何将ECDSA key 转换为PEM格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48101258/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com