【问题标题】: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 :)

      【讨论】:

        猜你喜欢
        • 2020-06-11
        • 2018-04-20
        • 1970-01-01
        • 1970-01-01
        • 2019-10-02
        • 1970-01-01
        • 1970-01-01
        • 2014-11-12
        • 1970-01-01
        相关资源
        最近更新 更多