Openssl 如何获取ECC sm2证书公钥数据?

vickorfox 2015-04-02 06:15:50

我现在通过调用x509系列API接口函数可以解析sm2证书,获取出证书的信息比如:序列号,CN值等,
但是获取公钥数据时出错。
直接上代码吧

EVP_PKEY * pubKey ;
X509 *x509Cert = NULL;
x509Cert = d2i_X509(NULL,usrCertificate,usrCertificateLen);
//获取证书版本,能正确获取到值
Version = X509_get_version(x509Cert);
//这里省略一些解析证书的代码

//下面是获取公钥数据的代码
if ( x509Cert->cert_info == NULL)
return ;
pubKey = X509_PUBKEY_get(x509Cert->cert_info->key); 这里获取到的pubKey为空,导致获取不到公钥数据




是不是这种解析方法有问题!
应该怎么样获取到公钥数据呢?大家帮忙解决下吧,谢谢了!
...全文
1836 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_30170067 2017-08-09
  • 打赏
  • 举报
回复 1
可以的,直接解析X509,把公钥拿出来重写一下就行了。粘几行关键代码吧,希望对受困扰的小伙伴有用 x = strToX509(pbCert, pulCertLen); dwRet = getCertPubKey(x, &pRSAPubKeyBlob, &pECCPubKeyBlob); ECCPUBLICKEYBLOB pec = { 0 };//目标公钥 pec.BitLen = 256; int i = 0; for (i = 0; i < 64; i++){ if (i <= 31){ pec.XCoordinate[i] = 0; pec.YCoordinate[i] = 0; } else{ pec.XCoordinate[i] = pECCPubKeyBlob.XCoordinate[i - 32]; pec.YCoordinate[i] = pECCPubKeyBlob.YCoordinate[i - 32]; } } 其实就是公钥结构解析的问题,SM2公钥所需要的格式和X509解析出来的X,Y位置是颠倒的,要求的结果是X,Y数组前32为0;而X509提供的为后32为0,正好颠倒了。
anda0109 2016-09-12
  • 打赏
  • 举报
回复
具体怎么解析公钥呢,最近也在搞这个,用openssl好像不行。
f1234560hzx 2016-05-06
  • 打赏
  • 举报
回复
有两种方案,比较简单的一种是自己封个接口去cert_info的pub_key里读data解析,另一种就是通过get_pubkey接口了,不过这个需要加入sm2的曲线参数,算法oid也要加,因为sm2和Openssl的ecc不太一样,中间还要改一些东西,一步一步的调试跟下来
tt_1991_2001 2015-11-02
  • 打赏
  • 举报
回复
我最近也有这个问题,但说实话,ECC没人或没几个人能说的清楚。 网上的东西,都搬来搬去。 比如,最大的问题就是ECC算法的非对称加密解密。 网上根本没人谈及到过。
mhpmii 2015-09-15
  • 打赏
  • 举报
回复
ecc的过程与rsa相比有很大的不同,ecc涉及到了很多额外的概念,比如group等等,另外ecc包含两套截然不同的机制ecdh ,ecdsa struct ec_key_st { int version; EC_GROUP *group; EC_POINT *pub_key; BIGNUM *priv_key; unsigned int enc_flag; point_conversion_form_t conv_form; int references; EC_EXTRA_DATA *method_data; } /* EC_KEY */;

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧