不使用ASN1对哈希进行编码,在OpenSSL中进行ECDSA签名

3
我将使用OpenSSL的dgst命令进行ECDSA签名,如下所示:

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

这个方法可以很好的工作。然而,我在这篇stackoverflow的回复中读到了关于它首先对data_file进行SHA256哈希,并对哈希值进行ASN.1编码后再签署的信息。

我想创建数据的SHA256哈希,并让ECDSA只签署这个哈希的原始字节。(由于这是ECDSA签名,所以不能像上述stackoverflow中提到的那样使用rsautl)

如何使用OpenSSL实现这一点呢?


1
你的前提是错误的。#9951559仅涉及RSA,以及OpenSSL的默认“填充”,即RSASSA-PKCS1v1_5,而标准要求对哈希进行ASN.1编码。RSA-PSS、DSA和ECDSA的标准不包括对哈希进行ASN.1编码,对于这些情况,“dgst -sign”也不会这样做。但是,正如答案中所述,DSA和ECDSA的签名是ASN.1编码的。 - dave_thompson_085
1个回答

3
您可以使用openssl pkeyutl来完成此操作,它是openssl rsautl的替代品,支持ECDSA。
假设您想使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接