使用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]
使用openssl的aes各种加密算法的更多相关文章
- openssl之aes加密(源码分析 AES_encrypt 与 AES_cbc_encrypt ,加密模式)
首先要了解AES加密是什么,以及几种加密模式的区别.之后才是编程.具体的编程案例,在下面的链接. openssl之aes加密(AES_cbc_encrypt 与 AES_encrypt 的编程案例) ...
- linux以下C 利用openssl的AES库加密,解密
OpenSSL提供了AES加解密算法的API const char *AES_options(void); AES算法状态,是所有支持或者是部分支持. 返回值:"aes(full)" ...
- [转]使用Openssl的AES加密算法
转自:http://www.thinkemb.com/wordpress/?p=18 参考:http://blog.csdn.net/shuanyancao/article/details/89859 ...
- 使用Openssl的AES加密算法
原文链接: http://blog.csdn.net/yasi_xi/article/details/13997337 Openssl是很常见的C接口的库,个人觉得易用.以下是AES加密的使用备忘.如 ...
- [转贴]C++调用openssl 的AES加密例子
#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h ...
- AES对称加密算法原理
原著:James McCaffrey 翻译:小刀人 原文出处:MSDN Magazine November 2003 (Encrypt It) 本文的代码下载:msdnmag200311AES.exe ...
- AES对称加密算法原理(转载)
出处:http://www.2cto.com/Article/201112/113465.html 原著:James McCaffrey 翻译:小刀人 原文出处:MSDN Magazine Novem ...
- Java 加密 AES 对称加密算法
版权声明:本文为博主原创文章,未经博主允许不得转载. [AES] 一种对称加密算法,DES的取代者. 加密相关文章见:Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES R ...
- DES、RC4、AES等加密算法优势及应用
[IT168 技术]1篇文章,1部小说被盗取,全靠维(si)权(bi)捍卫自己的原创权利.程序员捍卫自己珍贵的代码,全靠花式的加密算法.代码加密有多重要?程序员半年做出的产品,盗版者可能半天就能完全破 ...
随机推荐
- Android自定义Dialog效果
上面是效果图. 使用方法: NiftyDialogBuilder dialogBuilder=NiftyDialogBuilder.getInstance(this); dialogBuilder . ...
- [Algorithms] Tree Data Structure in JavaScript
In a tree, nodes have a single parent node and may have many children nodes. They never have more th ...
- orcad元件属性批量修改(通过excel表格)
本文适合于没有使用CIS的情况下,提高元件属性修改的效率和BOM生成. 第一步:编号 首先给元件编好号: 如果是沿用旧工程,用这个编号.如果是创建的新工程,使用第二项,强制从头开始编号.因为编号与PC ...
- wamp中apache2.4.9配置httpd.conf允许外部访问
安装最新的wamp后发现通过外部网络无法访问本机的apache.在网上查询了相关问题,所有的答案基本都是说在httpd.conf文件中加入语句Allow from all.但是这些对应的是ap ...
- 你必须了解的java内存管理机制(一)-运行时数据区
前言 本打算花一篇文章来聊聊JVM内存管理机制,结果发现越扯越多,于是分了四遍文章(文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8),本文为其中第一篇.from 你必须了解的java内存 ...
- oracle sql 当初始化数据时避免重复主键
一:当有主键序列自动增长时候(序列为:seq_cct_id) insert into cs_cost_type (CCT_ID, CCT_NAME, CCT_RATE, CCT_RATE_TYPE, ...
- 几个经典的TCP通信函数
前言 在TCP通信中要使用到几个非常经典的函数( 点这里参考一个关于它们作用的形象比方 ),本文将对这几个函数进行一个简短的使用说明. socket函数 函数作用:创建一个网际字节流套接字 包含头文件 ...
- IOS下SQLite的简单使用
本文转载至 http://www.cnblogs.com/cokecoffe/archive/2012/05/31/2537105.html 看着国外网站的教程,写了一个小例子,一个联系人的程序,包括 ...
- jQuery remove()与jQuery empty()的区别
jQuery remove() 方法删除被选元素及其子元素.举例如下: <!DOCTYPE html> <html> <head> <script src=& ...
- jQuery事件函数位置放置的两种方法
jQuery 事件函数 jQuery 事件处理方法是 jQuery 中的核心函数. 事件处理程序指的是当 HTML 中发生某些事件时所调用的方法. 通常会把 jQuery 代码放到 <head& ...