如何将 OpenSSL 签名存储到 ASN.1 格式的文件中
How to store an OpenSSL signature to a file in ASN.1 format
我正在实施已散列输入 input_hash
的 "sign" 步骤。这可以直接用
完成
openssl pkeyutl -sign -in input_hash -inkey private.key -out signature
但是我正在使用外部设备来计算响应。这给了我一个 64 字节的响应,我现在已经设法将其正确转换为 Openssl 使用的结构。这应该是来自 openssl/bn.h
的 ECDSA_SIG
结构
struct ECDSA_SIG {
BIGNUM *r;
BIGNUM *s;
}
接下来我想使用正确的 ASN.1 格式将此结构存储为二进制 (DER) 文件。但是我无法在 openssl 库中找到合适的函数。
请注意,我使用的是 EC 密钥,因此无法使用 openssl rsautl
工具。通过查看上面 openssl 命令的输出,我看到了我正在尝试实现的相同结构。
$ openssl asn1parse -in signature -inform DER
0:d=0 hl=2 l= 69 cons: SEQUENCE
2:d=1 hl=2 l= 33 prim: INTEGER :E8229B1CF88EC5BC6E8270161E34D986FC8A5A7D5B2ED3B7C65BA808494E7030
37:d=1 hl=2 l= 32 prim: INTEGER :3FF76A6CB0210037C2D0F9075080E1B6461CDD8F52BB2374DB2B350E81C8A5C3
现在唯一缺少的步骤是以正确的格式将我的 ECDSA_SIG
结构存储到文件中。否则在openssl中使用以下命令验证
openssl pkeyutl -verify -inkey public.key -sigfile signature -pkeyopt digest:sha256 -in input_hash -pubin
显然失败了。
如果您在 ECDSA_SIG
结构中有签名,那么您可以使用 i2d_ECDSA_SIG
函数将其转换为 DER 格式。记录于此:
https://www.openssl.org/docs/man1.1.1/man3/i2d_ECDSA_SIG.html
我正在实施已散列输入 input_hash
的 "sign" 步骤。这可以直接用
openssl pkeyutl -sign -in input_hash -inkey private.key -out signature
但是我正在使用外部设备来计算响应。这给了我一个 64 字节的响应,我现在已经设法将其正确转换为 Openssl 使用的结构。这应该是来自 openssl/bn.h
ECDSA_SIG
结构
struct ECDSA_SIG {
BIGNUM *r;
BIGNUM *s;
}
接下来我想使用正确的 ASN.1 格式将此结构存储为二进制 (DER) 文件。但是我无法在 openssl 库中找到合适的函数。
请注意,我使用的是 EC 密钥,因此无法使用 openssl rsautl
工具。通过查看上面 openssl 命令的输出,我看到了我正在尝试实现的相同结构。
$ openssl asn1parse -in signature -inform DER
0:d=0 hl=2 l= 69 cons: SEQUENCE
2:d=1 hl=2 l= 33 prim: INTEGER :E8229B1CF88EC5BC6E8270161E34D986FC8A5A7D5B2ED3B7C65BA808494E7030
37:d=1 hl=2 l= 32 prim: INTEGER :3FF76A6CB0210037C2D0F9075080E1B6461CDD8F52BB2374DB2B350E81C8A5C3
现在唯一缺少的步骤是以正确的格式将我的 ECDSA_SIG
结构存储到文件中。否则在openssl中使用以下命令验证
openssl pkeyutl -verify -inkey public.key -sigfile signature -pkeyopt digest:sha256 -in input_hash -pubin
显然失败了。
如果您在 ECDSA_SIG
结构中有签名,那么您可以使用 i2d_ECDSA_SIG
函数将其转换为 DER 格式。记录于此:
https://www.openssl.org/docs/man1.1.1/man3/i2d_ECDSA_SIG.html