标签:sm2 ctr 库国密 drbg ctx 开源 mpi mbedtls
基础知识
(1)公钥:在代码编程中,公钥是使用64个字节来存储的。
(2)私钥:在代码编程中,公钥是使用32个字节来存储的。
对应的代码具体实现
(1)mbedtls sm2环境
在 mbedtls 中 sm2 环境是用结构体 sm2_context 结构体来表示的,具体结构体如下所示:
typedef struct {
mbedtls_ecp_group grp; /*!< elliptic curve used group */
mbedtls_mpi d; /*!< secret value (private key) */
mbedtls_ecp_point Pb; /*!< public value (public key) */
} sm2_context;
从注释中我们可以很清楚的看到 Pb 存储的是公钥,d 存储的是私钥,具体怎么存储的,请继续往下看:
(2)公钥:
结构体 mbedtls_ecp_point Pb 表示,其中又可以分为 => mbedtls_mpi X + mbedtls_mpi Y,因为 X、Y都表示32个字节,所以构成64个字节的公钥,mbedtls_mpi Z不用管。
其中 mbedtls_mpi 是真正装着公私钥的最小单元,结构体如下所示:
typedef struct
{
int s; /*不用管 */
size_t n; /*这个表示有几个 p */
mbedtls_mpi_uint *p; /*p是一个指向8个字节数据的指针,所有 n=4,p=8,n*p=4*8=32个字节 */
}
mbedtls_mpi;
(3)私钥:
私钥只需要 32个 字节就可以完成存储,所以一个 mbedtls_mpi 就可以存的下,所以就有大家上面见到的 mbedtls_mpi d 就完成了私钥的存储。
总结:通过上面的的学习我们要搞清楚 sm2_context => mbedtls_ecp_point => mbedtls_mpi 这三个结构体的关系,和其结构体各成员的含义就行了。
搞清楚了上面的公私钥基本情况和其表示方法,下面我们来看看其初始化和生成的步骤:
公私钥初始化和生成的步骤
#include <stdio.h>
#include <stdlib.h>
#include "SSL/sm2/sm2.h"
#include "SSL/mbedtls/ctr_drbg.h"
#include "SSL/mbedtls/entropy.h"
int main()
{
//初始化随机数
mbedtls_ctr_drbg_context ctr_drbg;
mbedtls_ctr_drbg_init(&ctr_drbg);
mbedtls_entropy_context entropy;
mbedtls_entropy_init(&entropy);
mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0);
//初始化sm2环境,比如准备生成sm2密钥对的椭圆曲线参数
sm2_context ctx;
int result = -1;
result = sm2_init(&ctx);
//生成秘钥对
result = sm2_gen_keypair(&ctx, mbedtls_ctr_drbg_random, &ctr_drbg);
//打印公钥
int i = 0;
for (i = 0; i < ctx.d.n; i++)
{
printf("%x ", *(ctx.d.p + i));
}
printf("\n");
//打印私钥
for (i = 0; i < ctx.Pb.X.n; i++)
{
printf("%x ", *(ctx.Pb.X.p + i));
}
for (i = 0; i < ctx.Pb.Y.n; i++)
{
printf("%x ", *(ctx.Pb.Y.p + i));
}
printf("\n");
return 0;
}
运行效果展示
标签:sm2,ctr,库国密,drbg,ctx,开源,mpi,mbedtls 来源: https://blog.csdn.net/qq_41885673/article/details/123192953
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。