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

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

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

  1)生成一个密钥:

  1.   openssl genrsa -out test.key 1024

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

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

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

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

  

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

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

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

  4)解密文件:

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

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

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

3. 采用 API 进行加密

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

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. win8 wamp 安装报错

    可是安装wamp的时候(http://www.wampserver.com/en/#download-wrapper)下载的是64位的,刚开始报 错xxx.dll文件丢失,好吧我把那个xxx.dll文 ...

  2. Java本地方法(native方法)的实现

    Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能. 可以将 ...

  3. 20172333 2017-2018-2 《Java程序设计》第5周学习总结

    20172333 2017-2018-2 <Java程序设计>第5周学习总结 教材学习内容 1.if语句.if-else语句.switch语句 都是通过对于布尔表达式的结果来进行是否执行下 ...

  4. 星际争霸 虚空之遗 人族5BB 操作流程

    人族5BB rush timing 3min-3min30 一波战术,对面双开不侦察应该就GG了. 14农民BS,建议在第一个BS后的100矿,马上接上一个BS堵口,基本上对面是侦察不到的,特别是内双 ...

  5. Ubuntu中APache+mod_pyhon

    安装apache 1.sudo apt-get install Apache2 Apxs(Apache extension tool既apache扩展模块的工具)的安装: 1.sudo apt-get ...

  6. rocketmq持久化方式

    推荐看下RocketMQ,使用文件做持久化, 并支持分布式事务(虽然可能造成较多的写脏), 异步刷盘,内存预分配, 高可用采用了同步双写及异步复制的方式, 通信是用netty做的,基本上所有耗时的操作 ...

  7. 事件click,bind,click

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  8. Unity 加密解密

    解密无非就为了 修改游戏功能数据.提取游戏资源.加入自己想加的广告...加密就是保护游戏不被恶意修改,经常看到有人说:"加什么密,你以为自己写的代码很NB?见不得人?"我只想说,加 ...

  9. hdu 1244 DP

    水DP dp[i%2][j]=Max(dp[i%2][j-1],dp[1-i%2][j-l[i]]+sum[j]-sum[j-l[i]]); #include "stdio.h" ...

  10. [转] SQL SERVER拼接字符串(字符串中有变量)

    本文转自:http://blog.csdn.net/sikaiyuan2008/article/details/7848926 SQL SERVER拼接字符串(字符串中有变量)对我来说是一个难点,总是 ...