zoukankan      html  css  js  c++  java
  • 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个字节,在加密文件时需要进行字节补齐,所以加密文件的结果可能会和原始文件一样大或者稍大于原始文件。在进行解密运算时,需要在解密后把补齐的字节再去除掉,才能够真正还原原始文件。

  • 相关阅读:
    jwt手动生成access_token
    python学习-52 XML模块
    python学习-51 shelve模块
    python学习-50 pickle模块
    python学习-49 json模块
    python学习-48 模块2
    python学习-47 random模块
    python学习-46 时间模块
    python学习-45 模块
    python学习-44 程序的解耦 (不是特别懂的,回头在复习)
  • 原文地址:https://www.cnblogs.com/huhu0013/p/4788509.html
Copyright © 2011-2022 走看看