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系列之5---EVP_Encrypt系列函数具体解释(二)

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

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

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

  5. openssl之EVP系列之4---EVP_Encrypt系列函数详解(一)

    EVP_Cipher系列包含了很多函数,我将他们大概分成两部分来介绍,一部分是基本函数系列,就是本文要介绍的,另一个部分是设置函数系列,将在后面的文章进行介绍.基本系列函数主要是进行基本的加密和解密操 ...

  6. openssl 对称加密算法enc命令详解

    1.对称加密算法概述 openssl的加密算法库提供了丰富的对称加密算法,我们可以通过openssl提供的对称加密算法指令的方式使用,也可以通过调用openssl提供的API的方式使用. openss ...

  7. openssl之EVP

    本文参考百度百科和http://blog.csdn.net/gdwzh/article/details/19231 一,什么是openssl? SSL 是一个缩写,代表的是 Secure Socket ...

  8. Day13_06_openssl 对称加密算法enc命令详解

    06_openssl 对称加密算法enc命令详解 一.对称加密算法概述 openssl的加密算法库提供了丰富的对称加密算法,我们可以通过openssl提供的对称加密算法指令的方式使用,也可以通过调用o ...

  9. OpenSSL之X509系列

    OpenSSL之X509系列之1---引言和X509概述 [引言]     X509是系列的函数在我们开发与PKI相关的应用的时候我们都会用到,但是OpenSSL中对X509的描述并不是很多,鉴于些, ...

最新文章

  1. python2的默认数字类型_伪·从零开始学Python - 2.2.1 基本数据类型 - 整型与浮点型...
  2. 090620 刚才修复一个fat32分区的经历
  3. halcon知识:工业相机问答(更新中...)
  4. git经常使用命令和问题
  5. Dotnet全平台下APM-Trace探索
  6. 【牛客 - 157F】三轮(dp,分治fft)
  7. python写前端和js_Python之路【第十二篇】前端之jsdomejQuery
  8. JAVA中 fastjson两个JSONArray叠加,合并 ,方法 addAll()
  9. 写你自己 android 多通道打包工具 可以包libs和.so文件
  10. 【机器学习】选择模型
  11. 一道非齐次方程组解的判定习题--行向量
  12. 禾川plc编程软件_HCP Works(禾川PLC编程工具)V2.26.01.92013 免费版
  13. matlab中abs函数,Abs函数
  14. Android adb脚本文件神器
  15. 在工作中历练思考力,行动力,表达力
  16. ROG 570-E 主板问题:主板发出1长2短的滴滴声,黄灯常亮
  17. Redis底层原理和数据结构-总结篇
  18. 图像分割的 U-Net 系列方法
  19. PMP考试计算题专题
  20. html提取正文,网页正文提取工具Readability

热门文章

  1. 中国式安全感:2亿视频监控镜头守护社会生活
  2. 强化学习Exploration漫游
  3. 人工智能基础-概率分布与函数的基础定义
  4. AI产业落地风向标,2019全球智博会亮点回顾
  5. 当量子计算和机器学习相遇,会碰撞出什么火花?
  6. 机器学习简介之基础理论- 线性回归、逻辑回归、神经网络
  7. 地平线将融资10亿美元,或创AI芯片融资纪录
  8. 听说你用JavaScript写代码?本文是你的机器学习指南
  9. 多项式概率分布(Multinomial probability distribution)和分类分布(categorical distribution)
  10. 增强现实系统的三大关键技术是什么?