openssl是一个功能强大的工具包,它集成了众多密码算法及实用工具。我们即可以利用它提供的命令台工具生成密钥、证书来加密解密文件,也可以在利用其提供的API接口在代码中对传输信息进行加密。

RSA是一个非对称加密算法。简单说来,非对称加密算法就是说加密解密一个文件需要有两个密钥,一个用来加密,为公钥,一个用来解密,为私钥。证书可以用来授权公钥的使用。

今天小研究了下openssl的rsa加密,其中主要涉及利用公钥和密钥加解密文件,没有涉及对证书的操作。想要集体了解的可以去:

http://www.openssl.org/

http://blog.csdn.net/jiangsq12345/article/details/6066275

---------------------------------------------------------------------------------------------------------------------

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

生成一个密钥:

openssl genrsa -out test.key 1024

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

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

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

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

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

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

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

解密文件:

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

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

至此,一次加密解密的过程告终。在实际使用中还可能包括证书,这个以后有机会再说~

-------------------------------------------------------------------------------------------------------------------
下来介绍下在程序如何利用之前生成的test.key和test_pub.key来进行信息的加密与解密(当然也可以直接利用openssl的API来生成密钥文件)。

下面是一个例子,这个例子利用已有的密钥来对source字符串进行加密与解密:

 1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include<openssl/rsa.h>
5 #include<openssl/pem.h>
6 #include<openssl/err.h>
7 #define OPENSSLKEY "test.key"
8 #define PUBLICKEY "test_pub.key"
9 #define BUFFSIZE 1024
10 char* my_encrypt(char *str,char *path_key);//加密
11 char* my_decrypt(char *str,char *path_key);//解密
12 int main(void){
13 char *source="i like dancing !";
14 char *ptr_en,*ptr_de;
15 printf("source is :%s\n",source);
16 ptr_en=my_encrypt(source,PUBLICKEY);
17 printf("after encrypt:%s\n",ptr_en);
18 ptr_de=my_decrypt(ptr_en,OPENSSLKEY);
19 printf("after decrypt:%s\n",ptr_de);
20 if(ptr_en!=NULL){
21 free(ptr_en);
22 }
23 if(ptr_de!=NULL){
24 free(ptr_de);
25 }
26 return 0;
27 }
28 char *my_encrypt(char *str,char *path_key){
29 char *p_en;
30 RSA *p_rsa;
31 FILE *file;
32 int flen,rsa_len;
33 if((file=fopen(path_key,"r"))==NULL){
34 perror("open key file error");
35 return NULL;
36 }
37 if((p_rsa=PEM_read_RSA_PUBKEY(file,NULL,NULL,NULL))==NULL){
38 //if((p_rsa=PEM_read_RSAPublicKey(file,NULL,NULL,NULL))==NULL){ 换成这句死活通不过,无论是否将公钥分离源文件
39 ERR_print_errors_fp(stdout);
40 return NULL;
41 }
42 flen=strlen(str);
43 rsa_len=RSA_size(p_rsa);
44 p_en=(unsigned char *)malloc(rsa_len+1);
45 memset(p_en,0,rsa_len+1);
46 if(RSA_public_encrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_en,p_rsa,RSA_NO_PADDING)<0){
47 return NULL;
48 }
49 RSA_free(p_rsa);
50 fclose(file);
51 return p_en;
52 }
53 char *my_decrypt(char *str,char *path_key){
54 char *p_de;
55 RSA *p_rsa;
56 FILE *file;
57 int rsa_len;
58 if((file=fopen(path_key,"r"))==NULL){
59 perror("open key file error");
60 return NULL;
61 }
62 if((p_rsa=PEM_read_RSAPrivateKey(file,NULL,NULL,NULL))==NULL){
63 ERR_print_errors_fp(stdout);
64 return NULL;
65 }
66 rsa_len=RSA_size(p_rsa);
67 p_de=(unsigned char *)malloc(rsa_len+1);
68 memset(p_de,0,rsa_len+1);
69 if(RSA_private_decrypt(rsa_len,(unsigned char *)str,(unsigned char*)p_de,p_rsa,RSA_NO_PADDING)<0){
70 return NULL;
71 }
72 RSA_free(p_rsa);
73 fclose(file);
74 return p_de;
75 }

一个比较奇怪的问题:

37、38行中为从文件中获取密钥,发现如果使用openssl提供的PEM_read_RSAPublicKey方法会一直失败。

估计是文件格式的问题~

利用openssl进行RSA加密解密的更多相关文章

  1. openssl evp RSA 加密解密

    openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...

  2. OpenSSL 中 RSA 加密解密实现源代码分析

    1.RSA 公钥和私钥的组成.以及加密和解密的公式: 2.模指数运算: 先做指数运算,再做模运算.如 5^3 mod 7 = 125 mod 7 = 6 3.RSA加密算法流程: 选择一对不同的.而且 ...

  3. 利用RSACryptoServiceProvider进行RSA加密解密

    前言: 本文只介绍How to use,对于加密算法的研究不予讨论. 关于私钥的存储,微软给的建议是使用windows自带的秘钥容器,相见文档. 为了直观看到私钥和公钥,本文直接将其存入XML文件中. ...

  4. 用openssl库RSA加密解密

    #include <stdio.h> #include <openssl/rsa.h> #include <openssl/pem.h> #include < ...

  5. jsencrypt代码分析——openssl的rsa加密解密在js的实现

    在js上做rsa,感觉jsencrypt这个是封装的比较好的,但用起来还是遇到了些坑,所以踩进代码里填填坑- 项目在这里 https://github.com/travist/jsencrypt [r ...

  6. 利用Openssl进行RSA加密签名算法

    加密(签名)的过程是(M的e次方)mod n,在这里我们把消息M假定为一个数字,但实际上消息一般为字符串,所以必须有一个将字符串转化为数字的规则,并且要让这个数字的大小和n相当(也不能比 n大).这样 ...

  7. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  8. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  9. Cryptopp iOS 使用 RSA加密解密和签名验证签名

    Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...

随机推荐

  1. SpringMVC日期参数自动绑定

    Controller: @RequestMapping("/addUser") public String addUser(User user) { ... } Model: pu ...

  2. 高级C++开发工程师综合测试题(风林火山)

    题目要求:代码要求能够直接编译运行 1.       请实现一个函数:凑14:输入很多个整数(1<=数值<=13),任意两个数相加等于14就可以从数组中删除这两个数,求剩余数(按由小到大排 ...

  3. HDU 2199 Can you solve this equation? (二分 水题)

    Can you solve this equation? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  4. Swift基本语法以及与OC的比较

    一.注释: 1.单行注释和OC一致. 2.块注释中有与OC不同点:可以嵌套注释 二.常量和变量: 1.常量:初始化后可读不可写 let 2.变量:初始化后可读可写 var //不需要指定类型,系统会自 ...

  5. iOS开发-分页栏和选取器的使用

    一.分页栏 创建一个新的项目,Subclass of的值选中UIViewController,然后在storyboard中删除根视图,在右下方拖出一个Tab Bar Controller 新增分页,只 ...

  6. ubuntu下查看文件md5

    终端输入md5sum --help: md5sum --help用法:md5sum [选项]... [文件]...显示或检查 MD5(128-bit) 校验和.若没有文件选项,或者文件处为" ...

  7. sqlninja 说明 (转)

    首先来介绍一下sqlninja的优点. 一个专门针对Microsoft SQL Server的sql注入工具 可找到远程SQL服务器的标志和特征(版本.用户执行的查询.用户特权.xp_cmdshell ...

  8. Struts1中ActionForward的技巧介绍

    ActionForward是做什么的?他是用来封装转发和重定向路径的. 在struts- config.xml中<forward name="error" path=&quo ...

  9. [Webpack] Use the Webpack Dashboard to Monitor Webpack Operations

    Learn how to use the new Webpack Dashboard from Formidable Labs to display a pretty, useful output f ...

  10. iOS开发——数据持久化Swift篇&SettingBundle

    SettingBundle import UIKit class ViewController: UIViewController { var userDefault = NSUserDefaults ...