[转载]借助openssl解析ECC公钥
void GetPubKey(const char* FilePath, char* PubKey)
{
unsigned char Cert[];
unsigned char *pTmp = NULL;
FILE *fp = NULL;
fp=fopen(FilePath,“rb”);
if( NULL != fp)
{
X509 *usrCert = NULL; //X509证书结构体,保存用户证书
unsigned long Certlen = ;
Certlen=fread(Cert,,,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 = ;
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 < )
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
[转载]借助openssl解析ECC公钥的更多相关文章
- 学习ECC及Openssl下ECC生成密钥的部分源代码心得
一.ECC的简介 椭圆曲线算法可以看作是定义在特殊集合下数的运算,满足一定的规则.椭圆曲线在如下两个域中定义:Fp域和F2m域. Fp域,素数域,p为素数: F2m域:特征为2的有限域,称之为二元域或 ...
- .NET导入openssl生成的公钥之BEGIN RSA PUBLIC KEY
.NET导入openssl生成的公钥之BEGIN RSA PUBLIC KEY 我得到了一个公钥,形式如下 -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAMroxz3 ...
- ECC公钥格式详解
本文首先介绍公钥格式相关的若干概念/技术,随后以示例的方式剖析DER格式的ECC公钥,最后介绍如何使用Java生成.解析和使用ECC公钥. ASN.1 Abstract Syntax Notation ...
- openssl解析国密X509证书
openssl解析国密X509证书,把公钥拿出来重写一下就行了 x = strToX509(pbCert, pulCertLen);dwRet = getCertPubKey(x, &a ...
- [转帖]ECC公钥格式详解
ECC公钥格式详解 https://www.cnblogs.com/xinzhao/p/8963724.html 本文首先介绍公钥格式相关的若干概念/技术,随后以示例的方式剖析DER格式的ECC公钥, ...
- openssl pem 生成公钥和私钥及文件
openssl pem.h 中提供了关于pem格式密钥对的操作接口 通常使用.pem的格式文件来保存openssl 生成的密钥对: 在终端下 cat xxx.pem 可以看到 p.p1 { margi ...
- Windows 下使用OpenSSL生成RSA公钥和私钥
Windows 下使用OpenSSL生成RSA公钥和私钥 (1)下载OpenSSL 可到该地址下载OpenSSL: https://www.openssl.org/source/(https://ww ...
- 【转载】OpenSSL 提取 pfx 数字证书公钥与私钥
转自https://www.cnblogs.com/Irving/p/9551110.html OpenSSL 提取 pfx 数字证书公钥与私钥 由于之前生产环境已经使用了 Identityser ...
- 通过OpenSSL解析X509证书基本项
在之前的文章"通过OpenSSL解码X509证书文件"里.讲述了怎样使用OpenSSL将证书文件解码,得到证书上下文结构体X509的方法. 以下我们接着讲述怎样通过证书上下文结构体 ...
随机推荐
- mac 命令行终端 设置代理
环境: macOS Mojave 10.14.3 iTrem 2 3.2.8 酸酸乳1.1.4.4-R8 查看自己命令行的状态 curl ip.gs 正式开始 一.首先检查自己的酸酸乳是否正常,并在高 ...
- 115-基于TI TMS320DM6467无操作系统Camera Link智能图像分析平台
基于TI TMS320DM6467无操作系统Camera Link智能图像分析平台 1.板卡概述 该板卡是我公司推出的一款具有高可靠性.效率大化.无操作系统的智能视频处理卡,是机器视觉开发上的选. ...
- The Complex Inversion Formula. Bromwich contour.
网址:http://www.solitaryroad.com/c916.html
- qthread线程
一般调用quit()函数之后可以紧接着调用wait()函数确保线程退出.sleep()等让线程休眠的函数不需要调用,因为Qt中线程是事件驱动机制.但是如果是继承的QTHread类,在run()函数中使 ...
- python3-继承和多态
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Supe ...
- centos .7x service iptables save 错误解决方案
保存转发规则的时候,发现service iptables save 无效,而且报错[root@localhost bin]# service iptables saveThe service comm ...
- ivew 封装删除 对话框
封装的组件 <template> <Modal footer-hide :closable="false" title="删除确认" v-mo ...
- 并行操作多个序列map
>>> def add1(a): return a + 1 >>> def add2(a,b): return a + b >>> def add ...
- SPOJ-GSS1-Can you answer these queries 1
链接: https://vjudge.net/problem/SPOJ-GSS1 题意: You are given a sequence A[1], A[2], ..., A[N] . ( |A[i ...
- python学习_day1
简单的输入与输出 python3.x输入 用内置函数input(),返回的数据类型是string,输出用print() 查看数据类型 用type方法 例如 a = int(input('请输入:')) ...