本例是用C实现的对一个数组进行加密,加密到第二个数组,然后解密到另一个数组的完整实现代码。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "openssl/evp.h"
  4. #include "openssl/x509.h"
  5. static void disp(void * pbuf,int size)
  6. { int i=0;
  7. for( i=0;i<size;i++)
  8. printf("%02x ",*((unsigned char *)pbuf+i));
  9. putchar('\n');
  10. }
  11. /*
  12. * key:加密密钥,一般设置位24,不知为啥
  13. * iv:加密初始向量
  14. * in_enc:明文数组,输入数组
  15. * out_enc:加密后的数组,输出密文数组
  16. * in_len:明文长度
  17. * out_len:密文长度
  18. * */
  19. //加密函数
  20. int  EncryptBuffer(unsigned char * key,unsigned char *iv,unsigned char * in_enc, unsigned char *out_enc,int in_len,int *out_len)
  21. {
  22. ;
  23. int outl;  //第一次使用update加密的数据长度
  24. int outl2; //剩余的字段,经过final填充后的长度
  25. int inl;
  26. int rv;
  27. EVP_CIPHER_CTX ctx;
  28. EVP_CIPHER_CTX_init(&ctx);  //初始化ctx
  29. rv = EVP_EncryptInit_ex(&ctx,EVP_des_ede3_ecb(),NULL,key,iv);   //设置密码算法、key和iv
  30. if(rv != 1)
  31. {
  32. printf("Err\n");
  33. return -1;
  34. }
  35. inl=in_len;
  36. rv = EVP_EncryptUpdate(&ctx,out_enc,&outl,in_enc,in_len);//加密
  37. if(rv != 1)
  38. {
  39. printf("Err\n");
  40. return -1;
  41. }
  42. //加密结束
  43. rv = EVP_EncryptFinal_ex(&ctx,out_enc+outl,&outl2);
  44. if(rv != 1)
  45. {
  46. EVP_CIPHER_CTX_cleanup(&ctx);
  47. return -1;
  48. }
  49. *out_len=outl+outl2;
  50. EVP_CIPHER_CTX_cleanup(&ctx);   //清除EVP加密上下文环境
  51. printf("加密已完成\n");
  52. }
  53. /*
  54. * key:加密密钥,一般设置位24,不知为啥
  55. * iv:加密初始向量
  56. * in_dec:密文数组,输入数组
  57. * out_dec:解密后的数组,输出数组
  58. * in_len:密文长度
  59. * out_len:明文长度
  60. * */
  61. //解密函数
  62. int DecryptBuffer(unsigned char * key,unsigned char *iv,unsigned char * in_dec, unsigned char *out_dec,int in_len,int *out_len)
  63. {
  64. int outl;  //第一次使用update解密的数据长度
  65. int outl2; //剩余的字段,经过final解密并去除填充后的长度
  66. int rv;
  67. EVP_CIPHER_CTX ctx;
  68. //初始化ctx
  69. EVP_CIPHER_CTX_init(&ctx);
  70. //设置解密的算法、key和iv
  71. rv = EVP_DecryptInit_ex(&ctx,EVP_des_ede3_ecb(),NULL,key,iv);
  72. if(rv != 1)
  73. {
  74. EVP_CIPHER_CTX_cleanup(&ctx);
  75. return -1;
  76. }
  77. //循环读取原文,解密后后保存到明文文件。
  78. rv = EVP_DecryptUpdate(&ctx,out_dec,&outl,in_dec,in_len);//解密
  79. if(rv != 1)
  80. {
  81. EVP_CIPHER_CTX_cleanup(&ctx);
  82. return -1;
  83. }
  84. //解密结束
  85. rv = EVP_DecryptFinal_ex(&ctx,out_dec+outl,&outl2);
  86. if(rv != 1)
  87. {
  88. EVP_CIPHER_CTX_cleanup(&ctx);
  89. return -1;
  90. }
  91. *out_len=outl+outl2;
  92. EVP_CIPHER_CTX_cleanup(&ctx);//清除EVP加密上下文环境
  93. printf("解密已完成\n");
  94. }
  95. int main()
  96. {
  97. int len=128+4;
  98. int dec_len,len2;
  99. unsigned char key[EVP_MAX_KEY_LENGTH];  //保存密钥的数组
  100. unsigned char iv[EVP_MAX_KEY_LENGTH];   //保存初始化向量的数组
  101. //EVP加密上下文环境
  102. unsigned char out[len+EVP_MAX_KEY_LENGTH];  //保存加密后明文的缓冲区数组
  103. unsigned char dec[len+EVP_MAX_KEY_LENGTH];  //保存解密后明文的缓冲区数组
  104. unsigned char in[len+EVP_MAX_KEY_LENGTH];           //保存原文的缓冲区
  105. int i=0;
  106. //设置key和iv
  107. for(i=0;i<8;i++)
  108. {
  109. key[i]=i;
  110. }
  111. for(i=0;i<8;i++)
  112. {
  113. iv[i]=i;
  114. }
  115. for(i=0;i<len;i++)
  116. {
  117. in[i]=i;
  118. }
  119. disp(in,len);
  120. EncryptBuffer(key,iv,in,dec,len,&dec_len);
  121. printf("dec_len:%d\n",dec_len);
  122. disp(dec,dec_len);
  123. DecryptBuffer(key,iv,dec,out,dec_len,&len2);
  124. disp(out,len2);
  125. printf("解密候数据长度:%d\n",len2);
  126. return 0;
  127. }

http://blog.csdn.net/xueyushenzhou/article/details/23281675

openssl对数组加密解密的完整实现代码的更多相关文章

  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. CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互

    (以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下) 1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据 1)pem格式的证书和私钥(公私钥是对应的)的base64编码 voi ...

  4. AES字节数组加密解密流程

    AES类时微软MSDN中最常用的加密类,微软官网也有例子,参考链接:https://docs.microsoft.com/zh-cn/dotnet/api/system.security.crypto ...

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

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

  6. 用openssl库RSA加密解密

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

  7. C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式

    ============================================== des   cbc  加密 zeropadding填充方式 ======================= ...

  8. openssl RSA基本加密解密

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include <openssl/bn ...

  9. 提供openssl -aes-256-cbc兼容加密/解密的简单python函数

    原文链接:http://joelinoff.com/blog/?p=885 这里的示例显示了如何使用python以与openssl aes-256-cbc完全兼容的方式加密和解密数据.它是基于我在本网 ...

随机推荐

  1. ResourceString的用法

    在Delphi编程的那段“古老”的日子里(就是在版本4之前),在程序中使用字符串有两个基本的方法.你可以使用字符串将它们嵌入到源程序中,例如: MessageDlg( 'Leave your stin ...

  2. BZOJ3016: [Usaco2012 Nov]Clumsy Cows

    3016: [Usaco2012 Nov]Clumsy Cows Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 71  Solved: 52[Submi ...

  3. joomla安装插件报错:上传文件到服务器发生了一个错误。 过小的PHP文件上传尺寸

    在安装joomla的AKeeba插件的时候报错如下:上传文件到服务器发生了一个错误. 过小的PHP文件上传尺寸.解决方法是修改php.ini文件,打开文件后搜索upload_max_filesize! ...

  4. [VBA]根据身份证号码计算年龄的Excel函数

    是的,昨天刚发表了一篇和Excel自定义函数有关的博客,今天又一篇,有凑数的嫌疑.但是,保存知识和传播知识本来就是写博客的初衷,所以也并不多余. 如果不知道什么是Excel自定义函数,请移步这里[1] ...

  5. Mac下配置phpredis扩展

    最近把开发环境从windows转到Mac下,所有的环境都要重新来配置.由于Mac是基于unix系统的不太熟悉,所以遇到了很多问题. 安装phpredis扩展: 首先,大家先下载phpredis的扩展包 ...

  6. J2EE学习路线

    第一部分:  JAVA语言基础知识.包括异常.IO流.多线程.集合类.数据库.(切记基础知识一定要时时刻刻巩固,注意,如果你是想以最快速度学习J2EE,关于Java中的Swing知识点,就只做了解)  ...

  7. Spring 源码解读 推荐流程

    Spring源代码解析(一):IOC容器:http://www.javaeye.com/topic/86339 Spring源代码解析(二):IoC容器在Web容器中的启动:http://www.ja ...

  8. poj 2976 Dropping tests (二分搜索之最大化平均值之01分数规划)

    Description In a certain course, you take n tests. If you get ai out of bi questions correct on test ...

  9. DOS命令大全--具体解释

    在Linux和Windows下都能够用nslookup命令来查询域名的解析结果 DOS命令大全一)MD--建立子文件夹 1.功能:创建新的子文件夹 2.类型:内部命令 3.格式:MD[盘符:][路径名 ...

  10. 安装tcmalloc

    安装google-perftools:#tar zxvf google-perftools-1.6.tar.gz #cd google-perftools-1.6 #./configure#make# ...