首页 > 解决方案 > 如何从 EC_KEY 获取发布密钥以使用 ECDSA_do_verify 函数验证摘要?

问题描述

我试图弄清楚如何使用 ECDSA 签名和仅公钥来验证哈希。我已经设法使用 EC_KEY 对象(私钥 + 公钥)进行验证。但是,由于该对象将被发送,我不希望我的私钥被发布。这是我的 sign_hash 函数:

int sign_hash(const char *hash, struct Hash *signed_hash)
{
    int retval = 0;
    EC_KEY *myecc;
    ECDSA_SIG *signature;
    
    if (strlen(hash) > 0)   
    {
        myecc = EC_KEY_new_by_curve_name(ECCTYPE);
        if (myecc == NULL)
        {
            fprintf(stderr, "Failed to create new EC key\n");
            retval = 0;
        }
        else
        {
            if (create_keys(myecc))
            {   
                if (ec_sign(hash, myecc, signature))
                {
                    printf("Successfully signed hash\n");

                    signed_hash->pub_key = EC_KEY_new_by_curve_name(ECCTYPE);
                    if (EC_KEY_copy(signed_hash->pub_key, myecc) != NULL)
                    {
                        signed_hash->signature = signature;
                        strcpy(signed_hash->digest, hash);
                        retval = 1; 
                    }
                    else
                    {
                        fprintf(stderr, "EC_KEY_copy error\n");
                    }      
                }
                else
                {
                    fprintf(stderr, "Failed to sign EC signature\n");
                }
            }
            else
            {                 
                fprintf(stderr, "Failed to generate EC Key\n");
            }   
        }
    }
    else
    {
        fprintf(stderr, "Empty hash to sign\n");
    }

    return retval;
}

Hash 结构变量具有以下结构:

struct Hash
{
    char digest[HASH_SIZE];
    ECDSA_SIG *signature;
    EC_KEY *pub_key;
};

这些是ECDSA_do_verify函数中需要的参数。

我想知道如何只复制公钥signed_hash->pub_key而不是私钥和公钥。

谢谢,

bgxx

标签: copensslecdsa

解决方案


推荐阅读