linux下Openssl RSA加密解密实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、生成秘钥文件
openssl genrsa -out secret.key 1024
openssl genrsa是生成密钥的命令,-out是指定所生成的密钥文件,secret.key这个文件里包含了公钥和密钥两部分,就是说这个文件即可用来加密也可以用来解密,如果想分开也可以用下面的命令将公钥导出。命令中的1024是指生成的密钥的长度。
2、将公钥导出
openssl rsa -in secret.key -pubout -out secret_pub.key
将公钥从secret.key中导出,-in指定输入文件,-out指定提取生成公钥的文件名。这样我们就有了一个公钥和一个私钥(包含公钥)。下面我们就可以用公钥来加密文件了。
3.
下面是一个用C实现的OpenSSL RSA加密的程序,程序实现的是公钥加密,私钥解密的过程,当然也可以实现私钥加密,公钥解密,大家可以根据程序后面的函数解释来进行各种更改。
下面将通过第一部分生成的加密文件中的公钥secret_pub.key来实现对字符串的加密,用密钥文件secret.key来实现字符串的解密,程序已经经过编译运行,可以直接实验、运行。
myRSA.h:
1 #ifndef _MY_RSA_H_
2 #define _MY_RSA_H_
3
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10
11 #define BUFFSIZE 1024
12 #define PUBLICKEY “secret_pub.key”
13 #define OPENSSLKEY “secret.key”
14
15 char* my_EncryptFunc(char *str,char *path_key); //加密函数
16 char* my_DecryptFunc(char *str,char *path_key); //解密函数
17
18
19 #endif
myRSA.c:
1 #include “myRSA.h”
2
3
4 int main(void)
5 {
6 char *p_Src = (char *)”This is my test !”;
7 char *p_EnStr,*p_DeStr;
8
9 printf(“Source is : [%s]\n”,p_Src);
10
11 p_EnStr = my_EncryptFunc(p_Src, PUBLICKEY);
12 printf(“Encryption : [%s]\n”,p_EnStr);
13
14 p_DeStr = my_DecryptFunc(p_EnStr, OPENSSLKEY);
15 printf(“Decryption : [%s]\n”,p_DeStr);
16
17 if(p_EnStr!=NULL)
18 {
19 free(p_EnStr);
20 }
21 if(p_DeStr!=NULL)
22 {
23 free(p_DeStr);
24 }
25
26 return 0;
27 }
28
29
30 char *my_EncryptFunc(char *str,char *path_key)
31 {
32 RSA *p_Rsa;
33 char *p_En;
34 FILE *file;
35 int rsa_len;
36
37 if((file=fop en(path_key,”r”))==NULL)
38 {
39 perror(“open key file error”);
40 return NULL;
41 }
42
43
44 #ifndef RSA_NEW
45
46 if((p_Rsa=PEM_read_RSA_PUBKEY(file,NULL,NULL,NULL))==N ULL)
47 {
48 ERR_print_errors_fp(stdout);
49 return NULL;
50 }
51 else
52 {
53 printf(“PEM read success!\n”);
54 }
55
56 #else
57
58 p_Rsa = RSA_new();
59 if(PEM_read_RSA_PUBKEY(file, &p_Rsa, 0, 0) == NULL)
60 {
61 return NULL;
62 }
63 else
64 {
65 printf(“PEM read new success\n”);
66 }
67
68 #endif
69
70 rsa_len=RSA_size(p_Rsa);
71
72 p_En = (char *)malloc(rsa_len+1);
73 memset(p_En,0,rsa_len+1);
74
75 if(RSA_public_encrypt(rsa_len, (unsigned char *)str, (unsigned char*)p_En, p_Rsa, RSA_NO_PADDING) < 0)
76 {
77 return NULL;
78 }
79
80 RSA_free(p_Rsa);