【问题标题】:Verify ECDSA signature from PyKCS11从 PyKCS11 验证 ECDSA 签名
【发布时间】:2016-08-30 17:22:43
【问题描述】:

我有一个使用 PyKCS11 的 Python 程序,PyKCS11 是 pkcs11 接口的 Python 包装器。我可以使用存储在 HSM 上并由 PyKCS11 访问的 ECC 私钥(机制 CKM_ECDSA)对数据进行签名。

我现在想要的是通过相应的公钥使用 openssl 验证 ECDSA 签名。此公钥包含在一个 x509 (NewCert.pem) 中,它是根据 HSM 中的私钥创建的。

我测试了很多方法来正确验证签名,但都没有成功。

openssl dgst -ecdsa-with-SHA1 -verify <(openssl x509 -noout -pubkey -in NewCert.pem) -signature <(cat sign | base64 -d) file

文件“签名”包含 base64 编码的签名。文件“归档”纯数据。

谢谢

【问题讨论】:

  • Meta:这不是编程问题,可能最适合超级用户。但是:只指定-sha1 而不是-ecdsa-with-sha1(ecdsa 是从公钥中推断出来的)。

标签: pkcs#11 pyopenssl ecdsa


【解决方案1】:

我终于找到了解决问题的方法。

我) PyKCS11 的签名输出是 ECDSA 签名的 r 和 s 值的串联。它不是以 ASN1 样式格式化的。这是为什么无法使用 openssl 进行验证的第一个问题,因为后者需要这种格式。

二) 所以我编写了一个函数,将 PyKCS11 输出格式化为 ASN1 一致性并将二进制签名输出保存到文件中。

III) 为了使用散列函数,您首先必须对要签名的数据或文件进行散列。这可以在 Python 中使用 hashlib 的命令 digest() 来完成。在此之后,您将这个 二进制 数据散列作为 PyKCS11 的输入并创建签名。

四) 可以使用 openssl 中的以下命令验证散列的 ECDSA 签名:

openssl dgst -sha384 -verify pubkey -signature file.sign file

确保 pubkey 是来自相应 x509 证书(而不是 x509 本身)的 EC 公钥。 file.sign 表示为包含 ECDSA 签名的二进制文件,该签名代表原始数据的二进制哈希(参见步骤 III)。

希望这对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多