非原创, 引用自:
1 CC=gcc
CPPFLAGS= -I /home/yyx//openssl-1.0.1t/include/
CFLAGS=-Wall -g
LIBPATH = -L /usr/lib
LIBS= -lssl -lcrypto -lhiredis -lm #找到当前目录下所有的.c文件
src = $(wildcard ./src/*.c) #将当前目录下所有的.c 转换成.o给obj
obj = $(patsubst %.c, %.o, $(src)) rsa = test_rsa target = $(rsa) ALL:$(target) #生成所有的.o文件
$(obj):%.o:%.c
$(CC) -c $< -o $@ $(CPPFLAGS) $(LIBPATH) $(LIBS) $(CFLAGS) #test_rsa程序
$(rsa):./src/test.o
$(CC) $^ -o $@ $(CPPFLAGS) $(LIBPATH) $(LIBS) $(CFLAGS) #clean指令 clean:
-rm -rf $(obj) $(target) ./test/*.o #将clean目标 改成一个虚拟符号
 .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 进行加密

 //  RSA 加密 ///

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h> #define OPENSSLKEY "test.key"
#define PUBLICKEY "test_pub.key"
#define BUFFSIZE 1024 char *my_encrypt(char *str, char *path_key); //加密
char *my_decrypt(char *str, char *path_key); //解密 int main(void)
{
char *source = "i like dancing !!!"; char *ptf_en, *ptf_de; printf("source is :%s\n", source); //1.加密
ptf_en = my_encrypt(source, PUBLICKEY);
printf("ptf_en is :%s\n", ptf_en); //2.解密
ptf_de = my_decrypt(ptf_en, OPENSSLKEY);
printf("ptf_de is :%s\n", ptf_de); if(ptf_en) free(ptf_en);
if(ptf_de) free(ptf_de); return ; } //加密
char *my_encrypt(char *str, char *path_key)
{
char *p_en = NULL;
RSA *p_rsa = NULL;
FILE *file = NULL; int rsa_len = ; //flen为源文件长度, rsa_len为秘钥长度 //1.打开秘钥文件
if((file = fopen(path_key, "rb")) == NULL)
{
perror("fopen() error 111111111 ");
goto End;
} //2.从公钥中获取 加密的秘钥
if((p_rsa = PEM_read_RSA_PUBKEY(file, NULL,NULL,NULL )) == NULL)
{
ERR_print_errors_fp(stdout);
goto End;
} //3.获取秘钥的长度
rsa_len = RSA_size(p_rsa); //4.为加密后的内容 申请空间(根据秘钥的长度+1)
p_en = (char *)malloc(rsa_len + );
if(!p_en)
{
perror("malloc() error 2222222222");
goto End;
}
memset(p_en, , rsa_len + ); //5.对内容进行加密
if(RSA_public_encrypt(rsa_len, (unsigned char*)str, (unsigned char*)p_en, p_rsa, RSA_NO_PADDING) < )
{
perror("RSA_public_encrypt() error 2222222222");
goto End;
} End: //6.释放秘钥空间, 关闭文件
if(p_rsa) RSA_free(p_rsa);
if(file) fclose(file); return p_en;
} //解密
char *my_decrypt(char *str, char *path_key)
{
char *p_de = NULL;
RSA *p_rsa = NULL;
FILE *file = NULL;
int rsa_len = ; //1.打开秘钥文件
file = fopen(path_key, "rb");
if(!file)
{
perror("fopen() error 22222222222");
goto End;
} //2.从私钥中获取 解密的秘钥
if((p_rsa = PEM_read_RSAPrivateKey(file, NULL,NULL,NULL )) == NULL)
{
ERR_print_errors_fp(stdout);
goto End;
} //3.获取秘钥的长度,
rsa_len = RSA_size(p_rsa); //4.为加密后的内容 申请空间(根据秘钥的长度+1)
p_de = (char *)malloc(rsa_len + );
if(!p_de)
{
perror("malloc() error ");
goto End;
}
memset(p_de, , rsa_len + ); //5.对内容进行加密
if(RSA_private_decrypt(rsa_len, (unsigned char*)str, (unsigned char*)p_de, p_rsa, RSA_NO_PADDING) < )
{
perror("RSA_public_encrypt() error ");
goto End;
} End:
//6.释放秘钥空间, 关闭文件
if(p_rsa) RSA_free(p_rsa);
if(file) fclose(file); return p_de;
}

openssl C语言编码实现rsa加密的更多相关文章

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

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

  2. openssl在多平台和多语言之间进行RSA加解密注意事项

    首先说一下平台和语言: 系统平台为CentOS6.3,RSA加解密时使用NOPADDING进行填充 1)使用C/C++调用系统自带的openssl 2)Android4.2模拟器,第三方openssl ...

  3. C++ 使用openssl库实现 DES 加密——CBC模式 && RSA加密——公加私解——私加公解

    之前工作上需要用C++把软件生成的用户序列号用des加密cbc的模式,加密后为二进制,转化为十六进制,然后提供给java写的授权码管理平台. java平台会根据用户序列号,生成一个授权码,授权码是用r ...

  4. 基于OpenSSL的RSA加密应用(非算法)

    基于OpenSSL的RSA加密应用(非算法) iOS开发中的小伙伴应该是经常用der和p12进行加密解密,而且在通常加密不止一种加密算法,还可以加点儿盐吧~本文章主要阐述的是在iOS中基于openSL ...

  5. openssl evp RSA 加密解密

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

  6. 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  7. 利用openssl进行RSA加密解密

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

  8. OpenSSL中的大数接口与基于其的自用RSA加密接口设计

    本文记录了初次接触OpenSSL中的大数模块,重温了RSA加密流程,使用OpenSSL的接口包装成自用RSA加密接口,并且利用自己的接口演示了Alice与Bob通过RSA加密进行通讯的一个示例. 概览 ...

  9. C++调用openssl库生成RSA加密秘钥对

    直接上代码.默认生成的是pkcs#1格式 // ---- rsa非对称加解密 ---- // #define KEY_LENGTH 1024 // 密钥长度 #define PUB_KEY_FILE ...

随机推荐

  1. Generator函数(一)

    Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同.对于这个函数有多种理解.从语法上来理解,可以将它理解成一个状态机,封装了多个内部状态.内部的不同状态是通过yiel ...

  2. 看看如何解决“SQL Server只能使用Windows身份登录,不能使用sa等Sql server身份进行登录”的问题

    今天安装Sql Server之后,出现SQL Server只能使用Windows身份登录,不能使用sa等Sql server身份进行登录的问题是由于sql server只设置了Windows身份验证, ...

  3. ArcGIS Engine10.2与VS2017的环境设置

    首先,在安装ArcGIS Engine 10.2之前,大家应该了解的事是:AE10.2推荐与VS2010或VS2012匹配使用,AE10.3推荐与VS2013匹配使用.除上述的推荐匹配版本之外的方法, ...

  4. Spark学习视频整合

    1.<Scala深入浅出实战经典>http://pan.baidu.com/s/1pJnAUr5 2.<Spark纯实战公益大讲坛>http://pan.baidu.com/s ...

  5. delphi 查看编译版本

    对照表: http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Compiler_Versions procedure TForm1.Button1Cli ...

  6. 字符编码,pyton中的encode,decode,unicode()

    1.在计算机处理的程序中,对字符的处理有两种方式:编码或译码(encoding),解码(decoding)     encoding:将字符串中的字符转换到对应编码字符集对应的代码点         ...

  7. Java中PriorityQueue详解

    Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示.本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度, ...

  8. 让所有窗体都从DevExpress.XtraEditors.XtraForm继承

    让所有窗体都从DevExpress.XtraEditors.XtraForm继承. 第一步:在项目中添加 引用: DevExpress.BonusSkins.v14// DevExpress.Offi ...

  9. Win7如何关闭 打开文件-安全警告

    如图所示,运行一个EXE程序就会弹出提示,很麻烦.   在运行对话框中输入gpedit.msc打开组策略编辑器.定位到用户配置--管理模板--windows组件--附件管理器 点中等危险文件类型抱含列 ...

  10. GObject对象系统

    http://www.ibm.com/developerworks/cn/linux/l-gobject/ 简单的说,GObject对象系统是一个建立在GLIB基础上的,用C语言完成的,具有跨平台特色 ...