博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
openssl C语言编码实现rsa加密
阅读量:6896 次
发布时间:2019-06-27

本文共 4174 字,大约阅读时间需要 13 分钟。

非原创, 引用自:  1 CC=gcc 2 CPPFLAGS= -I /home/yyx/02/openssl-1.0.1t/include/ 3 CFLAGS=-Wall -g 4 LIBPATH = -L /usr/lib 5 LIBS= -lssl -lcrypto -lhiredis -lm 6  7  8 #找到当前目录下所有的.c文件 9 src = $(wildcard ./src/*.c)10 11 #将当前目录下所有的.c  转换成.o给obj12 obj = $(patsubst %.c, %.o, $(src))13 14 rsa = test_rsa15 16 target = $(rsa)17 18 ALL:$(target)19     20 #生成所有的.o文件21 $(obj):%.o:%.c22     $(CC) -c $< -o $@ $(CPPFLAGS) $(LIBPATH) $(LIBS) $(CFLAGS) 23     24 #test_rsa程序25 $(rsa):./src/test.o  26     $(CC) $^ -o $@ $(CPPFLAGS)  $(LIBPATH) $(LIBS) $(CFLAGS)    27  28  29 #clean指令30 31 clean:32     -rm -rf $(obj) $(target) ./test/*.o33 34 #将clean目标 改成一个虚拟符号
35 .PHONY: clean ALL

 

1.上述makefile; 用来下面编译的 加密程序。

2.首先介绍下命令台下openssl工具的简单使用:

  1)生成一个密钥:

  openssl genrsa -out test.key 1024

  这里-out指定生成文件的。需要注意的是这个文件包含了公钥和密钥两部分,也就是说这个文件即可用来加密也可以用来解密。后面的1024是生成密钥的长度。

  2)openssl可以将这个文件中的公钥提取出来:

  openssl rsa -in test.key -pubout -out test_pub.key

  -in指定输入文件,-out指定提取生成公钥的文件名。至此,我们手上就有了一个公钥,一个私钥(包含公钥)。现在可以将用公钥来加密文件了。

  

  3)在目录中创建一个hello的文本文件,然后利用此前生成的公钥加密文件

  openssl rsautl -encrypt -in hello -inkey test_pub.key -pubin -out hello.en

   -in指定要加密的文件,-inkey指定密钥,-pubin表明是用纯公钥文件加密,-out为加密后的文件。

  4)解密文件:

  openssl rsautl -decrypt -in hello.en -inkey test.key -out hello.de

  -in指定被加密的文件,-inkey指定私钥文件,-out为解密后的文件。

   至此,一次加密解密的过程告终。

 

3. 采用 API 进行加密

1 //  RSA 加密 ///  2   3 #include 
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 11 12 13 #define OPENSSLKEY "test.key" 14 #define PUBLICKEY "test_pub.key" 15 #define BUFFSIZE 1024 16 17 char *my_encrypt(char *str, char *path_key); //加密 18 char *my_decrypt(char *str, char *path_key); //解密 19 20 int main(void) 21 { 22 char *source = "i like dancing !!!"; 23 24 char *ptf_en, *ptf_de; 25 26 printf("source is :%s\n", source); 27 28 //1.加密 29 ptf_en = my_encrypt(source, PUBLICKEY); 30 printf("ptf_en is :%s\n", ptf_en); 31 32 //2.解密 33 ptf_de = my_decrypt(ptf_en, OPENSSLKEY); 34 printf("ptf_de is :%s\n", ptf_de); 35 36 if(ptf_en) free(ptf_en); 37 if(ptf_de) free(ptf_de); 38 39 return 0; 40 41 } 42 43 //加密 44 char *my_encrypt(char *str, char *path_key) 45 { 46 char *p_en = NULL; 47 RSA *p_rsa = NULL; 48 FILE *file = NULL; 49 50 int rsa_len = 0; //flen为源文件长度, rsa_len为秘钥长度 51 52 //1.打开秘钥文件 53 if((file = fopen(path_key, "rb")) == NULL) 54 { 55 perror("fopen() error 111111111 "); 56 goto End; 57 } 58 59 //2.从公钥中获取 加密的秘钥 60 if((p_rsa = PEM_read_RSA_PUBKEY(file, NULL,NULL,NULL )) == NULL) 61 { 62 ERR_print_errors_fp(stdout); 63 goto End; 64 } 65 66 //3.获取秘钥的长度 67 rsa_len = RSA_size(p_rsa); 68 69 //4.为加密后的内容 申请空间(根据秘钥的长度+1) 70 p_en = (char *)malloc(rsa_len + 1); 71 if(!p_en) 72 { 73 perror("malloc() error 2222222222"); 74 goto End; 75 } 76 memset(p_en, 0, rsa_len + 1); 77 78 //5.对内容进行加密 79 if(RSA_public_encrypt(rsa_len, (unsigned char*)str, (unsigned char*)p_en, p_rsa, RSA_NO_PADDING) < 0) 80 { 81 perror("RSA_public_encrypt() error 2222222222"); 82 goto End; 83 } 84 85 End: 86 87 //6.释放秘钥空间, 关闭文件 88 if(p_rsa) RSA_free(p_rsa); 89 if(file) fclose(file); 90 91 return p_en; 92 } 93 94 //解密 95 char *my_decrypt(char *str, char *path_key) 96 { 97 char *p_de = NULL; 98 RSA *p_rsa = NULL; 99 FILE *file = NULL;100 int rsa_len = 0;101 102 103 //1.打开秘钥文件104 file = fopen(path_key, "rb");105 if(!file)106 {107 perror("fopen() error 22222222222");108 goto End;109 } 110 111 //2.从私钥中获取 解密的秘钥112 if((p_rsa = PEM_read_RSAPrivateKey(file, NULL,NULL,NULL )) == NULL)113 {114 ERR_print_errors_fp(stdout);115 goto End;116 }117 118 //3.获取秘钥的长度,119 rsa_len = RSA_size(p_rsa);120 121 //4.为加密后的内容 申请空间(根据秘钥的长度+1)122 p_de = (char *)malloc(rsa_len + 1);123 if(!p_de)124 {125 perror("malloc() error ");126 goto End;127 } 128 memset(p_de, 0, rsa_len + 1);129 130 //5.对内容进行加密131 if(RSA_private_decrypt(rsa_len, (unsigned char*)str, (unsigned char*)p_de, p_rsa, RSA_NO_PADDING) < 0)132 {133 perror("RSA_public_encrypt() error ");134 goto End;135 }136 137 End:138 //6.释放秘钥空间, 关闭文件139 if(p_rsa) RSA_free(p_rsa);140 if(file) fclose(file);141 142 return p_de;143 }

 

转载于:https://www.cnblogs.com/yyx1-1/p/6114858.html

你可能感兴趣的文章
数字3为分隔
查看>>
华章11-12月份新书简介(2017年)
查看>>
第三周作业
查看>>
Vector、ArrayList、List使用深入剖析
查看>>
【调试】Core Dump是什么?Linux下如何正确永久开启?
查看>>
新浪微博API授权
查看>>
电子政务网中信息共享机制的重要性
查看>>
【Visual C++】游戏开发笔记十四 游戏画面绘图(四) 华丽的CImage类
查看>>
Struts2的配置
查看>>
[BZOJ1296][SCOI2009]粉刷匠(DP)
查看>>
Executor执行框架
查看>>
[FMX] Android APP 启动黑屏优化补丁
查看>>
常用JavaScript的高级技巧
查看>>
bzoj 1670: [Usaco2006 Oct]Building the Moat护城河的挖掘
查看>>
mac编辑器vim美化
查看>>
MD5摘要算法简析
查看>>
《30天自制操作系统》学习笔记一
查看>>
Python.tornado.2.tornado.options
查看>>
mysql关于or的索引问题
查看>>
装在u盘的linux
查看>>