Openssl aes加解密例程 更进一步
原文链接: http://blog.csdn.net/itmes/article/details/7718427
前面我们用openssl的aes256对称加密算法对16个字节的内存块进行了的加解密运算测试,现在更进一步,对指定大小的内存块进行加解密运算。
首先明确一下aes是分组加密算法,且每次加密的内存块是16个字节,所以,我们需要加密的内存块必须是16个字节的整数倍,若不是,则需要进行补齐。
常见的对称加解密算法中rc2,rc4都是流加密,也就是以字节为单位进行加解密,而aes,des,3des,idea,blowfish,towfish,这些都是分组加密,都要求被加密的数据块进行字节对齐。
对于大于16个字节的内存块进行加密运算无非就是循环调用16字节加密运算。
参考以下例程:
#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
#include <openssl/aes.h>
#pragma comment(lib,"libeay32.lib")
int main(int argc, char **argv)
{
unsigned char buf[512];
unsigned char buf2[512];
unsigned char buf3[512];
unsigned char aes_keybuf[32];
memset(buf,1,sizeof(buf));
memset(buf,0,sizeof(buf2));
memset(buf,0,sizeof(buf3));
memset(aes_keybuf,0,sizeof(aes_keybuf));
AES_KEY aeskey;
AES_set_encrypt_key(aes_keybuf,256,&aeskey);
for(int i=0;i<sizeof(buf);i+=16)
AES_encrypt(buf+i,buf2+i,&aeskey);
AES_set_decrypt_key(aes_keybuf,256,&aeskey);
for(int i=0;i<sizeof(buf);i+=16)
AES_decrypt(buf2+i,buf3+i,&aeskey);
if(memcmp(buf,buf3,sizeof(buf))==0)
printf("test success\r\n");
else
printf("test fail\r\n");
}
这里的例程实际上是使用AES加密算法的ECB模式,另外还有CBC,CFB,OFB三种模式,简单的说,后面三种模式实际上是让上一个16字节的数据块加密的结果参与下一个16字节数据块加密运算,所以采用ECB模式进行加密时对内容相同的数据块加密的结果是相同的,采用CBC,CFB,OFB三种模式三种模式时加密的结果不光与源数据块内容相关,还跟加密的顺序有关。
最后再提一点,采用分组加密算法的时候,由于加密数据的最小单位是分组的大小,如aes的16个字节,des的8个字节,在加密文件时需要进行字节补齐,所以加密文件的结果可能会和原始文件一样大或者稍大于原始文件。在进行解密运算时,需要在解密后把补齐的字节再去除掉,才能够真正还原原始文件。
Openssl aes加解密例程 更进一步的更多相关文章
- Openssl aes加解密例程
原文链接: http://blog.csdn.net/itmes/article/details/7714854 假设我们已经下载了 openssl的源码,并成功编译,设置好了编程环境. 我们现在来看 ...
- OpenSSL aes加解密实例+base64编解码
OpenSSL aes加解密简单实例+base64编解码 #include <stdio.h> #include <string.h> #include <memory. ...
- openssl - rsa加解密例程
原文链接: http://www.cnblogs.com/cswuyg/p/3187462.html openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密.可以使用非对称加 ...
- AES加解密算法Qt实现
[声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外 ...
- DES,AeS加解密,MD5,SHA加密
1.DES一共就有4个参数参与运作:明文.密文.密钥.向量.其中这4者的关系可以理解为: 密文=明文+密钥+向量: 明文=密文-密钥-向量: 为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复, ...
- c# Aes加解密和对象序列化
aes加解密 public class AesCryptto { private string key = "hjyf57468jhmuist"; private string i ...
- Java、C#双语版配套AES加解密示例
这年头找个正经能用的东西那是真难,网上一搜索一大堆,正经能用的没几个,得,最后还是得靠自己,正巧遇上需要AES加解密的地方了,而且还是Java和C#间的相互加解密操作,这里做个备忘 这里采用的加解 ...
- aes加解密 Illegal key size
做aes加密时,发生一个奇怪的错误,在本地环境是好的,发布到测试环境就出问题, java.security.InvalidKeyException: Illegal key size 想到本地环境之前 ...
- C# RSA加解密与验签,AES加解密,以及与JAVA平台的密文加解密
前言: RSA算法是利用公钥与密钥对数据进行加密验证的一种算法.一般是拿私钥对数据进行签名,公钥发给友商,将数据及签名一同发给友商,友商利用公钥对签名进行验证.也可以使用公钥对数据加密,然后用私钥对数 ...
随机推荐
- Spring开发 - 通过实现ApplicationContextAware在Servlet中调用注解的Service
用过Spring MVC的人都知道,我们如何在Controller中注入Service,可以使用@Resource注解的方法. 有时候,实际在项目的过程中,我们需要在某个Servlet中使用Servi ...
- Android开发 - Fragment与Activity生命周期比较
1. Fragment的生命周期 见下图 2. 与Activity生命周期的对比 见下图 3. 代码场景演示实例 切换到该Fragment: AppListFragment(7649): onAtta ...
- Linux中禁用THP(Transparent Huge Pages)
一.简介 Centos6开始引入THP,Centos7时默认启用,用来提升内存性能. 二.说明 争对一些数据库,如Oracle.MariaDB.MongoDB.VoltDB在使用时,要求关闭此功能. ...
- 使用JAVA的URL类处理url事例
import java.net.*; import java.io.*; public class ParseURL { public static void main(String[] args) ...
- angularjs显示html片段
ngBindHtml <div ng-controller="ExampleController"> <p ng-bind-html="myHTML&q ...
- lvalue & rvalue
https://www.youtube.com/watch?v=UTUdhjzws5g 作者:知乎用户链接:https://www.zhihu.com/question/50652989/answer ...
- eclipse 使用tomcat运行JavaWeb项目,文件修改后为何不用重启tomcat? (运行web项目的4种方式)探究
1.情景说明 在eclipse中,为什么Java文件修改后,重启tomcat class文件才能生效? 为什么jsp修改后,不需重启tomcat就能立即生效? 为什么静 ...
- 〖Android〗依据资源信息,Mock Android资源
#!/bin/bash - #=============================================================================== # # F ...
- JAVA中的CountDownLatch、CyclicBarrier、Semaphore的简单测试
因公司需要做一个对于CountDownLatch的分享,特写了此blog. 具体细节可以参见:小结java自带的跟锁相关的一些类 在做这个分享的过程中发现了Main和junit的运行的区别,在另外一个 ...
- isset、empty、var==null、is_null、var===null详细理解
//isset: 判断变量是否被初始化 //它并不会判断变量是否为空,并且可能用来判断数组中元素是否被定义 //听说在数组用isset与array_key_exists高出4倍 $a = " ...