Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用openssl库RSA加密解密

用openssl库RSA加密解密

作者头像
窗户
发布于 2018-02-07 06:36:53
发布于 2018-02-07 06:36:53
3.6K00
代码可运行
举报
文章被收录于专栏:窗户窗户
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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位公钥、私钥对

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

编译、文件测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

对比一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-09-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
20.2 OpenSSL 非对称RSA加解密算法
RSA算法是一种非对称加密算法,由三位数学家Rivest、Shamir和Adleman共同发明,以他们三人的名字首字母命名。RSA算法的安全性基于大数分解问题,即对于一个非常大的合数,将其分解为两个质数的乘积是非常困难的。
王瑞MVP
2023/10/29
5130
20.2 OpenSSL 非对称RSA加解密算法
20.6 OpenSSL 套接字分发RSA公钥
通过上一节的学习读者应该能够更好的理解RSA加密算法在套接字传输中的使用技巧,但上述代码其实并不算完美的,因为我们的公钥和私钥都必须存储在本地文本中且公钥与私钥是固定的无法做到更好的保护效果,而一旦公钥与私钥泄密则整个传输流程都将会变得不安全,最好的保护效果是RSA密钥在每次通信时都进行变换,依次来实现随机密钥对的功能。
王瑞MVP
2023/11/04
2200
20.6 OpenSSL 套接字分发RSA公钥
OpenSSL - RSA非对称加密实现
非对称加密:即两端使用一对不同的密钥进行加密。 在非对称加密中,需要两对密钥,公钥和私钥。 公钥个私钥属于对立关系,一把加密后,只有另一把才可以进行解密。 公钥数据加密 数字证书内包含了公钥,在进行会话连接时,双方交换各自的公钥,保留自己的私钥。进行数据传输时,利用对方的公钥进行数据加密。加密后的数据只有对方的私钥才能进行解密。 私钥数字签名 私钥进行数据加密,所有人用公钥都能解密数据,但是加密后的数据却唯有私钥能生成。可以用于消息来源验证。将数据用私钥加密并明文告诉用户密文内容,用户进行公钥
Aichen
2018/05/18
3.2K0
20.5 OpenSSL 套接字RSA加密传输
RSA算法同样可以用于加密传输,但此类加密算法虽然非常安全,但通常不会用于大量的数据传输,这是因为RSA算法加解密过程涉及大量的数学运算,尤其是模幂运算(即计算大数的幂模运算),这些运算对于计算机而言是十分耗时。
王瑞MVP
2023/11/04
4110
20.5 OpenSSL 套接字RSA加密传输
【C 语言】文件操作 ( 文件加密解密 | 解密文件 )
个文件 , 一个是原始文件 , 一个是加密后的文件 , 将原始文件进行加密 , 然后将加密后的数据输出到加密文件中 ;
韩曙亮
2023/03/30
9.6K0
RSA加密解密(无数据大小限制,php、go、java互通实现)
RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题。明文长度需要小于密钥长度,而密文长度则等于密钥长度。因此当加密内容长度大于密钥长度时,有效的RSA加解密就需要对内容进行分段。
双鬼带单
2019/07/30
5K0
java与openssl的rsa算法互
说明    1.java生成的公私钥格式为 pkcs8, 而openssl默认生成的公私钥格式为 pkcs1,两者的密钥实际上是不能直接互用的     2.java采用的rsa默认补齐方式是pkcs1, 因此互用的时候需要将openssl中的补齐方式设置为RSA_PKCS1_PADDING     3.rsa加密中,加密数据长度有限制,不能超过密钥长度-11, 如密钥为1024位,则最长的加密数据位117字节; 加密后的密文长度总是为密钥的一半,即1024位的密文为512位 RSA加密常用的填充方式有下
一灰灰blog
2018/02/06
4.2K0
【C 语言】文件操作 ( 文件加密解密 | 加密文件 )
个文件 , 一个是原始文件 , 一个是加密后的文件 , 将原始文件进行加密 , 然后将加密后的数据输出到加密文件中 ;
韩曙亮
2023/03/30
10.1K0
OpenSSL 使用AES对文件加解密
AES(Advanced Encryption Standard)是一种对称加密算法,它是目前广泛使用的加密算法之一。AES算法是由美国国家标准与技术研究院(NIST)于2001年发布的,它取代了原先的DES(Data Encryption Standard)算法,成为新的标准。AES是一种对称加密算法,意味着加密和解密使用相同的密钥。这就要求密钥的安全性非常重要,因为任何拥有密钥的人都能进行加密和解密操作。其密钥长度,包括128位、192位和256位。不同长度的密钥提供了不同级别的安全性,通常更长的密钥长度意味着更高的安全性。
王瑞MVP
2023/11/29
1.8K0
OpenSSL 使用AES对文件加解密
RSA der加密 p12解密以及配合AES使用详解
在前面的文章中我有说过AES和RSA这两种加密方式,正好在前段时间再项目中有使用到,在这里再把这两种加密方式综合在一起写一下,具体到他们的使用,以及RSA各种加密文件的生成。
Mr.RisingSun
2019/08/14
2.3K0
RSA der加密 p12解密以及配合AES使用详解
编写 Nginx 模块进行 RSA 加解密
在《Nginx 模块系统:前篇》一文中,曾提过要展开聊聊如何编写和编译一个 Nginx 模块。
soulteary
2021/08/16
2K0
编写 Nginx 模块进行 RSA 加解密
python使用RSA加密算法
上一篇文章介绍了RSA加密原理以及自己的一些理解,现在我们就来实际操作一下,使用python语言如何来实现RSA的加密—解密—签名—验签这一系列过程。
全栈程序员站长
2022/08/20
2.7K0
Golang:加密解密算法
在项目开发过程中,当操作一些用户的隐私信息,诸如密码,帐户密钥等数据时,往往需要加密后可以在网上传输.这时,需要一些高效地,简单易用的加密算法加密数据,然后把加密后的数据存入数据库或进行其他操作;当需要读取数据时,把加密后的数据取出来,再通过算法解密.
OwenZhang
2021/12/08
1.8K0
Golang:加密解密算法
iOS中使用RSA加密与解密
通常我们使用iOS的RSA加密或者解密时候,有如下几种情况(这里只讨论使用公钥加密的情况):
conanma
2021/11/04
4.8K0
RSA密文过长加密解密 越过1024的解决代码
RSA (详见维基百科)算法是现今使用最广泛的公钥密码算法,也是号称地球上最安全的加密算法,与 md5 和 sha1 不同,到目前为止,也只有极短的RSA加密被破解。
Tinywan
2019/07/16
5.1K0
[Linux] 使用openssl实现RSA非对称加密
参数:genrsa 生成密钥 -out 输出到文件 rsa_private_key.pem 文件名 1024 长度
唯一Chat
2019/09/11
3.6K0
全志R128 SDK HAL 模块开发指南——Crypto Engine
CE 驱动位于 source/drivers/hal/source/ce/ 目录下。
阿志小管家
2024/03/22
1660
【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )
拷贝头文件与函数库到 代理 Application 依赖库中 , 拷贝到 src/main/cpp 目录下即可 ;
韩曙亮
2023/03/28
6260
【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )
一款实用的.NET Core加密解密工具类库
在我们日常开发工作中,为了数据安全问题对数据加密、解密是必不可少的。加密方式有很多种如常见的AES,RSA,MD5,SAH1,SAH256,DES等,这时候假如我们有一个封装的对应加密解密工具类可以直接调用,那这样可以节省不少的开发时间。今天推荐一款实用的.NET Core加密解密工具类库:NETCore.Encrypt。
追逐时光者
2023/11/20
3340
一款实用的.NET Core加密解密工具类库
C语言实例_文件内容加密与解密
(1)保护数据安全:加密可以将文件内容转化为不可读或难以理解的形式,防止未经授权的人员获取敏感信息。只有拥有正确解密密钥的人员才能还原出可读的文件内容。这样可以有效地防止数据泄露、窃取或篡改,保护用户的隐私和机密信息。
DS小龙哥
2023/08/27
9720
C语言实例_文件内容加密与解密
相关推荐
20.2 OpenSSL 非对称RSA加解密算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验