• openssl之EVP系列之2---对称加密算法概述


    openssl之EVP系列之2---对称加密算法概述
        ---依据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay.txt cipher.doc部分翻译和自己的理解写成
        (作者:DragonKing, Mail: wzhah@263.net ,公布于:http://gdwzh.126.com之openssl专业论坛,版本号:openssl-0.9.7)
        
        对称加密算法封装的函数系列名字是以EVP_Encrypt*...*开头的。事实上,这些函数仅仅是简单调用了EVP_Cipher*...*系列的同名函数,换一个名字可能是为了更好的差别和理解。除了实现了对称加密算法外。EVP_Encrypt*...*系列还对块加密算法提供了缓冲功能。以后我们可能会很多其它使用EVP_Cipher的术语,由于它是真正的实现结构。


        EVP_Cipher*...*得以实现的一个基本结构是以下定义的一个算法结构,它定义了EVP_Cipher系列函数应该採用什么算法进行数据处理,其定义例如以下(evp.h):
        typedef struct evp_cipher_st
        {
         int nid;
         int block_size;
         int key_len; 
         int iv_len;
         unsigned long flags; 
         int (*init)(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc); 
         int (*do_cipher)(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl);
         int (*cleanup)(EVP_CIPHER_CTX *); 
         int ctx_size;
         int (*set_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); 
         int (*get_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); 
         int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr); /* Miscellaneous operations */
         void *app_data; 
        }EVP_CIPHER;
        以下对这个结构的部分成员的含义作一些解释:
        nid——是算法类型的nid识别号,openssl里面每一个对象都有一个内部唯一的识别ID
        block_size——是每次加密的数据块的长度,以字节为单位
        key_len——各种不同算法缺省的密钥长度
        iv_len——初始化向量的长度
        init——算法结构初始化函数。能够设置为加密模式还是解密模式
        do_cipher——进行数据加密或解密的函数
        cleanup——释放EVP_CIPHER_CTX结构里面的数据和设置。
        ctx_size——设定ctx->cipher_data数据的长度
        set_asn1_parameters——在EVP_CIPHER_CTX结构中通过參数设置一个ASN1_TYPE
        get_asn1_parameters——从一个ASN1_TYPE中取得參数
        ctrl——其他各种操作函数
        app_data——应用数据
        通过定义这样一个指向这个结构的指针,你就能够在连接程序的时候仅仅连接自己使用的算法;而假设你是通过一个整数来指明应该使用什么算法的话,会导致全部算法的代码都被连接到代码中。

    通过这样一个结构。还能够自己添加新的算法。
        在这个基础上,每一个EVP_Cipher*...*函数都维护着一个指向一个EVP_CIPHER_CTX结构的指针。
        typedef struct evp_cipher_ctx_st
        {
         const EVP_CIPHER *cipher;
         ENGINE *engine; 
         int encrypt; 
         int buf_len;
         unsigned char oiv[EVP_MAX_IV_LENGTH];
         unsigned char iv[EVP_MAX_IV_LENGTH]; 
         unsigned char buf[EVP_MAX_BLOCK_LENGTH];
         int num; 
         void *app_data; 
         int key_len; 
         unsigned long flags; 
         void *cipher_data; 
         int final_used;
         int block_mask;
         unsigned char final[EVP_MAX_BLOCK_LENGTH];
         } EVP_CIPHER_CTX;
        以下对这个结构部分成员做简单的解释:
        cipher——是该结构相关的一个EVP_CIPHER算法结构
        engine——假设加密算法是ENGINE提供的,那么该成员保存了相关的函数接口
        encrypt——加密或解密的标志
        buf_len——该结构缓冲区里面当前的数据长度
        oiv——初始的初始化向量
        iv——工作时候使用的初始化向量
        buf——保存下来的部分须要数据
        num——在cfb/ofb模式的时候指定块长度
        app_data——应用程序要处理数据
        key_len——密钥长度,算法不一样长度也不一样
        cipher_data——加密后的数据
        
        上述两个结构是EVP_Cipher(EVP_Encrypt)系列的两个基本结构,它们的其他一些列函数都是以这两个结构为基础实现了。

    文件evp/evp_enc.c是最高层的封装实现,各种加密的算法的封装在p_enc.c里面实现,解密算法的封装在p_dec.c里面实现,而各个e_*.c文件则是真正实现了各种算法的加解密功能。当然它们事实上也是一些封装函数。真正的算法实如今各个算法同名文件夹里面的文件实现。

  • 相关阅读:
    位运算02 零基础入门学习C语言65(完)
    PE格式详细讲解4 系统篇04|解密系列
    PE格式详细讲解4 系统篇04|解密系列
    int指令02 零基础入门学习汇编语言65
    Tabhost漂亮的自定义实现(背景随着选项卡滑动改变)
    Android API Guide 之 User Interface笔记
    java程序员菜鸟进阶(九)windows下搭建SVN服务器及配置myeclipse SVN客户端
    android 左右页面滑动(滑屏)增加layout文件 而不是drawable(还有activity)
    android 最简单的九宫格实现
    ViewPager
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7065749.html
Copyright © 2020-2023  润新知