用openssl库RSA加密解密
时间:2022-04-27
本文章向大家介绍用openssl库RSA加密解密,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 #include <stdio.h>
2 #include <openssl/rsa.h>
3 #include <openssl/pem.h>
4 #include <openssl/err.h>
5
6 //加密
7 int my_encrypt(const char *input, int input_len, char *output, int *output_len, const char *pri_key_fn)
8 {
9 RSA *p_rsa = NULL;
10 FILE *file = NULL;
11 int ret = 0;
12
13 if((file = fopen(pri_key_fn, "rb")) == NULL)
14 {
15 ret = -1;
16 goto End;
17 }
18
19 if((p_rsa = PEM_read_RSAPrivateKey(file, NULL,NULL,NULL )) == NULL)
20 {
21 ret = -2;
22 goto End;
23 }
24
25 if((*output_len = RSA_private_encrypt(input_len, (unsigned char*)input, (unsigned char*)output, p_rsa, RSA_PKCS1_PADDING)) < 0)
26 {
27 ret = -4;
28 goto End;
29 }
30
31 End:
32 if(p_rsa != NULL)
33 RSA_free(p_rsa);
34 if(file != NULL)
35 fclose(file);
36
37 return ret;
38 }
39
40 //解密
41 int my_decrypt(const char *input, int input_len, char *output, int *output_len, const char *pri_key_fn)
42 {
43 RSA *p_rsa = NULL;
44 FILE *file = NULL;
45 int ret = 0;
46
47 file = fopen(pri_key_fn, "rb");
48 if(!file)
49 {
50 ret = -1;
51 goto End;
52 }
53
54 if((p_rsa = PEM_read_RSA_PUBKEY(file, NULL,NULL,NULL )) == NULL)
55 {
56 ret = -2;
57 goto End;
58 }
59
60 if((*output_len=RSA_public_decrypt(input_len, (unsigned char*)input, (unsigned char*)output, p_rsa, RSA_PKCS1_PADDING)) < 0)
61 {
62 ret = -3;
63 goto End;
64 }
65 End:
66 if(p_rsa != NULL)
67 RSA_free(p_rsa);
68 if(file != NULL)
69 fclose(file);
70
71 return ret;
72 }
73
74 int main(int argc, char**argv)
75 {
76 char src[256];
77 char dst[256];
78 int src_len;
79 int dst_len;
80 int ret;
81 FILE *f;
82
83 src_len = fread(src, 1, 256, stdin);
84
85 if(argv[1][0] == 'e') {
86 ret = my_encrypt(src, src_len, dst, &dst_len, argv[2]);
87 }else {
88 ret = my_decrypt(src, src_len, dst, &dst_len, argv[2]);
89 }
90
91 if(ret) {
92 fprintf(stderr, "Errorn");
93 }
94 fwrite(dst,1,dst_len,stdout);
95 return ret;
96 }
以上是一个示例,测试了私钥加密(签名)/公钥解密(验证),main函数是一个测试
测试一下,先生成2048位公钥、私钥对
colin@colin-VirtualBox:/tmp$ openssl genrsa -out pri2048.pem 2048
Generating RSA private key, 2048 bit long modulus
................................+++
.............+++
e is 65537 (0x10001)
colin@colin-VirtualBox:/tmp$ openssl rsa -in pri2048.pem -pubout -out pub2048.pem
writing RSA key
编译、文件测试
colin@colin-VirtualBox:/tmp$ gcc t.c -lssl -lcrypto -lm
colin@colin-VirtualBox:/tmp$ ./a.out en pri2048.pem <data >data.en
colin@colin-VirtualBox:/tmp$ ./a.out enc pri2048.pem <data >data.en
colin@colin-VirtualBox:/tmp$ ./a.out dec pub2048.pem <data.en >data2
colin@colin-VirtualBox:/tmp$ openssl rsautl -verify -in data.en -inkey pub2048.pem -pubin -out data3
对比一下
colin@colin-VirtualBox:/tmp$ cmp data data2
colin@colin-VirtualBox:/tmp$ cmp data data3
colin@colin-VirtualBox:/tmp$ md5sum data data2 data3
7a71146998ad521bab336a49f65c90c4 data
7a71146998ad521bab336a49f65c90c4 data2
7a71146998ad521bab336a49f65c90c4 data3
公钥加密、私钥解密就不写了,对着看就会很明白了。
int RSA_public_encrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding); int RSA_private_encrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding); int RSA_public_decrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding); int RSA_private_decrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding);
- IntelliJ IDEA 之 HelloWorld 项目创建及相关配置文件介绍
- 设置 IntelliJ IDEA 主题和字体的方法
- 修改 IntelliJ IDEA 模板注释中的 user 内容
- Android仿京东、天猫商品详情页
- C# checked和unchecked运算符
- 迭代子模式
- WCF系列教程之WCF中的会话
- SortedList<TKey,TValue> 和 SortedDictionary<TKey,TValue>
- Spring Boot入门
- React Native在Android平台运行gif的解决方法
- WCF系列教程之WCF客户端异常处理
- 巧用Using跳过异常捕获
- Android WindowManager详解
- C# 委托进阶
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring Data REST不完全指南(二)
- Cocos2d-js中的简易MVC框架(三)中介者Mediator
- Cocos2d-js中的简易MVC框架(二)数据模型Model
- Python 还能实现图片去雾?FFA 去雾算法、暗通道去雾算法用起来! | 附代码
- 探秘计算机视觉中的注意力机制
- 采用 Vue 编写的功能强大的 Swagger-ui 页面
- Spring Data REST不完全指南(三)
- Spark Kafka 基于Direct自己管理offset
- 使用Reactor响应式编程
- 多场景下MySQL临时表的作用
- Flink 自定义触发器实现带超时时间的 CountWindow
- 聊聊Spring Boot Actuator
- [译]按功能(特性)分包
- Spring Boot Admin简介及实践
- Spring Boot Admin实现服务健康预警