mbedtls里面的rsa应用函数
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应用函数相关推荐
- STL里面的sort()函数使用结构体
当用sort()想对结构体进行排序的时候,这时候就需要自己写一个排序函数了 写这个是因为自己好久没用STL里面的sort()函数了.都忘记了 .再次实现一下 其实排序函数也很简单,自己实现 代码如下: ...
- ajax实现注册用户名时动态显示用户名是否已经被注册(1、ajax可以实现我们常见的注册用户名动态判断)(2、jquery里面的ajax也是类似我们这样封装了的函数)...
ajax实现注册用户名时动态显示用户名是否已经被注册(1.ajax可以实现我们常见的注册用户名动态判断)(2.jquery里面的ajax也是类似我们这样封装了的函数) 一.总结 1.ajax可以实现我 ...
- c语言visit函数作用,[求助]二叉树遍历的程序里面的visit函数如何实现
[求助]二叉树遍历的程序里面的visit函数如何实现 我在没懂的后面加注释 希望大家指教 #include #include #define MAXSIZE 100 typedef struct bi ...
- 小福利,excel里面的subtotal函数的高级运用
小福利,excel里面的subtotal函数的高级运用 由于函数SUBTOTAL不能和其他函数一起使用,所以我们要将数据进行粘贴, 我们选择使用SUBTOTAL函数的103了,计算非空单元格的个数,且 ...
- PyTorch里面的torch.nn.Parameter()
在刷官方Tutorial的时候发现了一个用法self.v = torch.nn.Parameter(torch.FloatTensor(hidden_size)),看了官方教程里面的解释也是云里雾里, ...
- Angularjs $scope 里面的$apply 方法 和 $watch 方法
Angularjs $scope 里面的$apply 方法 和 $watch 方法 学习要点: 1. Angularjs $scope 里面的$apply 方法 2. Angularjs $scope ...
- m_Orchestrate learning system---二十四、thinkphp里面的ajax如何使用
m_Orchestrate learning system---二十四.thinkphp里面的ajax如何使用 一.总结 一句话总结:其实ajax非常简单:前台要做的事情就是发送ajax请求过来,后台 ...
- thinkphp url去掉index.php,thinkphp 去掉URL 里面的index.php(?s=)
例如你的原路径是 http://localhost/test/index.php/home/goods/index.html 那么现在的地址是 http://localhost/test/home/g ...
- Android之解决webview加载第三方网页点击弹不出下拉框(html页面里面的select标签)
1 问题 决webview加载第三方网页点击弹不出下拉框(html页面里面的select标签),我们访问youtube.com官网,点击网站的视频,点击视频右上角三个点设置,然后点击 播放设置 然后点 ...
- MATLAB里面的filter和filtfilt的C语言源代码
MATLAB里面的filter和filtfilt的C语言源代码 嗯,算法非常简单,就是网上搜不到C代码实现.filter是个很万能的数字滤波器函数,只要有滤波器的差分方程系数,IIR呀FIR呀都能通过 ...
最新文章
- Linux下修改Mysql数据库存放路径
- 为什么事情执行不下去?
- nyoj 1261 音痴又音痴的LT(离散化+树状数组求K小数)
- web.xml 组件加载顺序
- 前端学习(2686):重读vue电商网站7之登录预校验
- SAP自学指南:案例公司的特点
- mysql批量存图片_教你如何在MySQL数据库中直接储存图片(3)
- 用 Access+Outlook 来采集信息
- JAVA:事件监听器之练习
- 单路电压表c语言编程,基于ADC0809和AT89S52单片机的数字电压表的设计
- 配置nginx报错no “ssl_certificate“ is defined in server listening on SSL port while SSL handshaking
- 软考之网络工程师准备
- 解决:文件名太长删不掉
- 机器学习之决策树算法
- 什么是深度可分离卷积及深度可分离卷积的优势
- 可以免费批量Excel转PDF的在线转换工具
- AI帮我画出了小说里的人物,我这么多年的小说好像白看了。。。
- string.Equals和tring.Compare比较字符串(并且忽略大小写)
- JMeter jp@gc - stepping thread group插件
- 超详细Python爬虫自学整理从基础内容开始到进阶(不断更新)(Anaconda中的Spyder)
热门文章
- 单词测试通关学英语的软件,推荐5款最火的英语学习类app
- 2020软件测试面试题汇总,看完BATJ面试官对你微微一笑!(内含答案)
- html转换为pdf c#,HTML转PDF(C# itextsharp)
- Ant Design - Anchor
- c语言递归打印99乘法表,递归与循环转换_九九乘法表打印_算法
- Android开发——电话簿
- AR工业应用|企业中使用的7个增强现实创新案例|effiarAR工业云平台
- Ubuntu完全教程,让你成为Ubuntu高手
- 经典的哲学家就餐问题
- 获取文件哈希值_Java 获得文件的指纹