专栏首页窗户用openssl库RSA加密解密

用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, "Error\n");
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);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 汉诺塔——各种编程范式的解决

      理解递归,汉诺塔(Tower of Hanoi)是个很适合的工具,不大不小,作为最开始递归的理解正合适。从而学习各种计算机语言乃至各种编程范式的时候,汉诺塔...

    窗户
  • Python下将一般对象打印成Json

      有的时候,我们写Python程序需要处理复杂对象,过程中调试可能需要去看看产生的对象如何,我们可以把它打印成json来看,这是个不错的办法。

    窗户
  • sed的粉丝

      UNIX/LINUX下有个工具叫sed,起源于ed命令,但没有人机交互,完全是脚本语言。sed虽然是结构化的程序,但其虚拟出来的机器与我们实际机器相差甚远,...

    窗户
  • rabbitmq-server的安装与升级

    rabbitmq和erlang的对应版本:https://www.rabbitmq.com/which-erlang.html rabbitmq-server...

    Johnson木木
  • centos8 使用yum 安装 rabbitmq的教程

    rabbitmq-plugins enable rabbitmq_management

    砸漏
  • CentOs7.3 搭建 RabbitMQ 3.6 单机多实例服务

    老七Linux
  • RabbitMQ 开发环境安装部署

    Fedora 和 RHEL库里面的RabbitQM已经不维护了,推荐选择Bintray。

    _淡定_
  • 自定义view实现超萌动感小炸弹

    Hello,小伙伴们,我回来了。这些日子有的小伙伴问我怎么没有更新了。这个其实是有原因,首先,最近有点忙。其次没有看到什么觉得好玩的动画!最后,就是我更新过了!...

    用户2802329
  • 微信小程序|简单易上手的画板功能

    大部分安卓用户的手机里是没有自带画板功能的,而在近期网课盛行之时,一个随手可用的手写面板,无论是在写笔记方面,还是在辅助授课方面,一个小画板就体现出了很大的作用...

    算法与编程之美
  • [PHP] 通用网关接口CGI 的运行原理

    CGI 的运行原理: 1.客户端访问某个 URL 地址之后,通过 GET/POST/PUT 等方式提交数据,并通过 HTTP 协议向 Web 服务器发出请求。 ...

    陶士涵

扫码关注云+社区

领取腾讯云代金券