当前位置: 首页 > 知识库问答 >
问题:

验证来自PyKCS11的ECDSA签名

刁钧
2023-03-14

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

我现在想要的是用openssl通过相应的公钥验证ECDSA签名。该公钥包含在x509(NewCert.pem)中,该x509由HSM中的私钥创建。

测试了许多正确验证签名的方法,但没有成功。

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

文件签名包含bas64编码签名。和文件'file'的普通数据。

谢谢你

共有1个答案

韶弘壮
2023-03-14

最后我找到了解决问题的办法。

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

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

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

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

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

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

希望这对其他人有帮助。

 类似资料:
  • 我应该如何更改A方法?任何想法都是好的。提前谢谢。

  • 最近,我一直在尝试构建一个Java库来解释和验证NZ Covid传递。在签名验证之前(这个过程中稍微重要的一部分),我已经让代码变得更好或更坏。完整的代码可以在这里找到,但是仍然很粗糙。 验证器本身在这里可用,有一个配套测试。新冠通行证的技术规范在这里。至少有一个相关部分。 在与另一个开发人员合作后,我想我已经确定了解释提供的公钥。下面的代码(删除了调试输出)。公钥详细信息来自这里 该错误可能存在

  • 我想创建一个签名并使用openssl验证它。我想有我的签名的十六进制输出。 这是我的密码 我得到这个错误: 如果我在创建签名的过程中删除了-hex,它就可以工作了。

  • 我正在尝试在python中使用ECDSA验证比特币签名,但发现它非常困难,许多尝试已经失败了。 参数: 注意:我已经根据ECDSA的要求将签名从base64转换为hexstring。每当我试图验证它时,它会说: 预期64字节签名(128十六进制字符串),提供了65字节签名(130十六进制字符串) 我查看了许多关于ECDSA的stackoverflow问题,但没有一个答案与我的qs 100%相关。感

  • 我正在尝试使用公钥验证散列的ECDSA签名。我写了一个小的围棋程序,成功地做到了这一点,但是我不能把它移植到C语言中。 这是我的输入数据: < li >公钥:< code > mfkwewyhkozizj 0 caqyikozij0 dackcdqgaedd 9 vxm phjv 4 vofo 0 zofplr r5 iczxquxsr 9 eka ouo 9 b 7 wl 1 daggi 0 e

  • 我试图使用javascript创建ECDSA算法的密钥对,签名消息,然后在服务器端验证它(使用Java)。 示例javascript代码: 例如: 我做错了什么?