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

ECDSA使用OpenSSL签名,无需ASN1对哈希进行编码

司空宗清
2023-03-14

Im使用OpenSSL的< code>dgst命令执行ECDSA签名,如下所示:

openssl dgst -sha256 -sign key.pem -out my_signature data_file

然而,我在这个SO答案中读到,它首先对data_file进行SHA256哈希处理,ASN.1在签名之前对哈希进行编码。

我想创建数据的SHA256哈希,并让ECDSA只对该哈希的原始字节进行签名。(由于这是ECDSA签名,我不能使用rsautl如上述SO答案中所述。)

如何使用OpenSSL实现这一点?

共有1个答案

勾长卿
2023-03-14

您可以使用< code>openssl pkeyutl来实现,它是支持ECDSA的< code>openssl rsautl的替代产品。

假设您想使用openssl散列并签署一个“data.txt”文件。首先您需要散列该文件:

openssl dgst -sha256 -binary -out data.sha256 data.txt

签名后:

openssl pkeyutl -sign -inkey private.pem -in data.sha256 -out data.sig

但是,签名仍采用 ASN.1 格式。要接收签名的 r 和 s 值,请使用 openssl asn1parse

openssl asn1parse -inform DER -in data.sig
 类似资料:
  • 我正在尝试用DSS签署PDF文档,我的问题是我无法在服务器a中计算文档的哈希值,然后在服务器B中签署它。 知道服务器A包含PDF文档,我们在服务器B中检索用于签名的证书 我的问题是如何在不需要证书的情况下计算服务器a中文档的哈希值。然后在服务器B上发送签名? 更新: ******散列的准备和计算******** ******散列签名******** ********PDF错误:*********

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

  • 我使用OpenSSL创建了一个自签名证书,如下所示: 然后,我在C#.NET4.0中编写了以下代码: 使用一些文章和答案中的解决方案,我有类,我试图在其中实现和注册签名描述: 我已经验证了hash的长度为字节,它返回一个。但是如果我使用var(20字节长),尽管中指定的算法是,但它可以工作,并使用算法对哈希进行签名。 另外,如果我打印,它的值是http://www.w3.org/2000/09/x

  • 来自OpenSSL文档 使用命名曲线prime256v1(又名P-256)创建给定SHA-256散列值的ECDSA签名。 第二步:使用ECDSA_do_sign()计算SHA-256哈希值的ECDSA签名: 或使用ECDSA_sign(): 第三步:使用ECDSA_do_verify()验证创建的ECDSA签名: 或者使用ECDSA_verify(): 最后评估返回值: EOF 这使我认识到,我需

  • 我在应用程序中用戴伟的加密技术创建了一个ECDSA密钥对(secp128r1)。签名和验证按预期工作。我没有将消息本身添加到签名中,以最小化签名长度(正好是32个字节)。 但是,当我使用openssl创建签名时: 显然,OpenSSL将消息本身放在签名中,导致更大的签名(例如39字节)。如果我设置< code > CryptoPP::SignatureVerificationFilter::PUT

  • 我正在使用iText7执行PDF和签名操作。我的场景是,我在本地机器上计算哈希,并将这个哈希发送到签名服务器,作为响应,得到签名的PKCS1(原始签名),然后我将这个签名嵌入到PDF中。我的代码片段如下: 1:从智能卡设备读取公共证书。 3:初始化PdfSigner并设置签名外观: 4:我已经实现了IExternalSignatureContainer接口来获取文档哈希: 5:获取文档哈希: 7: