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 ");
    else
        printf("test fail ");
}

这里的例程实际上是使用AES加密算法的ECB模式,另外还有CBC,CFB,OFB三种模式,简单的说,后面三种模式实际上是让上一个16字节的数据块加密的结果参与下一个16字节数据块加密运算,所以采用ECB模式进行加密时对内容相同的数据块加密的结果是相同的,采用CBC,CFB,OFB三种模式三种模式时加密的结果不光与源数据块内容相关,还跟加密的顺序有关。

最后再提一点,采用分组加密算法的时候,由于加密数据的最小单位是分组的大小,如aes的16个字节,des的8个字节,在加密文件时需要进行字节补齐,所以加密文件的结果可能会和原始文件一样大或者稍大于原始文件。在进行解密运算时,需要在解密后把补齐的字节再去除掉,才能够真正还原原始文件。

原文地址:https://www.cnblogs.com/huhu0013/p/4788509.html