#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]

最新文章

  1. Ubuntu提示卷boot仅剩0字节的硬盘空间,解决办法
  2. Think in 递归
  3. 一、ASP.NET MVC 路由(一)--- ASP.NET WebForm路由模拟
  4. 【leetcode】Find Minimum in Rotated Sorted Array I &amp; II (middle)
  5. vijos 1025 背包 *
  6. Spring MVC配置DispatcherServlet的url-pattern
  7. Cent OS安装TL-WN725N 2.0 USB驱动
  8. NodeJs随心学习(一)之UEditor开源项目部署
  9. Problem 2214 Knapsack problem 福建第六届省赛
  10. Memcache 查看列出所有key方法
  11. POJ 2762 Going from u to v or from v to u?(强连通分量+拓扑排序)
  12. poj 2565 Ants (KM+思维)
  13. 微信小程序大全(上)(最新整理 建议收藏)
  14. 获取dmp文件的schema
  15. loadrunner录制时web时,安全证书问题
  16. Adjacency matrix based Graph
  17. 安装mysql服务时提示“找不到msvcp140.dll”
  18. 新建虚拟机_WIN8 64位系统_启动报错Directory &quot;EZBOOT&quot; not found
  19. A stock
  20. 编写dll时的内存分配策略

热门文章

  1. WCF中常用的binding方式 z
  2. iOS开发 绘图详解
  3. Direct2D教程(三)简单几何图形
  4. 这一篇里面有很多关于scala的list的操作的好的知识
  5. hdu1034 简单模拟
  6. javascript 转义函数
  7. soapUI学习笔记---断言的小使用
  8. ubuntu + lamp + laravel 环境配置
  9. sql中in/not in 和exists/not exists的使用方法差别
  10. windows常用命令(转载)