基于mbedtls开源库国密算法的使用
2022/3/1 1:22:18
本文主要是介绍基于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; }
运行效果展示
这篇关于基于mbedtls开源库国密算法的使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?