【sm2算法】基于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_context ctx;
    int result = -1;
    result = sm2_init(&ctx);
    //生成秘钥对
    result = sm2_gen_keypair(&ctx, mbedtls_ctr_drbg_random, &ctr_drbg);

    // printf("%x ", *(ctx.d.p));
    // 打印私钥
    int i = 0;
    for (i = 0; i < ctx.d.n; i++)
    {
        printf("%016lx ", *(ctx.d.p + i));
    }

    printf("\n");

    // //打印公钥
    for (i = 0; i < ctx.Pb.X.n; i++)
    {
        printf("%016lx ", *(ctx.Pb.X.p + i));
    }

    for (i = 0; i < ctx.Pb.Y.n; i++)
    {
        printf("%016lx ", *(ctx.Pb.Y.p + i));
    }

    printf("\n");

    return 0;
}

运行效果展示

注意: 我们生成的密钥对使用的是小端存储方式,所以我们应该倒过来看公私钥。

比如上面得到的:

公钥:9f1d21c1ed8c0ba1 67cd9860163c0319 38f536033880413f bac520124efd9ec6

私钥:594d7c9528bef7e3 eda6cb2466d1a21b ee6141fb8486abd0 4dcd4b4a48675da7 

           68f7249024545f88 6c51b39bf1a21553  5b1edf9abafe4aa9  7e3ee39532fe596b

专业工具验证效果

完美符合 !!!

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

super码王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值