当前位置: 首页 > news >正文

c语言中使用openssl对rsa私钥解密

单次加密数据的最大长度(block_len),由RSA秘钥模长RSA_size()和填充模式有关

  填充模式:RSA_PKCS1_PADDING, block_len=RSA_size() - 11填充模式:RSA_PKCS1_OAEP_PADDING,block_len=RSA_size() - 41填充模式:RSA_NO_PADDING(不填充),block_len=RSA_size()

本示例用RSA_PKCS1_PADDING填充,所以一次加密117字节,一次解密128字节,超过的字符需要循环解密。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/rsa.h>
#include<openssl/pem.h>
#include<openssl/err.h>
#include<openssl/bio.h>
#include<openssl/evp.h>char* prikey="-----BEGIN RSA PRIVATE KEY-----\n\
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGB\
ALr1s+g6od9C0Jj/a+oEhSUGLOoM8QwAJlTkVTLeKrvEtZCP\
4AQRvsmH7akOo86ja2o33qK+p54AFoKr0T0GaQP6NfsklipK\
N0azBIiwo/tTlwOJUjW3fLQMMNRX/9ZtIYMGSPIOL4FdYJhT\
oJC/dPZ1khaJvf7Oi0rxPuMNVekZAgMBAAECgYBWi9smi83X\
TlTGHqdUA5enFf7AshD73y3fanvOOm5J0bvDGfc3qwdIv7XS\
5sYJqDjXSNm1ONDbIWtKPkN0Hn2J3wDMKzECvvlc+Jb9n1Sm\
7HblKI5PqB3578lcYUQ0M1fIa4AbUBPruInAkAOwuUWvfzmt\
gVky19BXDZNnS+UmAQJBAP389aYz/NfKMSvEq7zht8IQsqXA\
VQinoRLWGTg8uWTd6OZktuBxm9qQDSugIHQlS99PZrSL2xXf\
45bfYKWq7nkCQQC8cNJ+MBr787VmaHdaUK7K32S5NtgJ3g1O\
Nyuzuwi3fj/+PDxB2SMOSWMX5j10N2iGSQ9ctVpXlfaVtQPw\
LaehAkEAvyyU9enxqbct9aTOI5i+SNtqrGotVxtdmSD/0J2c\
ajjB4hDyudOpnQSKdUjMxL+B8W8Bfmo6mKdx1hEC3Q/g+QJB\
AKAlvi5yEazInQTwiWafJT3TBxYFTytrpKExcBmqPak8SYR2\
irtnn0xYADhiex3WrSVa2AxxL9s53ruygCtRkaECQCUkMs3i\
e2OUKa8MQBhup7cbhXiSunO354Xnc4ddjbgPLwW7tGoWEezi\
jNsiJ6XBSMcx6zifs1ybCbeDvdaT/Jo=\
\n-----END RSA PRIVATE KEY-----\n";typedef struct{unsigned char *data; //解密数据int len;            //解密数据长度
}decrypt_data_t;static void crypt_rsa_decrypt(unsigned char *endata,int enlen,decrypt_data_t *out_data){RSA *rsa;BIO *bio;if((bio = BIO_new_mem_buf(prikey, -1)) == NULL)       //从字符串读取RSA公钥{printf("BIO_new_mem_buf failed!\n");}if((rsa=PEM_read_bio_RSAPrivateKey(bio,NULL,NULL,NULL))==NULL){printf("PEM_read_bio_RSAPrivateKey failed!");}int key_len = RSA_size(rsa);int ret=0,pos=0;int blocklen = 128;out_data->data = (unsigned char *)malloc(enlen+1);memset(out_data->data,0,enlen+1);unsigned char *sub_str = (unsigned char *)malloc(key_len+1);unsigned char *out_str = (unsigned char *)malloc(key_len+1);memset(sub_str,0,key_len+1);memset(out_str,0,key_len+1);while(enlen-pos >0){if(enlen-pos >blocklen){memset(sub_str,0,key_len+1);memcpy(sub_str,endata+pos,blocklen);ret = RSA_private_decrypt(blocklen,(unsigned char *)sub_str,(unsigned char*)out_str,rsa,RSA_PKCS1_PADDING);printf("RSA_private_decrypt ret:%d\n",ret);pos +=blocklen;if(ret >0){								memcpy(out_data->data+out_data->len,out_str,ret);out_data->len += ret;}}else{				memset(sub_str,0,key_len+1);memcpy(sub_str,endata+pos,enlen-pos);ret = RSA_private_decrypt(enlen-pos,(unsigned char *)sub_str,(unsigned char*)out_str,rsa,RSA_PKCS1_PADDING);printf("RSA_private_decrypt ret:%d\n",ret);pos = enlen;if(ret >0){								memcpy(out_data->data+out_data->len,out_str,ret);out_data->len += ret;}		}}if(sub_str){free(sub_str);sub_str = NULL;}if(out_str){free(out_str);out_str = NULL;}RSA_free(rsa);BIO_free_all(bio);}
http://www.lryc.cn/news/240165.html

相关文章:

  • mysql中数据是如何被用B+树查询到的
  • Redisson 分布式锁的最佳实践
  • ArkTS声明式开发范式
  • 史诗级云故障敲响警钟,应用保障不能没有“连续键”!
  • SSH连接远程服务器报错:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 解决方法
  • 数据库——查询连续的月份
  • git代码提交命令(如何提交代码)
  • jmeter中调用python代码
  • 当当网获得dangdang商品详情商品列表API 测试请求入口
  • git如何查看配置,修改配置,设置配置
  • 交通流合成数据生成原理及实现代码
  • leetcode 240. 搜索二维矩阵 II
  • a标签超链接 —— 实现点击前中后变色
  • 【好玩的开源项目】Linux系统之部署proxx扫清黑洞小游戏
  • IDEA-SVN合并分支到主干
  • kettle如何写日志
  • 新能源车将突破2000万辆,汉威科技为电池安全保驾护航
  • 基于文心一言AI大模型,编写一段python3程序以获取华为分布式块存储REST接口的实时数据
  • 2022-4-11 南科大现代控制与最优估计
  • 【注册Huggingface】获取token
  • 【蓝桥杯软件赛 零基础备赛20周】第4周——简单模拟1
  • 使用OpenCV将图像转换为NV12格式并加载NV12数据
  • 【Lodash】 Filter 与Map 的结合使用
  • python命令行 引导用户填写可用的ip地址和端口号
  • 【小黑送书—第九期】>>重磅!这本30w人都在看的Python数据分析畅销书:更新了!
  • 关于APP备案的通知以及APP备案的常见问题
  • iOS 17.0 YYText 崩溃处理
  • 微信小程序面试题【100道】
  • 【nlp】2.8 注意力机制拓展
  • mysql 存储引擎ROWS与实际行数不一致