原文鏈接: 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個字節,在加密文件時需要進行字節補齊,所以加密文件的結果可能會和原始文件一樣大或者稍大於原始文件。在進行解密運算時,需要在解密后把補齊的字節再去除掉,才能夠真正還原原始文件。