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文件则是真正实现了各种算法的加解密功能。当然它们事实上也是一些封装函数。真正的算法实如今各个算法同名文件夹里面的文件实现。

openssl之EVP系列之2---对称加密算法概述的更多相关文章

  1. openssl之EVP系列之1---算法封装

    openssl之EVP系列之1---算法封装     ---依据openssl doc/crypto/EVP.pod翻译和自己的理解写成     (作者:DragonKing, Mail: wzhah ...

  2. openssl之EVP系列之12---EVP_Seal系列函数介绍

    openssl之EVP系列之12---EVP_Seal系列函数介绍     ---依据openssl doc/crypto/EVP_SealInit.pod翻译和自己的理解写成     (作者:Dra ...

  3. openssl之EVP系列之13---EVP_Open系列函数介绍

    openssl之EVP系列之13---EVP_Open系列函数介绍     ---依据openssl doc/crypto/EVP_OpenInit.pod翻译和自己的理解写成     (作者:Dra ...

  4. openssl之EVP系列之6---EVP_Encrypt系列函数编程架构及样例

    openssl之EVP系列之6---EVP_Encrypt系列函数编程架构及样例     ---依据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay. ...

  5. openssl之EVP系列之5---EVP_Encrypt系列函数具体解释(二)

    openssl之EVP系列之5---EVP_Encrypt系列函数详细解释(二)    ---依据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay.t ...

  6. openssl之EVP系列之9---EVP_Digest系列函数的一个样例

    openssl之EVP系列之9---EVP_Digest系列函数的一个样例     ---依据openssl doc/crypto/EVP_DigestInit.pod翻译     (作者:Drago ...

  7. openssl之EVP系列之8---EVP_Digest系列函数具体解释

    openssl之EVP系列之8---EVP_Digest系列函数具体解释     ---依据openssl doc/crypto/EVP_DigestInit.pod翻译和自己的理解写成     (作 ...

  8. openssl之EVP系列之7---信息摘要算法结构概述

    openssl之EVP系列之7---信息摘要算法结构概述     ---依据openssl doc/crypto/EVP_DigestInit.pod翻译和自己的理解写成     (作者:Dragon ...

  9. openssl之EVP系列之11---EVP_Verify系列函数介绍

    openssl之EVP系列之11---EVP_Verify系列函数介绍     ---依据openssl doc/crypto/EVP_VerifyInit.pod翻译和自己的理解写成     (作者 ...

随机推荐

  1. hiho一下第76周《Suzhou Adventure》

    我是菜鸡,我是菜鸡,我是菜鸡....重要的事说三遍 算是第一次做树形dp的题吧,不太难.. 园林构成一棵树,root为1,Hi从root出发,有k个园林必须玩,每个园林游玩后会得到权值w[i],最多玩 ...

  2. 微信小程序蓝牙连接小票打印机

    1.连接蓝牙 (第一次发表博客)   第一步打开蓝牙并搜索附近打印机设备// startSearch: function() { var that = this wx.openBluetoothAda ...

  3. js与jquery基础知识对比(一)---2017-05-06

    用表格做的,想要对比的内容一目了然,红色部分为重点   js jquery 取元素 id: document.getElementById("aa"); 取到的是dom对象 cla ...

  4. 3.TinkPHP中的模型

    1.配置数据库的连接设置 数据库的连接配置项可以在系统的主配置文件中 2.什么是模型? 模型是MVC 三大组成部分的M,作用是负责与数据表达额交互(CRUD) 3.模型的创建 命名规范:不带前缀的标明 ...

  5. 自定义安装MS Office Project2007会出错

    作者:朱金灿 来源:http://blog.csdn.net/clever101 今天使用虚拟光驱文件自定义安装MSOffice Project2007,如下图: 然后总是出现一个错误: 从网上找来一 ...

  6. SQLServer 事务的隔离级别

    SQLServer事务的隔离级别 数据库是要被广大客户所共享访问的,那么在数据库操作过程中很可能出现以下几种不确定情况. 更新丢失(Lost update) 两个事务都同时更新一行数据,但是第二个事务 ...

  7. phpExcel导出大量数据出现内存溢出错误的解决方法

    phpExcel将读取的单元格信息保存在内存中,我们可以通过 代码如下:PHPExcel_Settings::setCacheStorageMethod() 来设置不同的缓存方式,已达到降低内存消耗的 ...

  8. CorelDRAW X8官方正版特惠下载

    CorelDRAW X8自发布以来,价格居高不下,这也使一众忠粉望而却步,之前看过CorelDRAW做活动,都是X6\X7这些比较早的版本,比较新的版本也没做什么优惠,不过还好看了一下,CorelDR ...

  9. 前端swiper使用指南

    swiper 在网页中常用的方法 1.使用时在页面引入 <link rel="stylesheet" href="front/css/swiper.min.css& ...

  10. div与div之间的拖拽

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...