openssl AES加密算法API的使用示例
openssl为用户提供了丰富的指令,同时也提供了供编程调用的API,本文以使用128位aes算法的ecb模式进行加密和解密验证,如下所示
第一种方法,直接使用aes算法提供的api进行调用,代码如下
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <openssl/aes.h> int main(void)
{
char userkey[AES_BLOCK_SIZE];
unsigned char *date = malloc(AES_BLOCK_SIZE*);
unsigned char *encrypt = malloc(AES_BLOCK_SIZE* + );
unsigned char *plain = malloc(AES_BLOCK_SIZE*);
AES_KEY key; memset((void*)userkey, 'k', AES_BLOCK_SIZE);
memset((void*)date, 'p', AES_BLOCK_SIZE*);
memset((void*)encrypt, , AES_BLOCK_SIZE*);
memset((void*)plain, , AES_BLOCK_SIZE*); /*设置加密key及密钥长度*/
AES_set_encrypt_key(userkey, AES_BLOCK_SIZE*, &key); int len = ;
/*循环加密,每次只能加密AES_BLOCK_SIZE长度的数据*/
while(len < AES_BLOCK_SIZE*) {
AES_encrypt(date+len, encrypt+len, &key);
len += AES_BLOCK_SIZE;
}
/*设置解密key及密钥长度*/
AES_set_decrypt_key(userkey, AES_BLOCK_SIZE*, &key); len = ;
/*循环解密*/
while(len < AES_BLOCK_SIZE*) {
AES_decrypt(encrypt+len, plain+len, &key);
len += AES_BLOCK_SIZE;
}
/*解密后与原数据是否一致*/
if(!memcmp(plain, date, AES_BLOCK_SIZE*)){
printf("test success\n");
}else{
printf("test failed\n");
} printf("encrypt: ");
int i = ;
for(i = ; i < AES_BLOCK_SIZE* + ; i++){
printf("%.2x ", encrypt[i]);
if((i+) % == ){
printf("\n");
}
}
printf("\n"); return ;
}
编译执行结果如下
xlzh@cmos:~/cmos/openssl-code/aes$ gcc aes.c -o aes.out -lssl -lcrypto
xlzh@cmos:~/cmos/openssl-code/aes$ ./aes.out
test success
encrypt: a9 4d b0 1b fe 3d e4 ed a9 4d b0 1b fe 3d e4 ed
a9 4d b0 1b fe 3d e4 ed
xlzh@cmos:~/cmos/openssl-code/aes$
第二种方法,使用EVP框架,示例如下
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <openssl/evp.h>
#include <openssl/aes.h> int main(void)
{
char userkey[EVP_MAX_KEY_LENGTH];
char iv[EVP_MAX_IV_LENGTH];
unsigned char *date = malloc(AES_BLOCK_SIZE*);
unsigned char *encrypt = malloc(AES_BLOCK_SIZE*);
unsigned char *plain = malloc(AES_BLOCK_SIZE*);
EVP_CIPHER_CTX ctx;
int ret;
int tlen = ;
int mlen = ;
int flen = ; memset((void*)userkey, 'k', EVP_MAX_KEY_LENGTH);
memset((void*)iv, 'i', EVP_MAX_IV_LENGTH);
memset((void*)date, 'p', AES_BLOCK_SIZE*);
memset((void*)encrypt, , AES_BLOCK_SIZE*);
memset((void*)plain, , AES_BLOCK_SIZE*); /*初始化ctx*/
EVP_CIPHER_CTX_init(&ctx); /*指定加密算法及key和iv(此处IV没有用)*/
ret = EVP_EncryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, userkey, iv);
if(ret != ) {
printf("EVP_EncryptInit_ex failed\n");
exit(-);
} /*禁用padding功能*/
EVP_CIPHER_CTX_set_padding(&ctx, );
/*进行加密操作*/
ret = EVP_EncryptUpdate(&ctx, encrypt, &mlen, date, AES_BLOCK_SIZE*);
if(ret != ) {
printf("EVP_EncryptUpdate failed\n");
exit(-);
}
/*结束加密操作*/
ret = EVP_EncryptFinal_ex(&ctx, encrypt+mlen, &flen);
if(ret != ) {
printf("EVP_EncryptFinal_ex failed\n");
exit(-);
} tlen = mlen + flen; tlen = ;
mlen = ;
flen = ; EVP_CIPHER_CTX_cleanup(&ctx);
EVP_CIPHER_CTX_init(&ctx);
ret = EVP_DecryptInit_ex(&ctx, EVP_aes_128_ecb(), NULL, userkey, iv);
if(ret != ) {
printf("EVP_DecryptInit_ex failed\n");
exit(-);
} EVP_CIPHER_CTX_set_padding(&ctx, );
ret = EVP_DecryptUpdate(&ctx, plain, &mlen, encrypt, AES_BLOCK_SIZE*);
if(ret != ) {
printf("EVP_DecryptUpdate failed\n");
exit(-);
} ret = EVP_DecryptFinal_ex(&ctx, plain+mlen, &flen);
if(ret != ) {
printf("EVP_DecryptFinal_ex failed\n");
exit(-);
}
/*对比解密后与原数据是否一致*/
if(!memcmp(plain, date, AES_BLOCK_SIZE*)) {
printf("test success\n");
} else {
printf("test failed\n");
} printf("encrypt: ");
int i;
for(i = ; i < AES_BLOCK_SIZE*+; i ++){
printf("%.2x ", encrypt[i]);
if((i+)% == ){
printf("\n");
}
}
printf("\n"); return ;
}
编译执行结果如下:
xlzh@cmos:~/cmos/openssl-code/aes$ gcc evp.c -o evp.out -lssl -lcrypto
xlzh@cmos:~/cmos/openssl-code/aes$ ./evp.out
test success
encrypt: a9 4d b0 1b fe 3d e4 ed a9 4d b0 1b fe 3d e4 ed
a9 4d b0 1b fe 3d e4 ed
xlzh@cmos:~/cmos/openssl-code/aes$
EVP框架是对openssl提供的所有算法进行了封装,在使用工程中只需要修改少量的代码就可以选择不同的加密算法,在工作中通常采用这种方式。
在上述两个示例中,直接使用API提供的接口,没有使用padding,在EVP中同样需要声明不可以使用padding方式,否则即使要加密的数据长度是AES_BLOCK_SIZE的整数倍,EVP默认也会对原始数据进行追加,导致结果不同,所以在试验中通过EVP_CIPHER_CTX_set_padding(&ctx, )函数关闭的EVP的padding功能,同样在解密的时候也需要进行关闭。
openssl AES加密算法API的使用示例的更多相关文章
- [转]使用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加密的使用备忘.如 ...
- openssl 对称加密算法enc命令详解
1.对称加密算法概述 openssl的加密算法库提供了丰富的对称加密算法,我们可以通过openssl提供的对称加密算法指令的方式使用,也可以通过调用openssl提供的API的方式使用. openss ...
- Openssl aes加解密例程
原文链接: http://blog.csdn.net/itmes/article/details/7714854 假设我们已经下载了 openssl的源码,并成功编译,设置好了编程环境. 我们现在来看 ...
- iOS,Android,.NET通用AES加密算法
原文:iOS,Android,.NET通用AES加密算法 这两天为移动App开发API,结果实现加密验证时碰到一大坑.这里不得不吐槽下又臭又硬的iOS,Windows Server无法解密出正确的结果 ...
- Openssl aes加解密例程 更进一步
原文链接: http://blog.csdn.net/itmes/article/details/7718427 前面我们用openssl的aes256对称加密算法对16个字节的内存块进行了的加解密运 ...
- php RSA和AES加密算法
一.RSA加密 RSA只说PHP中的应用,详细的算法原理解释,请自行百度,或者参考(RSA加密算法-详细解释以及公钥加密为什么每次都不一样) 总结:公钥加密.私钥解密.私钥签名.公钥验签. 注意: 1 ...
- AES加密算法C++实现
我从网上下载了一套AES加密算法的C++实现,代码如下: (1)aes.h #ifndef SRC_UTILS_AES_H #define SRC_UTILS_AES_H class AES { pu ...
- demo工程的清单文件及activity中api代码简单示例
第一步注册一个账户,并创建一个应用.获取app ID与 app Key. 第二步下载sdk 第三步新建工程,修改清单文件,导入相关的sdk文件及调用相应的api搞定. 3.1 修改清单文件,主要是加入 ...
随机推荐
- NumberSpinner( 数字微调) 组件
本节课重点了解 EasyUI 中 Spinner(微调)组件的使用方法,这个组件依赖于Numberbox(数值输入框)和 Spinner(微调)组件. 一. 加载方式//class 加载方式<i ...
- DOM中的NodeList与HTMLCollection
最近在看<Javascript高级程序设计>的时候,看到了这样一句话:“理解NodeList和HTMLCollection,是从整体上透彻理解DOM的关键所在.”,所以觉得应该写一篇关于N ...
- 关于解决方案和web文件夹放在同一目录路径错误的问题
今天公司要做个b2b商城,下了个源码,目的是在这个基础上改,可是源码没有解决方案,于是建立了个解决方案,然后添加网站,发现解决方案和web目录位于不同目录(解决方案总是自动生成一个目录),可是我从网上 ...
- 东软实训3-servlet基础
Java Servlet技术的核心就是在服务端创建能响应用户请求的对象,被创建的对象习惯上称为一个Servlet对象. 编写一个创建servlet对象的类就是编写一个特殊类的子类,这个特殊的类就是ja ...
- 获取GET/POST提交的数据,并处理中文问题
1.获取input标签中的值,用request.getParameter("User")(User为input的name值) 2. 获取checkbox的值,由于是多选的,所以不能 ...
- c笔试题(1)
1.sizeof和strlen的区别 #include<stdio.h> #include<string.h> int main() { char a[10] = " ...
- Java中int和String互相转换的多种方法
1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...
- Css 应用一
Placeholder使用 CSS3里有相应的通用的对Placeholder提示信息美化的方法.你可以设置提示信息文字的颜色,透明度,背景色等. 为了最大化的兼容所有浏览器,给CSS里的placeho ...
- 我和小美的撸码日记(2)之第一个基于MVC+Jqgrid的列表页面
一.前言 “尼玛哥,上周你教我改了下OA系统UI,黄总看了很满意呀.” “不错不错,看来小美进步很大,可以提前结束试用期,到时候加工资别忘了请我吃饭呀!” “尼玛哥,你有女朋友了吗?” “ ...
- CoreGraphics 之CGAffineTransform仿射变换(3)
CoreGraphics 之CGAffineTransform仿射变换(3) CoreGraphics 的 仿射变换 可以用于 平移.旋转.缩放变换路径 或者图形上下文. (1)平移变换将路径或图 ...