mbedtls里面的rsa应用函数

  • 准备函数如下
  • 使用自己生成的密钥进行加解密代码
  • 使用已经生成的密钥进行加解密
  • 使用自己生成的密钥进行签名和验签
  • 使用已经生成的密钥进行验签

笔者自己总结的mbedtls里面rsa的函数应用并加上简单的注释,方便以后自己使用的时候可以直接参考。

#RSA结构体成员

准备函数如下

static void dump_rsa_key(mbedtls_rsa_context* rsa)
{size_t olen;char buf[516];mbedtls_mpi* x;mbedtls_printf("\n+++++++++++++++++ rsa keypair +++++++++++++++++\n");mbedtls_printf("{\n");for (x = &rsa->N; x < &rsa->QP; x++){mbedtls_mpi_write_string(x, 16, buf, sizeof(buf), &olen);mbedtls_printf("\"%s\",\n", buf);}mbedtls_printf("}");mbedtls_printf("\n  +++++++++++++++++ rsa keypair +++++++++++++++++\n\n");
}
#define assert_exit(cond, ret) \if(!cond)\{printf("  !. assert: failed [line: %d, error: -0x%04X]\n", __LINE__, -ret); \return 1;}

使用自己生成的密钥进行加解密代码

int RsaShow0(void)//自己生成密钥进行加解密测试
{int ret;const uint8_t ctr_drbg_byte[]= "rsa sample";uint8_t sendmes[] = "hello word\r\n";uint8_t outmes[256];mbedtls_rsa_context rsa;//定义密钥结构体mbedtls_entropy_context entropy;//定义熵结构体mbedtls_ctr_drbg_context ctr_drbg;//定义随机数结构体mbedtls_entropy_init(&entropy);//初始化熵结构体mbedtls_ctr_drbg_init(&ctr_drbg);//初始化随机数结构体mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_SHA256);//填充方案1.5  SHA256做散列算法ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,ctr_drbg_byte, strlen((const char*)ctr_drbg_byte));//根据个性化字符串更新种子assert_exit(ret == 0, ret);//生成rsa密钥ret = mbedtls_rsa_gen_key(&rsa, mbedtls_ctr_drbg_random, //随机数生成接口&ctr_drbg,2048,0x01001);//随机数结构体,模数位长度,公开指数0x01001dump_rsa_key(&rsa);assert_exit(ret == 0, ret);//RSA加密ret = mbedtls_rsa_pkcs1_encrypt(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg,//随机数生成接口,随机数结构体MBEDTLS_RSA_PUBLIC, strlen((const char*)sendmes),sendmes, outmes); //公钥操作,消息长度,输入消息指针,输出密文指针assert_exit(ret == 0, ret);//RSA解密size_t outlen=0;ret = mbedtls_rsa_pkcs1_decrypt(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg,//随机数生成接口,随机数结构体MBEDTLS_RSA_PRIVATE, &outlen, outmes,outmes, sizeof(outmes));//私钥操作,输出长度,输入密文指针,输出明文指针,最大输出明文数组长度assert_exit(ret == 0, ret);printf("%s\r\n", outmes);
}

使用已经生成的密钥进行加解密

int RsaShow1(void)//使用已经生成密钥进行加解密测试
{int ret;const uint8_t ctr_drbg_byte[] = "rsa sample";uint8_t sendmes[] = "hello word\r\n";uint8_t outmes[256];mbedtls_rsa_context rsa;//定义密钥结构体mbedtls_entropy_context entropy;//定义熵结构体mbedtls_ctr_drbg_context ctr_drbg;//定义随机数结构体mbedtls_entropy_init(&entropy);//初始化熵结构体mbedtls_ctr_drbg_init(&ctr_drbg);//初始化随机数结构体mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_SHA256);//填充方案1.5  SHA256做散列算法ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,ctr_drbg_byte, strlen((const char*)ctr_drbg_byte));//根据个性化字符串更新种子assert_exit(ret == 0, ret);//加载rsa密钥  加密必须要有N,P;解密必须要有P,Q,D,Eret = mbedtls_mpi_read_string(&rsa.N, 16, rsa_priv.N) ||mbedtls_mpi_read_string(&rsa.P, 16, rsa_priv.P) ||mbedtls_mpi_read_string(&rsa.Q, 16, rsa_priv.Q) ||mbedtls_mpi_read_string(&rsa.D, 16, rsa_priv.D) ||mbedtls_mpi_read_string(&rsa.E, 16, rsa_priv.E) ||mbedtls_mpi_read_string(&rsa.DP, 16, rsa_priv.DP) ||mbedtls_mpi_read_string(&rsa.DQ, 16, rsa_priv.DQ) ||mbedtls_mpi_read_string(&rsa.QP, 16, rsa_priv.QP);assert_exit(ret == 0, ret);ret = mbedtls_rsa_import(&rsa, &rsa.N, &rsa.P, &rsa.Q, &rsa.D, &rsa.E);assert_exit(ret == 0, ret);ret = mbedtls_rsa_complete(&rsa);assert_exit(ret == 0, ret);dump_rsa_key(&rsa);//RSA加密ret = mbedtls_rsa_pkcs1_encrypt(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg,//随机数生成接口,随机数结构体MBEDTLS_RSA_PUBLIC, strlen((const char*)sendmes), sendmes, outmes); //公钥操作,消息长度,输入消息指针,输出密文指针assert_exit(ret == 0, ret);//RSA解密size_t outlen = 0;ret = mbedtls_rsa_pkcs1_decrypt(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg,//随机数生成接口,随机数结构体MBEDTLS_RSA_PRIVATE, &outlen, outmes, outmes, sizeof(outmes));//私钥操作,输出长度,输入密文指针,输出明文指针,最大输出明文数组长度printf("%s\r\n", outmes);
}

使用自己生成的密钥进行签名和验签

int RsaShow2(void)//自己生成密钥进行签名验证
{int ret;const uint8_t ctr_drbg_byte[] = "rsa sample";uint8_t sendmes[] = "hello word\r\n";uint8_t outmes[256];mbedtls_rsa_context rsa;//定义密钥结构体mbedtls_entropy_context entropy;//定义熵结构体mbedtls_ctr_drbg_context ctr_drbg;//定义随机数结构体mbedtls_entropy_init(&entropy);//初始化熵结构体mbedtls_ctr_drbg_init(&ctr_drbg);//初始化随机数结构体mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_SHA256);//填充方案1.5  SHA256做散列算法ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,ctr_drbg_byte, strlen((const char*)ctr_drbg_byte));//根据个性化字符串更新种子assert_exit(ret == 0, ret);//生成rsa密钥ret = mbedtls_rsa_gen_key(&rsa, mbedtls_ctr_drbg_random, //随机数生成接口&ctr_drbg, 2048, 0x01001);//随机数结构体,模数位长度,公开指数0x01001    assert_exit(ret == 0, ret);dump_rsa_key(&rsa);//进行签名ret = mbedtls_rsa_pkcs1_sign(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg,MBEDTLS_RSA_PRIVATE, MBEDTLS_MD_SHA256,sizeof(sendmes), sendmes, outmes);//签名信息                输出加密签名assert_exit(ret == 0, ret);//进行验签ret = mbedtls_rsa_pkcs1_verify(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg,MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA256, sizeof(sendmes), sendmes, outmes);if (!ret){printf("验签完成");}else{printf("验签失败");}
}

使用已经生成的密钥进行验签

int RsaShow3(void)//使用已经生成密钥进行签名验证
{int ret;const uint8_t ctr_drbg_byte[] = "rsa sample";uint8_t sendmes[] = "hello word\r\n";uint8_t outmes[256];mbedtls_rsa_context rsa;//定义密钥结构体mbedtls_entropy_context entropy;//定义熵结构体mbedtls_ctr_drbg_context ctr_drbg;//定义随机数结构体mbedtls_entropy_init(&entropy);//初始化熵结构体mbedtls_ctr_drbg_init(&ctr_drbg);//初始化随机数结构体mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_SHA256);//填充方案1.5  SHA256做散列算法ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,ctr_drbg_byte, strlen((const char*)ctr_drbg_byte));//根据个性化字符串更新种子assert_exit(ret == 0, ret);//加载rsa密钥  签名必须要有P,Q,D,E;解签必须要有N,P;ret = mbedtls_mpi_read_string(&rsa.N, 16, rsa_priv.N) ||mbedtls_mpi_read_string(&rsa.P, 16, rsa_priv.P) ||mbedtls_mpi_read_string(&rsa.Q, 16, rsa_priv.Q) ||mbedtls_mpi_read_string(&rsa.D, 16, rsa_priv.D) ||mbedtls_mpi_read_string(&rsa.E, 16, rsa_priv.E) ||mbedtls_mpi_read_string(&rsa.DP, 16, rsa_priv.DP) ||mbedtls_mpi_read_string(&rsa.DQ, 16, rsa_priv.DQ) ||mbedtls_mpi_read_string(&rsa.QP, 16, rsa_priv.QP);assert_exit(ret == 0, ret);ret = mbedtls_rsa_import(&rsa, &rsa.N, &rsa.P, &rsa.Q, &rsa.D, &rsa.E);assert_exit(ret == 0, ret);ret = mbedtls_rsa_complete(&rsa);assert_exit(ret == 0, ret);//进行签名ret = mbedtls_rsa_pkcs1_sign(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg,MBEDTLS_RSA_PRIVATE, MBEDTLS_MD_SHA256, sizeof(sendmes), sendmes, outmes);//签名信息                输出加密签名//输出签名信息printf("{\n");for (int i=0;i<sizeof(outmes);i++){if (i % 16 == 0){printf("\n");}printf("%x,",outmes[i]);        }printf("\n}");assert_exit(ret == 0, ret);//进行验签ret = mbedtls_rsa_pkcs1_verify(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg,MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA256, sizeof(sendmes), sendmes, outmes);if (!ret){printf("验签完成");}else{printf("验签失败");}
}

mbedtls里面的rsa应用函数相关推荐

  1. STL里面的sort()函数使用结构体

    当用sort()想对结构体进行排序的时候,这时候就需要自己写一个排序函数了 写这个是因为自己好久没用STL里面的sort()函数了.都忘记了 .再次实现一下 其实排序函数也很简单,自己实现 代码如下: ...

  2. ajax实现注册用户名时动态显示用户名是否已经被注册(1、ajax可以实现我们常见的注册用户名动态判断)(2、jquery里面的ajax也是类似我们这样封装了的函数)...

    ajax实现注册用户名时动态显示用户名是否已经被注册(1.ajax可以实现我们常见的注册用户名动态判断)(2.jquery里面的ajax也是类似我们这样封装了的函数) 一.总结 1.ajax可以实现我 ...

  3. c语言visit函数作用,[求助]二叉树遍历的程序里面的visit函数如何实现

    [求助]二叉树遍历的程序里面的visit函数如何实现 我在没懂的后面加注释 希望大家指教 #include #include #define MAXSIZE 100 typedef struct bi ...

  4. 小福利,excel里面的subtotal函数的高级运用

    小福利,excel里面的subtotal函数的高级运用 由于函数SUBTOTAL不能和其他函数一起使用,所以我们要将数据进行粘贴, 我们选择使用SUBTOTAL函数的103了,计算非空单元格的个数,且 ...

  5. PyTorch里面的torch.nn.Parameter()

    在刷官方Tutorial的时候发现了一个用法self.v = torch.nn.Parameter(torch.FloatTensor(hidden_size)),看了官方教程里面的解释也是云里雾里, ...

  6. Angularjs $scope 里面的$apply 方法 和 $watch 方法

    Angularjs $scope 里面的$apply 方法 和 $watch 方法 学习要点: 1. Angularjs $scope 里面的$apply 方法 2. Angularjs $scope ...

  7. m_Orchestrate learning system---二十四、thinkphp里面的ajax如何使用

    m_Orchestrate learning system---二十四.thinkphp里面的ajax如何使用 一.总结 一句话总结:其实ajax非常简单:前台要做的事情就是发送ajax请求过来,后台 ...

  8. thinkphp url去掉index.php,thinkphp 去掉URL 里面的index.php(?s=)

    例如你的原路径是 http://localhost/test/index.php/home/goods/index.html 那么现在的地址是 http://localhost/test/home/g ...

  9. Android之解决webview加载第三方网页点击弹不出下拉框(html页面里面的select标签)

    1 问题 决webview加载第三方网页点击弹不出下拉框(html页面里面的select标签),我们访问youtube.com官网,点击网站的视频,点击视频右上角三个点设置,然后点击 播放设置 然后点 ...

  10. MATLAB里面的filter和filtfilt的C语言源代码

    MATLAB里面的filter和filtfilt的C语言源代码 嗯,算法非常简单,就是网上搜不到C代码实现.filter是个很万能的数字滤波器函数,只要有滤波器的差分方程系数,IIR呀FIR呀都能通过 ...

最新文章

  1. Linux下修改Mysql数据库存放路径
  2. 为什么事情执行不下去?
  3. nyoj 1261 音痴又音痴的LT(离散化+树状数组求K小数)
  4. web.xml 组件加载顺序
  5. 前端学习(2686):重读vue电商网站7之登录预校验
  6. SAP自学指南:案例公司的特点
  7. mysql批量存图片_教你如何在MySQL数据库中直接储存图片(3)
  8. 用 Access+Outlook 来采集信息
  9. JAVA:事件监听器之练习
  10. 单路电压表c语言编程,基于ADC0809和AT89S52单片机的数字电压表的设计
  11. 配置nginx报错no “ssl_certificate“ is defined in server listening on SSL port while SSL handshaking
  12. 软考之网络工程师准备
  13. 解决:文件名太长删不掉
  14. 机器学习之决策树算法
  15. 什么是深度可分离卷积及深度可分离卷积的优势
  16. 可以免费批量Excel转PDF的在线转换工具
  17. AI帮我画出了小说里的人物,我这么多年的小说好像白看了。。。
  18. string.Equals和tring.Compare比较字符串(并且忽略大小写)
  19. JMeter jp@gc - stepping thread group插件
  20. 超详细Python爬虫自学整理从基础内容开始到进阶(不断更新)(Anaconda中的Spyder)

热门文章

  1. 单词测试通关学英语的软件,推荐5款最火的英语学习类app
  2. 2020软件测试面试题汇总,看完BATJ面试官对你微微一笑!(内含答案)
  3. html转换为pdf c#,HTML转PDF(C# itextsharp)
  4. Ant Design - Anchor
  5. c语言递归打印99乘法表,递归与循环转换_九九乘法表打印_算法
  6. Android开发——电话簿
  7. AR工业应用|企业中使用的7个增强现实创新案例|effiarAR工业云平台
  8. Ubuntu完全教程,让你成为Ubuntu高手
  9. 经典的哲学家就餐问题
  10. 获取文件哈希值_Java 获得文件的指纹