mbedtls 入门第七课--移植mbedtls到VS和ESP8266--VS rsa不定秘钥 移植

承接上篇,我们初步了解了mbedtls的文件路径以及文件作用以后就是想着如何将mbedtls移植到各种平台。

博主这里移植一个高级的算法--非对称性算法rsa算法移植。

建立工程和MD是一样的,没有什么区别。

这里博主讲解下测试代码里面使用的API,博主自己理解的角度讲解测试待。

1.不定秘钥RSA加解密

工程主要实现RSA算法+V21 padding+ 加解密功能,但是工程本次是使用不定秘钥做的加解密。

1.1 反向逆推算法需要依赖的API。首先最重要的API是加解密API mbedtls_rsa_pkcs1_encrypt 和mbedtls_rsa_pkcs1_decrypt。

从H文档函数定义可以看到,第一个参数就是RSA初始化的值,这里博主姑且把它称呼为RSA秘钥。第二个、第三参数都是和随机数功能相关的输入参数,这章博主说了这里采用的是不定秘钥做加解密,这就意味着第二个参数和第三个参数都应该保留。 第四个参数是明文的长度,这个长度一般小等于秘钥长度-padding的长度。 第五个参数输入明文,第六个参数是密文,密文长度等于秘钥的长度。

rsa一般有以下几种1024-bit,意味着密文长度 = 1024/8 = 126字节。更往上的还有2048,3072,4096等几种长度。

1.2 既然要使用到秘钥,那么不可缺少的一个函数就是秘钥生成函数mbedtls_rsa_gen_key。

 

 由mbedtls_rsa_gen_key说明可知,第二个参数,第三个参数随机数也是很重要的。然后我们需要定义使用到的key的长度以及指数的基准,当然这里也给了例程,一般使用65537作为指数。并且要在mbedtls_rsa_init()mbedtls_rsa_gen_key之前调用mbedtls_rsa_init。

1.3 为了使用mbedtls_rsa_gen_key里面的随机数和秘钥生成的必要的随机数结构体和熵结构体,还有三个函数也需要使用到。

mbedtls_ctr_drbg_seed,mbedtls_entropy_init,mbedtls_ctr_drbg_init。并且后两个函数还需要在mbedtls_ctr_drbg_seed之前调用。

根据以上逻辑最后得到的函数就是这种逻辑:

    int ret;
    size_t olen = 0;
    uint8_t out[2048/8];
    mbedtls_rsa_context ctx;    //RSA密钥结构体
    mbedtls_entropy_context entropy;
    mbedtls_ctr_drbg_context ctr_drbg;
    const char *pers = "simple_rsa";
    const char *msg = "Hello, World!";

    mbedtls_entropy_init(&entropy);//初始化熵结构体
    mbedtls_ctr_drbg_init(&ctr_drbg);//初始化随机数结构体
    //rsa结构体初始化
    mbedtls_rsa_init(&ctx, MBEDTLS_RSA_PKCS_V21, //填充方案OAEP
                            MBEDTLS_MD_SHA256); //SHA256做散列算法
    
    ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, 
                                    (const uint8_t *) pers, strlen(pers));//根据个性化字符串更新种子
    mbedtls_printf("\n  . setup rng ... ok\n");

    mbedtls_printf("\n  ! RSA Generating large primes may take minutes! \n");
    //生成RSA密钥
    ret = mbedtls_rsa_gen_key(&ctx, mbedtls_ctr_drbg_random, //随机数生成接口
                                        &ctr_drbg, //随机数结构体
                                        2048, //模数位长度
                                        65537);//公开指数0x01001                                 
    mbedtls_printf("\n  1. RSA generate key ... = %d\n",ret );
    //RSA加密
    ret = mbedtls_rsa_pkcs1_encrypt(&ctx, mbedtls_ctr_drbg_random, //随机数生成接口

                            &ctr_drbg,          //随机数结构体
                            MBEDTLS_RSA_PUBLIC, //公钥操作
                            strlen(msg),        //消息长度
                            msg,                //输入消息指针
                            out);               //输出密文指针
    printf(" 加密结果 = %d\n",ret );

按照我们对mbedtls_rsa_pkcs1_encrypt的理解,如果解密成功,ret的值一定是0,反之就会报错。

实际VS工程可以访问博主的Git仓库:

 mbedtls : mbedtls 2.14.1 SDK (gitee.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值