[转贴]C++调用openssl 的AES加密例子
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <openssl/aes.h>
//g++ -g -o -Wall -m64 AesTest AesTest.cpp -lssl -lcrypto
//g++ -g -o -Wall AesTest AesTest.cpp -lssl -lcrypto
int main(int argc, char **argv)
{//由于与直接对接用的char,那么加解密要强制转换
char Source[1024];
char *InputData=NULL;
char *EncryptData=NULL;
char *DecryptData=NULL;
unsigned char Key[AES_BLOCK_SIZE+1]; //建议用unsigned char
unsigned char ivec[AES_BLOCK_SIZE]; //建议用unsigned char
AES_KEY AesKey;
int DataLen=0,SetDataLen=0, i;
memset(Source, 0x00, sizeof(Source));
strcpy(Source, "1234567890abcde"); //要加密的数据
DataLen = strlen(Source);
memset(Key, 0x00, sizeof(Key));
memcpy(Key, "0123456789abcdef", AES_BLOCK_SIZE);
// set the encryption length
SetDataLen = 0;
if ((DataLen%AES_BLOCK_SIZE) == 0)
{
SetDataLen = DataLen;
}
else
{
SetDataLen = ((DataLen/AES_BLOCK_SIZE)+1) * AES_BLOCK_SIZE;
}
printf("SetDataLen:%d...\n", SetDataLen); //取16的倍数
InputData = (char *)calloc(SetDataLen+1, sizeof(char));
if(InputData == NULL) //注意要SetDataLen+1
{
fprintf(stderr, "Unable to allocate memory for InputData\n");
exit(-1);
}
memcpy(InputData, Source, DataLen);
EncryptData = (char *)calloc(SetDataLen+1, sizeof(char));
if(EncryptData == NULL) //注意要SetDataLen+1
{
fprintf(stderr, "Unable to allocate memory for EncryptData\n");
exit(-1);
}
DecryptData = (char *)calloc(SetDataLen+1, sizeof(char));
if(DecryptData == NULL) //注意要SetDataLen+1
{
fprintf(stderr, "Unable to allocate memory for DecryptData\n");
exit(-1);
}
memset(&AesKey, 0x00, sizeof(AES_KEY));
if(AES_set_encrypt_key(Key, 128, &AesKey) < 0)
{//设置加密密钥
fprintf(stderr, "Unable to set encryption key in AES...\n");
exit(-1);
}
for(i=0; i<AES_BLOCK_SIZE; i++)
{//必须要有
ivec[i] = 0;
}
//加密
AES_cbc_encrypt((unsigned char *)InputData, (unsigned char *)EncryptData,
SetDataLen, &AesKey, ivec, AES_ENCRYPT);
memset(&AesKey, 0x00, sizeof(AES_KEY));
if(AES_set_decrypt_key(Key, 128, &AesKey) < 0)
{//设置解密密钥
fprintf(stderr, "Unable to set encryption key in AES...\n");
exit(-1);
}
for(i=0; i<AES_BLOCK_SIZE; i++)
{//必须要有
ivec[i] = 0;
}
//解密
AES_cbc_encrypt((unsigned char *)EncryptData, (unsigned char *)DecryptData,
SetDataLen, &AesKey, ivec, AES_DECRYPT);
printf("DecryptData:%s...\n", (char *)DecryptData);
if(InputData != NULL)
{
free(InputData);
InputData = NULL;
}
if(EncryptData != NULL)
{
free(EncryptData);
EncryptData = NULL;
}
if(DecryptData != NULL)
{
free(DecryptData);
DecryptData = NULL;
}
exit(0);
}
OpenSSL支持多种不同的加密算法
加密:
AES, Blowfish, Camellia, SEED, CAST-128, DES, IDEA, RC2, RC4, RC5, Triple DES, GOST 28147-89[4]
散列函数:
MD5, MD2, SHA-1, SHA-2, RIPEMD-160, MDC-2, GOST R 34.11-94[4]
公开密钥加密:
RSA, DSA, Diffie–Hellman key exchange, Elliptic curve, GOST R 34.10-2001[4]
[转贴]C++调用openssl 的AES加密例子的更多相关文章
- openssl之aes加密(源码分析 AES_encrypt 与 AES_cbc_encrypt ,加密模式)
首先要了解AES加密是什么,以及几种加密模式的区别.之后才是编程.具体的编程案例,在下面的链接. openssl之aes加密(AES_cbc_encrypt 与 AES_encrypt 的编程案例) ...
- AES加密例子(python和php版本)
AES加密例子(python和php版本) AES加密例子(python和php版本)
- openSSL实现AES加密
Openssl是很常见的C接口的库,个人觉得易用.以下是AES加密的使用备忘.如果你有一定的密码学基础,那么就很好理解.代码是从网上弄下来的(原始地址已经忘记了),然后在尝试的过程中改了一点东西.其它 ...
- C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式
============================================== des cbc 加密 zeropadding填充方式 ======================= ...
- JS和利用openssl的object C加密得到相同的aes加密密文
这是之前接到的一个工作内容,项目原本的登录操作是获得账号和密码以后,对密码进行一遍MD5加密,然后传递账号和密文到cgi文件.在c中获取到账户以后,从数据库中获取到密码,对密码进行一次MD5的加密,然 ...
- linux以下C 利用openssl的AES库加密,解密
OpenSSL提供了AES加解密算法的API const char *AES_options(void); AES算法状态,是所有支持或者是部分支持. 返回值:"aes(full)" ...
- Linux Kernel(Android) 加密算法汇总(四)-应用程序调用OpenSSL加密演算法
Linux Kernel(Android) 加密算法总结(三)-应用程序调用内核加密算法接口 讲到了怎样调用内核中的接口的方法. 本节主要是介绍怎样Android C/C++应用程序调用Openssl ...
- [svc]openssl对称非对称加密实战
OpenSSL进行aes加密解密-对称加密(symmetry) 建立文件test.txt, 特意写入中英文 # cd /tmp # echo "test测试" > test. ...
- openssl与cryptoAPI交互AES加密解密
继上次只有CryptoAPI的加密后,这次要实现openssl的了 动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互 先前有 ...
随机推荐
- IDispose(), Finalize()
C# using 用法: 1. 作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型.(见例1-1) 2. 作为语句,用于定义一个范围,在此范围的末尾将释放对象.(见例1-2) (例子1- ...
- SQL语句修改表
-- 更改字段类型 默认值 alter table 表名 alter column 字段名 类型 ALTER TABLE 表名 add DEFAULT ('修改后的默认值') for 字段名 WITH ...
- 利用php给图片添加文字水印--面向对象与面向过程俩种方法的实现
1: 面向过程的编写方法 //指定图片路径 $src = '001.png'; //获取图片信息 $info = getimagesize($src); //获取图片扩展名 $type = image ...
- Es6 之for of
能工摹形,巧匠窃意. -- 毕加索 2016-10-10 <!DOCTYPE HTML> <html> <head> <script src="tr ...
- Java—static、this、super用法总结
通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.(理解为加了static的就是全局变量)但是,并不是说有了这种便利,你便可 ...
- Jstl标签库/Filter过滤器
JSTLJSP Standard Tag Library JSP标准标签库 是Sun公司定义的一套标准,由Apache组织基于这套标准开发的一套标准库之后又转给Sun公司被称为JSTL,成为了java ...
- O-C相关-09-id 类型与应用
09-id 类型与应用 1, 使用 NSObject 访问子类对象方法 代码在编辑的时候, Xcode 会实时检查语法情况. 如果调用某个对象的方法, 在声明中没有该方法的声明, 那么就会报错. 但是 ...
- tar 命令基本使用(加密)
本文讲述tar命令的基本使用,special: 使用tar命令对文件加密. 假定在当前目录下有一个文件夹/stuff. 1.将/stuff目录下的所有文件打包成为.tar 文件. $ tar -cvf ...
- storm学习之入门篇(一)
海量数据处理使用的大多是鼎鼎大名的hadoop或者hive,作为一个批处理系统,hadoop以其吞吐量大.自动容错等优点,在海量数据处理上得到了广泛的使用.但是,hadoop不擅长实时计算,因为它天然 ...
- arcgisserver
http://www.cnblogs.com/hll2008/archive/2008/11/14/1333828.html