openssl对数组加密解密的完整实现代码
本例是用C实现的对一个数组进行加密,加密到第二个数组,然后解密到另一个数组的完整实现代码。
- #include <stdio.h>
- #include <string.h>
- #include "openssl/evp.h"
- #include "openssl/x509.h"
- static void disp(void * pbuf,int size)
- { int i=0;
- for( i=0;i<size;i++)
- printf("%02x ",*((unsigned char *)pbuf+i));
- putchar('\n');
- }
- /*
- * key:加密密钥,一般设置位24,不知为啥
- * iv:加密初始向量
- * in_enc:明文数组,输入数组
- * out_enc:加密后的数组,输出密文数组
- * in_len:明文长度
- * out_len:密文长度
- * */
- //加密函数
- int EncryptBuffer(unsigned char * key,unsigned char *iv,unsigned char * in_enc, unsigned char *out_enc,int in_len,int *out_len)
- {
- ;
- int outl; //第一次使用update加密的数据长度
- int outl2; //剩余的字段,经过final填充后的长度
- int inl;
- int rv;
- EVP_CIPHER_CTX ctx;
- EVP_CIPHER_CTX_init(&ctx); //初始化ctx
- rv = EVP_EncryptInit_ex(&ctx,EVP_des_ede3_ecb(),NULL,key,iv); //设置密码算法、key和iv
- if(rv != 1)
- {
- printf("Err\n");
- return -1;
- }
- inl=in_len;
- rv = EVP_EncryptUpdate(&ctx,out_enc,&outl,in_enc,in_len);//加密
- if(rv != 1)
- {
- printf("Err\n");
- return -1;
- }
- //加密结束
- rv = EVP_EncryptFinal_ex(&ctx,out_enc+outl,&outl2);
- if(rv != 1)
- {
- EVP_CIPHER_CTX_cleanup(&ctx);
- return -1;
- }
- *out_len=outl+outl2;
- EVP_CIPHER_CTX_cleanup(&ctx); //清除EVP加密上下文环境
- printf("加密已完成\n");
- }
- /*
- * key:加密密钥,一般设置位24,不知为啥
- * iv:加密初始向量
- * in_dec:密文数组,输入数组
- * out_dec:解密后的数组,输出数组
- * in_len:密文长度
- * out_len:明文长度
- * */
- //解密函数
- int DecryptBuffer(unsigned char * key,unsigned char *iv,unsigned char * in_dec, unsigned char *out_dec,int in_len,int *out_len)
- {
- int outl; //第一次使用update解密的数据长度
- int outl2; //剩余的字段,经过final解密并去除填充后的长度
- int rv;
- EVP_CIPHER_CTX ctx;
- //初始化ctx
- EVP_CIPHER_CTX_init(&ctx);
- //设置解密的算法、key和iv
- rv = EVP_DecryptInit_ex(&ctx,EVP_des_ede3_ecb(),NULL,key,iv);
- if(rv != 1)
- {
- EVP_CIPHER_CTX_cleanup(&ctx);
- return -1;
- }
- //循环读取原文,解密后后保存到明文文件。
- rv = EVP_DecryptUpdate(&ctx,out_dec,&outl,in_dec,in_len);//解密
- if(rv != 1)
- {
- EVP_CIPHER_CTX_cleanup(&ctx);
- return -1;
- }
- //解密结束
- rv = EVP_DecryptFinal_ex(&ctx,out_dec+outl,&outl2);
- if(rv != 1)
- {
- EVP_CIPHER_CTX_cleanup(&ctx);
- return -1;
- }
- *out_len=outl+outl2;
- EVP_CIPHER_CTX_cleanup(&ctx);//清除EVP加密上下文环境
- printf("解密已完成\n");
- }
- int main()
- {
- int len=128+4;
- int dec_len,len2;
- unsigned char key[EVP_MAX_KEY_LENGTH]; //保存密钥的数组
- unsigned char iv[EVP_MAX_KEY_LENGTH]; //保存初始化向量的数组
- //EVP加密上下文环境
- unsigned char out[len+EVP_MAX_KEY_LENGTH]; //保存加密后明文的缓冲区数组
- unsigned char dec[len+EVP_MAX_KEY_LENGTH]; //保存解密后明文的缓冲区数组
- unsigned char in[len+EVP_MAX_KEY_LENGTH]; //保存原文的缓冲区
- int i=0;
- //设置key和iv
- for(i=0;i<8;i++)
- {
- key[i]=i;
- }
- for(i=0;i<8;i++)
- {
- iv[i]=i;
- }
- for(i=0;i<len;i++)
- {
- in[i]=i;
- }
- disp(in,len);
- EncryptBuffer(key,iv,in,dec,len,&dec_len);
- printf("dec_len:%d\n",dec_len);
- disp(dec,dec_len);
- DecryptBuffer(key,iv,dec,out,dec_len,&len2);
- disp(out,len2);
- printf("解密候数据长度:%d\n",len2);
- return 0;
- }
http://blog.csdn.net/xueyushenzhou/article/details/23281675
openssl对数组加密解密的完整实现代码的更多相关文章
- openssl evp RSA 加密解密
openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...
- OpenSSL 中 RSA 加密解密实现源代码分析
1.RSA 公钥和私钥的组成.以及加密和解密的公式: 2.模指数运算: 先做指数运算,再做模运算.如 5^3 mod 7 = 125 mod 7 = 6 3.RSA加密算法流程: 选择一对不同的.而且 ...
- CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互
(以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下) 1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据 1)pem格式的证书和私钥(公私钥是对应的)的base64编码 voi ...
- AES字节数组加密解密流程
AES类时微软MSDN中最常用的加密类,微软官网也有例子,参考链接:https://docs.microsoft.com/zh-cn/dotnet/api/system.security.crypto ...
- 利用openssl进行RSA加密解密
openssl是一个功能强大的工具包,它集成了众多密码算法及实用工具.我们即可以利用它提供的命令台工具生成密钥.证书来加密解密文件,也可以在利用其提供的API接口在代码中对传输信息进行加密. RSA是 ...
- 用openssl库RSA加密解密
#include <stdio.h> #include <openssl/rsa.h> #include <openssl/pem.h> #include < ...
- C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式
============================================== des cbc 加密 zeropadding填充方式 ======================= ...
- openssl RSA基本加密解密
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <openssl/bn ...
- 提供openssl -aes-256-cbc兼容加密/解密的简单python函数
原文链接:http://joelinoff.com/blog/?p=885 这里的示例显示了如何使用python以与openssl aes-256-cbc完全兼容的方式加密和解密数据.它是基于我在本网 ...
随机推荐
- KEIL的混合编程操作
http://hi.baidu.com/txz01/item/21ad9d75913a7b28d7a89c12 这一篇来讲讲混合编程的问题,在网上找了一下,讲混合编程的文件章也有不少,但进行实例操作讲 ...
- Qt在Windows下的三种编程环境搭建
尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/17363165 从QT官网可以得知其支持的平台.编译器 ...
- Android 获取文件大小
android 获取文件夹.文件的大小 以B.KB.MB.GB 为单位 FileSizeUtil public class FileSizeUtil { ;//获取文件大小单位为B的double值 ; ...
- ssh秘钥交换详解与实现 diffie-hellman-group-exchange-sha
ssh的DH秘钥交换是一套复合几种算法的秘钥交换算法.在RFC4419中称为diffie-hellman-groupX-exchange-shaX 的算法(也有另一种单纯的 rsaX-shaX 交换算 ...
- javascript笔记4之运算符
/* var box = 100; --box; //前置递增,box = box +1 alert(box);//99 var box = 100; var age = ++box; //先box累 ...
- wcf简单的创建和运用
创建一个控制台应用程序,命名为wcftest,并在同一解决方案中添加一个wcf服务应用程序 在wcf项目中会自动生成Service1.svc服务程序文件和IService1.cs契约接口 IServi ...
- 设计: ListView 接口,and the missing read-only interfaces in java collection framework
Java的集合框架以其成功易用的设计征服了很多人(包括我),并且教科书式的诠释了泛型的应用方式. 我也是被 Joshua Bloch 的书引领入门,从中得益良多.我当然不会认为自己在设计上比他懂得更多 ...
- IIS PHP 配置 问题总结
今天帮助朋友解决一个IIS配置PHP的问题.大概是这样子的. IIS 与 PHP配置好了之后不能訪问,出现例如以下错误: HTTP 错误 500.19 - Internal Server Error ...
- HDU 1027 Ignatius and the Princess II 选择序列题解
直接选择序列的方法解本题,可是最坏时间效率是O(n*n),故此不能达到0MS. 使用删除优化,那么就能够达到0MS了. 删除优化就是当须要删除数组中的元素为第一个元素的时候,那么就直接移动数组的头指针 ...
- Difference between enabled and userInteractionEnabled properties
I read through the documentation, and here are my findings. UIButton inherits from UIControl the boo ...