openssl之EVP系列之5---EVP_Encrypt系列函数详细解释(二)
    ---依据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系列函数的基本部分,本文将介绍他们的一些扩充部分,即一些參数设置和其他辅助的函数。其定义例如以下(openssl/evp.h):
     int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *x, int padding);
     int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen);
    
     const EVP_CIPHER *EVP_get_cipherbyname(const char *name);
     #define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a))
     #define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a))
     int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a);
    
     #define EVP_CIPHER_nid(e) ((e)->nid)
     #define EVP_CIPHER_block_size(e) ((e)->block_size)
     #define EVP_CIPHER_key_length(e) ((e)->key_len)
     #define EVP_CIPHER_iv_length(e) ((e)->iv_len)
     #define EVP_CIPHER_flags(e) ((e)->flags)
     #define EVP_CIPHER_mode(e) ((e)->flags) & EVP_CIPH_MODE)
     int EVP_CIPHER_type(const EVP_CIPHER *ctx);
    
     #define EVP_CIPHER_CTX_cipher(e) ((e)->cipher)
     #define EVP_CIPHER_CTX_nid(e) ((e)->cipher->nid)
     #define EVP_CIPHER_CTX_block_size(e) ((e)->cipher->block_size)
     #define EVP_CIPHER_CTX_key_length(e) ((e)->key_len)
     #define EVP_CIPHER_CTX_iv_length(e) ((e)->cipher->iv_len)
     #define EVP_CIPHER_CTX_get_app_data(e) ((e)->app_data)
     #define EVP_CIPHER_CTX_set_app_data(e,d) ((e)->app_data=(char *)(d))
     #define EVP_CIPHER_CTX_type(c) EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c))
     #define EVP_CIPHER_CTX_flags(e) ((e)->cipher->flags)
     #define EVP_CIPHER_CTX_mode(e) ((e)->cipher->flags & EVP_CIPH_MODE)
    
     int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type);
     int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type);
    【EVP_CIPHER_CTX_set_padding】
    该函数设置是否採用padding功能.在算法缺省的情况下。是使用标准的块padding功能的,而且在解密的时候会自己主动接測padding并将它删除。

假设将參数pad设置为0,则padding功能就会被禁止,那么在加密和解密的时候。数据应该为加密块长度的整数倍,否则就会出错。函数恒返回1。
    【EVP_CIPHER_CTX_set_key_length】
    该函数进行加密算法结构EVP_CIPHER_CTX密钥长度的设置。

假设算法是一个密钥长度固定的算法,那么假设设置的密钥长度跟它固定的长度不一致,就会产生错误。

    【EVP_get_cipherbyname, EVP_get_cipherbynid和EVP_get_cipherbyobj】
    这三个函数都依据给定的參数返回一个EVP_CIPHER结构,不同的是给定的參数各自是算法名称、算法的NID和一个ASN1_OBJECT结构。

详细的算法名称、NID以及ASN1_OBJECT结构请參看object/boject.h文件的定义。
    【EVP_CIPHER_nid和EVP_CIPHER_CTX_nid】
    这两个函数返回EVP_CIPHER或EVP_CIPHER_CTX结构内部的算法的NID。返回的NID值仅仅是一个内部存储的值。并不一定真的有对应的OBJECT定义。

    【EVP_CIPHER_key_length和EVP_CIPHER_CTX_key_length】
    这两个函数返回EVP_CIPHER或EVP_CIPHER_CTX结构内部的算法的密钥长度。

常量EVP_MAX_KEY_LENGTH定义了全部算法最长的密钥长度。

须要注意的是,对于EVP_CIPHER_key_length函数来说,对特定的一种算法密钥长度是不变的。可是EVP_CIPHER_CTX_key_length函数对同一个算法密钥长度却是可变的。

    【EVP_CIPHER_iv_length和EVP_CIPHER_CTX_iv_length】
    这两个函数返回EVP_CIPHER或EVP_CIPHER_CTX结构内部的算法的初始化向量长度。假设算法不使用IV,那么就会返回0。

常量EVP_MAX_IV_LENGTH定义了全部算法最长的IV长度
    【EVP_CIPHER_block_size和EVP_CIPHER_CTX_block_size】
    这两个函数返回EVP_CIPHER或EVP_CIPHER_CTX结构内部的算法的加密块长度。

常量EVP_MAX_IV_LENGTH也是全部算法最长的块长度。
    【EVP_CIPHER_type和EVP_CIPHER_CTX_type】
    这两个函数返回EVP_CIPHER或EVP_CIPHER_CTX结构内部的算法的类型。该类型的值是算法的NID,一般来说,NID忽略了算法的一些參数,如40位和129位RC2算法的NID是同样的。假设算法没有对应定义的NID或者不是ASN1所支持的,那么本函数就会返回NID_undef。
    【EVP_CIPHER_CTX_cipher】
    该函数返回EVP_CIPHER_CTX结构里面的EVP_CIPHER结构。
    【EVP_CIPHER_mode和EVP_CIPHER_CTX_mode】
    这两个函数返回对应结构算法的块加密模式,包含EVP_CIPH_ECB_MODE, EVP_CIPH_CBC_MODE, EVP_CIPH_CFB_MODE和EVP_CIPH_OFB_MODE;假设算法是流加密算法,那么就返回EVP_CIPH_STREAM_CIPHER 。

    【EVP_CIPHER_param_to_asn1】
    该函数设置算法结构的參数。一般来说设置的值包含了全部參数和一个IV值。假设算法有IV,那么调用该函数时IV是必须设置的。该函数必须在所设置的算法结构使用之前(如调用EVP_EncryptUpdate和EVP_DecryptUpdate函数之前)调用。

假设ASN1不支持该算法。那么调用该函数将导致失败。操作成功返回1,否则返回0。
    【EVP_CIPHER_asn1_to_param】
    该函数给用算法结构里面的值设置參数type的结构。

其设置的内容由详细的算法决定。如在RC2算法中。它会设置IV和有效密钥长度。

本函数应该在算法结构的基本算法类型已经设置了可是密钥还没有设置之前调用。比如,调用EVP_CipherInit函数的时候使用參数IV,并将key设置位NULL,然后就应该调用本函数,最后再调用EVP_CipherInit,这时候除了key设置位NULL外全部參数都应该设置。

当ASN1不支持不支持该算法或者有參数不能设置的时候(如RC2的有效密钥长度不支持),该函数调用就会失败。操作成功返回1,否则返回0。

    【EVP_CIPHER_CTX_ctrl】
    该函数能够设置不同算法的特定的參数。

眼下仅仅有RC2算法的有效密钥长度和RC5算法的加密次数(rounds)能够进行设置。
    
    BTW:我自己感觉都写的有一点慢了。知道大家想知道怎么用来编程,可是,先把这么多函数介绍清楚了,以下看起来就会轻松多了,下一篇就将介绍EVP_Encrypt*...*系列函数的编程框架,并举几个样例。

openssl之EVP系列之5---EVP_Encrypt系列函数具体解释(二)的更多相关文章

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

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

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

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

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

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

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

    openssl之EVP系列之2---对称加密算法概述     ---依据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay.txt cipher.doc ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 安卓实训第四天--基于HttpClient来完毕数据在server和设备间的交互。

    上午:老师首先回想了昨天作业. 首先在安卓project中的TOOLS文件里,解析字节流那里,不用改变.而是把server端的编码方式变为UTF-8,然后将在安卓project的LoginActivi ...

  2. bzoj1801: [Ahoi2009]chess 中国象棋(DP)

    1801: [Ahoi2009]chess 中国象棋 题目:传送门 题解: 表示自己的DP菜的抠脚 %题解... 定义f[i][j][k]表示前i行 仅有一个棋子的有j列 有两个棋子的有k个 的方案数 ...

  3. [学习笔记]AJAX学习

    AJAX学习 ——在w3cschool学习AJAX的学习笔记 参考网站:w3cschool XMLHttpRequest 是 AJAX 的基础. XMLHttpRequest 对象 所有现代浏览器均支 ...

  4. PullToRefreshListView的刷新和加载的控制

         pullToRefresh.setMode(Mode.BOTH);   Mode.BOTH:同时支持上拉下拉 Mode.PULL_FROM_START:只支持下拉Pulling Down M ...

  5. SVN: repository browser 库浏览器

    SVN: repository browser  库浏览器 -----如果不想全部下载,可以通过repository browser  库浏览器 从库中选择要下载的文件夹内容下载(svn针对性下载)

  6. TPC-C测试

    TPC发布的测试标准之一,是专门针对联机事务处理系统(OLTP)的测试标准.1992年发布1.0版本.最新版本5.11,2010年发布. 测试规范中模拟了一个比较复杂并具有代表意义的OLTP应用环境, ...

  7. UI Framework-1: UI Development Practices

    UI Development Practices Guidelines Principles for developing for Chrome. These best practices cente ...

  8. SSD-2(代码部分介绍)

    single shot multibox detectior tensorflow 代码 一.SSD重要参数设置 在ssd_vgg_300.py文件中初始化重要的网络参数,主要有用于生成默认框的特征层 ...

  9. python -迭代器与生成器 以及 iterable(可迭代对象)、yield语句

    我刚开始学习编程没多久,对于很多知识还完全不知道,而有些知道的也是一知半解,我想把学习到的知识记录下来,一是弥补记忆力差的毛病,二也是为了待以后知识能进一步理解透彻时再回来做一个补充. 参考链接: 完 ...

  10. HDU——T 3342 Legal or Not

    http://acm.hdu.edu.cn/showproblem.php?pid=3342 Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...