【问题标题】:C implementation of ECDSA signature and verification with openssl用openssl实现ECDSA签名和验证的C语言
【发布时间】:2013-03-07 10:59:27
【问题描述】:
我正在尝试创建 C 程序,我可以从菜单中选择我想要的选项,包括签署消息和验证消息。我有签名消息并同时验证的代码。我想要的是能够解析一条消息并对其进行签名,然后输出证书。接下来,当我选择验证时,我将插入相同的消息和证书,这样我就可以实际验证或不验证消息。
我正在使用以下代码:
Signing a message using ECDSA in OpenSSL
PS:基本上我不知道如何实际打印签名、私钥和公钥。
非常感谢。
【问题讨论】:
标签:
c
openssl
signature
verification
ecdsa
【解决方案1】:
我想我找到了打印 r 和 s 值的方法。签名中的密钥对 (r,s)
在我们自己签名后:
ECDSA_SIG *signature = ECDSA_do_sign(hash, strlen(hash), eckey);
我们可以这样打印 r 和 s 值:
printf("(sig->r, sig->s): (%s,%s)\n", BN_bn2hex(ECDSA_SIG_get0_r(signature)), BN_bn2hex(ECDSA_SIG_get0_s(signature)));
谢谢
最好的问候
【解决方案2】:
使用这些功能:
int i2d_ECDSA_SIG(const ECDSA_SIG *sig, unsigned char **pp);
ECDSA_SIG* d2i_ECDSA_SIG(ECDSA_SIG **sig, const unsigned char **pp, long len);
根据 OpenSSL 文档:
" i2d_ECDSA_SIG() 创建 ECDSA 签名 sig 的 DER 编码,并将编码后的签名写入 *pp(注意:如果 pp 为 NULL,i2d_ECDSA_SIG 返回 DER 编码签名的预期长度(以字节为单位)。i2d_ECDSA_SIG 返回DER 编码签名(或 0 错误)。
d2i_ECDSA_SIG() 对 DER 编码的 ECDSA 签名进行解码,并在新分配的 ECDSA_SIG 结构中返回解码后的签名。 *sig 指向包含大小为 len 的 DER 编码签名的缓冲区。 "
如果您想在屏幕上打印签名,则必须使用 Base64 :)