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

 

标签: none

添加新评论