A Fast and Easy to Use AES Library
http://www.codeproject.com/Articles/57478/A-Fast-and-Easy-to-Use-AES-Library
Introduction
EfAesLib is a highly optimized Advanced Encryption Standard (AES) library for the Windows platform 32-bit architecture. The Extreme Fast AES Library is implemented based on the official document:http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf.
The library is actually my personal work. I have decided to put it in the public domain and make it free. The size is a little on the higher side because of some optimization to use space in exchange of time.
I have provided the compiled DLL in VS2008, and the project files; or you can use the source in any other platform, it is just plain 'C'.
Using the code
AES is a 128-bit block encrypt/decrypt algorithm. That means you need to carefully handle the last block which is not 16 bytes aligned. Otherwise, you might be unable to decrypt correctly.
There are many block modes defined in the cipher realm. Different block modes have different characteristics. For example, the CRT mode only needs encryption logic, so it is suitable for low cost hardware implementations. The PCBC mode provides better error propagation. As for CFB, OFB modes, there is an extra parameter: 'feedback size'. You can treat it as the result size of each AES block process. That means, CFB 8-bits mode should be about 16 times slower than CFB 128-bits mode. And also, you can do stream ciphers by using the CFB 8-bits mode.
You can reference the EfAesLib.pdf in the package for details about how the different block modes work.
| Encode/Decode with same process | Need Initial Vector | Chain process | |
|---|---|---|---|
|
ECB |
X |
X |
X |
|
CBC |
X |
O |
O |
|
PCBC |
X |
O |
O |
|
CFB |
O |
O |
O |
|
OFB |
O |
O |
O |
|
CRT |
O |
O |
O |
AES always needs a 128-bit key to encrypt/decrypt. But it is also combined with an initial vector to work with, except in ECB mode. Each bit of the initial vector you use will double the possibilities of encrypted text from a given plain text, which means more safety.
EfAesLib supports ECB, CBC, PCBC, OFB, CFB, CRT block modes, and support OFB,CFB mode with [1..16] bytes feedback size. It also supports in-place encryption/decryption in each mode (source and destination buffer are the same).
The following sample uses Counter mode to encode a file:
#include "EfAes.h"
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc , char * argv[])
{
unsigned char key[16]={
0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,
0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88
};
unsigned char vector[16]={
0x1f,0x32,0x43,0x51,0x56,0x98,0xaf,0xed,
0xab,0xc8,0x21,0x45,0x63,0x72,0xac,0xfc
};
unsigned char buff[4096];
int rd_fd,wr_fd, rdsz;
AesCtx context;
AesSetKey( &context , AES_KEY_128BIT ,BLOCKMODE_CRT, key , vector );
rd_fd = open("test.dat", O_RDONLY);
wr_fd = open("test.encoded",O_WRONLY | O_CREAT);
setmode(rd_fd,O_BINARY);
setmode(wr_fd,O_BINARY);
while( (rdsz = read(rd_fd, buff ,4096)) > 0 )
{
// before last block , the block size
// should always be the multiply of 16
// the last block should be handled
// if the size is not a multiply of 16
AesEncryptCRT(&context , buff, buff, rdsz );
rdsz = AesRoundSize( rdsz, 16);
write( wr_fd , buff , rdsz );
}
close(rd_fd);
close(wr_fd);
}
The use of the AesCtx structure is mainly designed for thread issues. Each encryption session should have its own AesCtx. The EfAesLib APIs will always pad 0 to input data whose size is not a multiple of 16, or a multiple of the feedback size in the CFB, OFB modes.
Optimization
There are pre-defined functions in the AES algorithm. The first step, also proposed in the Wiki, is to combineSubBytes, ShiftRows with MixColumns. The follow is my sample implementation:
void SubAndShiftAndMixRound(uint8 * pState ,uint32 * pRoundKey , uint32 * pOutput)
{
uint32 a1,a2,a3,a4; a1=pState[0];
a2=pState[5];
a3=pState[10];
a4=pState[15]; *pOutput++ =
((SboxXTime2[a1] ^ SboxXTime3[a2] ^ FSB[a3] ^
FSB[a4]) |
((FSB[a1] ^ SboxXTime2[a2] ^ SboxXTime3[a3] ^
FSB[a4]) << 8) |
((FSB[a1] ^ FSB[a2] ^ SboxXTime2[a3] ^
SboxXTime3[a4]) << 16 )|
((SboxXTime3[a1] ^ FSB[a2] ^ FSB[a3] ^
SboxXTime2[a4]) << 24))^ *pRoundKey++; ...........
}
In the second step, notice the horizontal direction of a1, a2, a3, a4. We can reduce this by using a pre-build lookup table for each column.
for(i=0;i<256;i++)
{
TestTable1[i]=SboxXTime2[i] | FSB_8[i] | FSB_16[i] | SboxXTime3_24[i];
TestTable2[i]=SboxXTime3[i] | SboxXTime2_8[i] | FSB_16[i] | FSB_24[i];
TestTable3[i]=FSB[i] | SboxXTime3_8[i] | SboxXTime2_16[i] | FSB_24[i];
TestTable4[i]=FSB[i] | FSB_8[i] | SboxXTime3_16[i] | SboxXTime2_24[i];
}
The code in step one will be optimized to:
void SubAndShiftAndMixRound(uint8 * pState ,uint32 * pRoundKey , uint32 * pOutput)
{
uint32 a1,a2,a3,a4; a1=pState[0];
a2=pState[5];
a3=pState[10];
a4=pState[15]; *pOutput++ = TestTable1[a1] ^ TestTable2[a2] ^ TestTable3[a3] ^
TestTable4[a4] ^ *pRoundKey++;
...........
}
In the third step, notice a1=pState[0],a2=pState[5],a3=pState[10],a4=pState[15]; it is slow in the 32-bit architecture. We can change it to a 32-bit access and XOR the sequence.
Performance
The best performance EfAesLib has is 10M bytes in 78 milliseconds with my Pentium IV 3.0Ghz computer.
Reference
The official document: http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf.
The Wiki
History
v2.0: Extended the library to 128/192/256 bits key length, and also added a 64 bit DLL in addition.
License
This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)
A Fast and Easy to Use AES Library的更多相关文章
- CoRR 2018 | Horovod: Fast and Easy Distributed Deep Learning in Tensorflow
将深度学习模型的训练从单GPU扩展到多GPU主要面临以下问题:(1)训练框架必须支持GPU间的通信,(2)用户必须更改大量代码以使用多GPU进行训练.为了克服这些问题,本文提出了Horovod,它通过 ...
- How to distribute your own Android library through jCenter and Maven Central from Android Studio
In Android Studio, if you wish to include any library to your application. You could just simply add ...
- Extending sparklyr to Compute Cost for K-means on YARN Cluster with Spark ML Library
Machine and statistical learning wizards are becoming more eager to perform analysis with Spark MLli ...
- [Yarn] Use Yarn to Create an Alternative Import Name of an Installed Library
In this lesson we'll show how to use yarn to alias the names of same npm libraries but install diffe ...
- Pyhton开源框架(加强版)
info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...
- Awesome C/C++
Awesome C/C++ A curated list of awesome C/C++ frameworks, libraries, resources, and shiny things. In ...
- C/C++ 框架,类库,资源集合
很棒的 C/C++ 框架,类库,资源集合. Awesome C/C++ Standard Libraries Frameworks Artificial Intelligence Asynchrono ...
- awesome cpp
https://github.com/fffaraz/awesome-cpp Awesome C/C++ A curated list of awesome C/C++ frameworks, lib ...
- 【干货】国外程序员整理的 C++ 资源大全【转】
来自 https://github.com/fffaraz/awesome-cpp A curated list of awesome C/C++ frameworks, libraries, res ...
随机推荐
- .Net Core应用框架Util介绍(一)转
回顾 2015年,正当我还沉迷于JQuery + EasyUi的封装时,突然意识到技术已经过时. JQuery在面对更加复杂的UI需求时显得力不从心,EasyUi虽然组件比较完善,但界面风格老旧,响应 ...
- StretchDIBits速度测试(COLORONCOLOR)
下面是一个测试程序,源码下载
- B. Dispersed parentheses 记忆化搜索 + 括号序列的状压表示
http://codeforces.com/gym/100633/problem/B B. Dispersed parentheses time limit per test 2 seconds me ...
- WCF中的AsyncPattern
WCF中的AsyncPattern (系列博文源自 http://pfelix.wordpress.com/,由笔者翻译并整理,转载请注明) 在wcf 的 service contract中, 服 ...
- 1、二维数组中的查找------------>剑指offer系列
题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- Android上线check_list
Android 上线 check_list 类型 序号 检查项 结果(pass/no) 安装 卸载 1 非Root环境下的安装.卸载 2 Root环境下的安装.卸载 3 安装文件检查,无泄漏用户信息的 ...
- K-means、KNN学习笔记
1.K-means:聚类算法,无监督 输入:k, data[n]; (1) 选择k个初始中心点,例如c[0]=data[0],…c[k-1]=data[k-1]; (2) 对于data[0]….dat ...
- DatePicker 注意点 1.不用v-model 用:value 2.配合on-change进行回调 3.初始值 当天的用 (new Date()).toLocaleDateString().replace(/\//g, '-')
<DatePicker :value="formData.date" type="date" format="yyyy-MM-dd" ...
- 【转】IntelliJ 创建main函数快捷
http://blog.csdn.net/tiantiandjava/article/details/42269173 今天偶然发现了IntelliJ中 创建main函数的快捷键,依次还有for循环, ...
- python爬虫---实现项目(三) Selenium分析美团美食
上一期博客,我本来想爬取美团美食的,但是由于请求头太复杂,没有破解开其中的几个参数,所以放弃,这次我们来用selenium来模式浏览器抓取数据,我们先来简单看一下流程: 1,利用selenium驱动浏 ...