Openssl 如何将ECDSA密钥从十六进制转换为PEM格式

Openssl 如何将ECDSA密钥从十六进制转换为PEM格式,openssl,format,public-key,ecdsa,Openssl,Format,Public Key,Ecdsa,我有一个十六进制字符串,据称包含一个EC公钥。我需要将这个十六进制字符串转换为PEM格式(“下面的例子中是key.PEM”),以便研究我计划使用“openssl ec-in-key.PEM-text-noout”执行的内容。这可能吗 我假设十六进制是指二进制(DER格式)密钥?或者这个十六进制字符串是在一个人类可读的文件中,文件头以“-----开始公钥------”开头吗?如果您看到该标题,它已经是PEM格式 如果是二进制格式,请尝试将二进制密钥转换为pem: openssl ec -in ke

我有一个十六进制字符串,据称包含一个EC公钥。我需要将这个十六进制字符串转换为PEM格式(“下面的例子中是key.PEM”),以便研究我计划使用“openssl ec-in-key.PEM-text-noout”执行的内容。这可能吗

我假设十六进制是指二进制(DER格式)密钥?或者这个十六进制字符串是在一个人类可读的文件中,文件头以“-----开始公钥------”开头吗?如果您看到该标题,它已经是PEM格式

如果是二进制格式,请尝试将二进制密钥转换为pem:

openssl ec -in key.der -inform DER -pubin -out keyout.pem -outform PEM
其中“key.der”是二进制密钥

但是,您也应该能够在不转换为PEM的情况下调查内容。只需使用:

openssl ec -in key.der -inform DER -pubin -text -noout

如果您以十六进制字符串开始,则需要先对其进行十六进制解码以获得DER编码

十六进制字符串应该以
30…
开头,这表示它是ASN.1序列

此shell命令将进行十六进制解码(使用
xxd
),然后使用OpenSSL解析生成的DER公钥:

echo "30...." | xxd -r -p - | openssl ec -inform der -pubin -noout -text
要输出PEM,请删除
-noout-text
,添加
-pubout-out publickey.PEM

echo "30...." | xxd -r -p - | openssl ec -inform der -pubin -pubout -out publickey.pem

如果它实际上是一个私钥,只需省略
-pubin
-pubout

我对该密钥一无所知,但以下情况除外:-114个字符长(每个字符的范围为0-9和a到F,因此为57字节)-据称,它包含一个公共ECDSA keyFirst命令返回(“key”中的十六进制字符串):#openssl ec-in密钥-INFORT DER-pubin-out keyout.pem-OUFORM pem read ec密钥无法加载密钥3073398984:错误:0D07209B:asn1编码例程:asn1_get_对象:太长:asn1_库。c:142:3073398984:错误:0D068066:asn1编码例程:asn1_检查:错误对象头:tasn_dec:1306:3073398984:错误:0D07803A:asn1编码例程:ASN1_项目_EX_D2I:嵌套ASN1错误:tasn_dec.c:381:Type=X509_ALGOR 3073398984:错误:0D08303A:ASN1编码例程:ASN1_模板_NOEXP_D2I:嵌套ASN1错误:tasn_dec.c:751:Field=ALGOR,Type=X509_pubkeysond:#openssl ec-in key-inform DER-pubin-text-nout read ec key无法加载密钥3073931464:错误:0D07209B:asn1编码例程:asn1_get_对象:太长:asn1_库。c:142:3073931464:错误:0D068066:asn1编码例程:asn1_检查_TLEN:错误对象头:tasn_dec:1306:30739331464:错误:0D07803A3803A:asn1编码例程:ASN1\u ITEM\u EX\u D2I:nested ASN1 error:tasn\u dec.c:381:Type=X509\u ALGOR 3073931464:error:0D08303A:ASN1编码例程:ASN1\u TEMPLATE\u NOEXP\u D2I:nested ASN1 error:tasn\u dec:751:Field=ALGOR,Type=X509\u publikeys因为这是一个公钥,您介意在这里发布吗,所以我们可以看看它,并试图找出它的格式是什么?我遇到了与问题作者相同的问题,在我的情况下,十六进制源是ECDSA openssl模块,不,由EC_POINT_Point2;提供的十六进制不是ASN.1序列,不是以30开头,通常太长;到目前为止,解码这个十六进制的唯一方法是直接在C中使用反向EC_POINT_hex2point,我在bash中没有实现任何有用的功能。顺便说一句,这个十六进制与PEM的base64解码内容无关,而且它也没有关于所用曲线的信息(您必须自己确保它是正确的,否则键将无用)。