【问题标题】:How can I validate an ECDSA signature using the signed data, signature and the signer ECDSA public key?如何使用签名数据、签名和签名者 ECDSA 公钥验证 ECDSA 签名?
【发布时间】:2013-06-06 22:21:56
【问题描述】:

理论上,如果拥有公钥、签名和已签名的数据并且散列算法已知,则应该可以验证一条数据的签名。

我有所有这些二进制格式的组件。有人知道验证此签名的最简单方法吗?开放SSL? Python?一个例子会很棒。不写代码可以吗?

【问题讨论】:

    标签: algorithm openssl digital-signature ecdsa


    【解决方案1】:

    这是在 Ruby 中的操作方法。

    require 'openssl'
    
    signature = File.read('/path/to/sig.der')
    data = File.read('/path/to/data')
    pub_key = File.read('/path/to/ecdsa_pub_key')
    key = OpenSSL::PKey::EC.new(pub_key)
    if key.dsa_verify_asn1(data, signature) == true
      puts 'verified'
    end
    

    此代码要求针对 Ruby 链接的 OpenSSL 编译时支持椭圆曲线。 (Red Hat 风格的 Linux 发行版不满足此要求)

    如果您好奇:dsa_verify_asn1 使用 OpenSSL API 中的ECSDA_verify 函数。

    【讨论】:

    • 我在 Ubuntu 12.10 上使用 OpenSSL 1.0.1c 得到“in `initialize': unknown curve name” 显然它可以通过命令行使用 openssl "dgst -hashfunction -verify public.key -签名文件.sig 文件”。我只是不明白如何将公共 EC 密钥从十六进制转换为 PEM 格式。
    • @DrewLex 尝试将二进制密钥转换为 pem:openssl ec -in key.der -inform DER -pubin -out keyout.pem -outform PEM
    【解决方案2】:

    您可以使用 openssl 对带有 ECDSA 签名的消息进行签名,然后您可以使用 openssl 来验证签名:

    要对消息进行签名(使用 SHA256 哈希,给定消息和签名者的 EC 私钥):

    openssl dgst -sha256 -sign ec-privatekey.pem message.txt > signature.der
    

    然后,验证签名(再次使用 SHA256 散列,给定消息、签名者的 EC 公钥和上面创建的签名):

    openssl dgst -sha256 -verify ec-publickey.pem -signature signature.der message.txt
    

    【讨论】:

      猜你喜欢
      • 2020-06-11
      • 2020-03-23
      • 2016-03-30
      • 2022-01-07
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多