zoukankan      html  css  js  c++  java
  • [转载]借助openssl解析ECC公钥

    void GetPubKey(const char* FilePath, char* PubKey)
    {
        unsigned char Cert[4099];
        unsigned char *pTmp = NULL;
        FILE *fp = NULL;
        fp=fopen(FilePath,“rb”);
        if( NULL != fp)
        {
            X509 *usrCert = NULL; //X509证书结构体,保存用户证书
            unsigned long Certlen = 0;
            Certlen=fread(Cert,1,4096,fp);
            fclose(fp);
    //判断是否为DER编码的用户证书,并转化为X509结构体
            pTmp = Cert;
    //usrCert = d2i_X509(NULL,(const unsigned char ** )&pTmp,Certlen);
    
    //if( NULL == usrCert)
            {
                BIO b;
                / 判断是否为PEM格式的数字证书 */
                b=BIO_new_file(FilePath,“r”);
                PEM_read_bio_X509(b, &usrCert, NULL, NULL);
                BIO_free(b);
                if(usrCert==NULL)
                {
                    return;
                }
            }
    //保存证书公钥
            int derpubkeyLen = 0;
            EVP_PKEY pubKeytemp = NULL;
            pTmp = NULL;
            char HexKey = NULL;
    //获取证书公钥
            pubKeytemp = X509_get_pubkey(usrCert);
            if (!pubKeytemp)
                return;
    
            X509_PUBKEY * pubKeytempss;
            pubKeytempss = X509_get_X509_PUBKEY(usrCert);
            derpubkeyLen = i2d_PublicKey(pubKeytemp, NULL);
            if(derpubkeyLen < 1)
                return;
    
            unsigned char* buf = NULL;
            buf = (unsigned char*)malloc(derpubkeyLen);
            i2d_PublicKey(pubKeytemp,&buf);
    
            EC_KEY ec_key = EVP_PKEY_get0_EC_KEY(pubKeytemp);
            if (!ec_key)
                return;
            int buflen = EC_KEY_key2buf(ec_key, EC_KEY_get_conv_form(ec_key),(unsigned char)&pTmp, NULL);
            *
    
            BIGNUM *pub_key_BIGNUM;
            pub_key_BIGNUM = BN_new();
            BN_bin2bn(pTmp, buflen, pub_key_BIGNUM);
            HexKey = BN_bn2hex(pub_key_BIGNUM);
            strcpy(PubKey,HexKey);
    
            EVP_PKEY_free(pubKeytemp);
            X509_free(usrCert);
    
        }
    
    }

    其中斜体部分也可以利用如下代码替换
    EC_POINT pub_key;
    unsigned char pubbuf[1024] = { 0 };//公钥数据
    pub_key = (EC_POINT)EC_KEY_get0_public_key(ec_key);
    EC_GROUP* group = (EC_GROUP*)EC_KEY_get0_group(ec_key);
    int buflen = EC_POINT_point2oct(group, pub_key, EC_KEY_get_conv_form(ec_key), pubbuf, sizeof(pubbuf), NULL);

    还有另外一种如下:
    ASN1_BIT_STRING * pubkey;
    pubkey = X509_get0_pubkey_bitstr(usrCert);
    int nlen = pubkey->length;
    pubkey->data

    即为其公钥数据。

    原文链接:https://blog.csdn.net/Elsa_Zhang/article/details/88190769

  • 相关阅读:
    使用数组实现简单线性表功能
    解析.NET 许可证编译器 (Lc.exe) 的原理与源代码剖析
    Entity Framework with NOLOCK
    64位CentOS 6.0下搭建LAMP环境
    如何正确看待Linq的DistinctBy扩展和ForEach扩展
    jQuery最佳实践
    大话数据结构-树
    hdu2534-Score
    WKE——Webkit精简的纯C接口的浏览器
    WM_ERASEBKGND官方解释(翻译),以及Delphi里所有的使用情况(就是绘制窗口控件背景色,并阻止进一步传递消息)
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/11346426.html
Copyright © 2011-2022 走看看