我正在尝试创建 C 程序,如果我可以从菜单中选择我想要从签署消息和验证消息中选择的选项。我有签名消息并同时验证的代码。我想要的是能够解析一条消息并对其进行签名,然后输出证书。接下来,当我选择验证时,我将插入相同的消息和证书,这样我就可以实际验证或不验证消息。
我使用的代码来自: Signing a message using ECDSA in OpenSSL
PS:基本上我不知道如何实际打印签名、私钥和公钥。
非常感谢。
我正在尝试创建 C 程序,如果我可以从菜单中选择我想要从签署消息和验证消息中选择的选项。我有签名消息并同时验证的代码。我想要的是能够解析一条消息并对其进行签名,然后输出证书。接下来,当我选择验证时,我将插入相同的消息和证书,这样我就可以实际验证或不验证消息。
我使用的代码来自: Signing a message using ECDSA in OpenSSL
PS:基本上我不知道如何实际打印签名、私钥和公钥。
非常感谢。
我想我找到了打印 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)));
谢谢最好的问候
使用这些功能:
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 :)