使用Openssl验证签名ECDSA签名

使用Openssl验证签名ECDSA签名,openssl,digital-signature,private-key,public-key,ecdsa,Openssl,Digital Signature,Private Key,Public Key,Ecdsa,我想创建一个签名并用openssl验证它。 我想得到我签名的十六进制输出 这是我的密码 #create private key openssl ecparam -genkey -name secp256k1 -rand /dev/urandom -noout -out private.pem #public key derivation openssl ec -in private.pem -pubout -out public.pem #create signature openssl d

我想创建一个签名并用openssl验证它。 我想得到我签名的十六进制输出

这是我的密码

#create private key
openssl ecparam -genkey -name secp256k1 -rand /dev/urandom -noout -out private.pem

#public key derivation
openssl ec -in private.pem -pubout -out public.pem

#create signature
openssl dgst -sha256 -hex -sign private.pem msg.txt  > signature.hex

#check signature
openssl dgst -sha256 -verify public.pem -signature signature.hex msg.txt
我得到这个错误:

Error Verifying Data
4573216364:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1220:
4573216364:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:386:Type=ECDSA_SIG
如果我在创建签名时删除-hex,它就会工作

$ openssl version
OpenSSL 1.0.2s  28 May 2019
openssl命令“-hex”参数意味着输出不是二进制的,而是二进制输出的十六进制转储

引述:

-六角形

摘要将作为十六进制转储输出。这是应用程序的默认情况 与数字签名相对的“普通”摘要。有关详细信息,请参见下面的注释 使用-hex的数字签名

注释部分:

无法使用openssl验证十六进制签名。相反,使用“xxd-r” 或类似的程序将十六进制签名转换为二进制 核实前签字


因此,如果对十六进制转储使用-hex选项,则在将其传递到openssl进行验证之前,您需要自己将其转换回二进制。

即使没有-hex标志,我也会收到与OP相同的错误。。有什么想法吗?如果你发现了这个错误,那么签名由于某种原因被破坏了。因此,您必须查看从openssl进入其存储(文件?)的数据发生了什么变化,并且不会以任何方式进行更改。openssl期望签名文件以二进制格式作为原始openssl命令的输出。。。我发现了另一个问题,显然您必须编辑签名,因为openssl输出的签名不正确。。这似乎是一个麻烦:如果您的openssl.exe由于某种原因不坏,那么它就可以归结为操作系统/控制台应用程序重定向管道到文件不会损坏二进制输出。如果您的控制台应用程序假定输出为文本,则可能会损坏写入windows中文件的输出(例如)。请使用openssl中的“-out”选项进行尝试,以确保直接指向文件不存在任何问题。