【问题标题】:Verify Signature ECDSA signature with Openssl使用 Openssl 验证签名 ECDSA 签名
【发布时间】:2020-06-11 16:42:15
【问题描述】:

我想创建一个签名并用 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 digital-signature private-key public-key ecdsa


    【解决方案1】:

    openssl dgst 命令“-hex”参数表示输出不是二进制,而是二进制输出的十六进制转储。

    引用:

    -十六进制

    digest 将作为十六进制转储输出。这是 a 的默认情况 “正常”摘要而不是数字签名。请参阅下面的注释了解 使用 -hex 的数字签名。

    还有注释部分:

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

    因此,如果您使用 -hex 选项进行十六进制转储,则需要自己将其转换回二进制文件,然后再将其传递给 openssl 进行验证。

    【讨论】:

    • 我遇到了与 OP 相同的错误,即使没有 -hex 标志.. 有什么想法吗?
    • 如果您收到该错误,则签名由于某种原因已损坏。因此,您将不得不查看从 openssl 输出到其存储(文件?)的数据会发生什么变化,并且不会以任何方式更改。 openssl 期望签名文件采用二进制格式作为原始 openssl 命令的输出。
    • 我实际上只是在执行OP在此处发布的openssl命令减去-hex ...我发现了另一个问题,显然你必须对签名进行十六进制编辑,因为openssl输出它不正确..似乎像麻烦一样:stackoverflow.com/questions/59904522/…
    • 如果您的 openssl.exe 由于某种原因还不错,那么归结为操作系统/控制台应用程序重定向管道到文件不会损坏二进制输出。如果您的控制台应用程序假设输出为文本,则可能会损坏写入 Windows 中文件的输出(例如)。
    • 在 openssl 中使用“-out ”选项试试,以确保直接指向文件没有任何问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多