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. 三步实现沉浸式状态栏(即状态栏与APP同色)

              本篇实现的是沉浸式状态栏.先明白下概念,什么是状态栏?直接上图:                什么是沉浸式状态栏?演示样例图例如以下:                       ...

  2. thinkphp 中模型究竟是什么用?

    thinkphp 中模型究竟是什么用? 问题 似乎所有的操作都能在控制器中就能完成,模型除了几种验证之外,究竟是干什么用的,这个问题一直没理解透 解答 解答一 要明白这个问题,必须了解 MVC 历史. ...

  3. hdoj--1869--六度分离(floyd)

    六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. [JZOJ3383] [NOIP2013模拟] 太鼓达人 解题报告(数位欧拉)

    来源:XLk 摘录 HDU2894 Description 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队 ...

  5. 为Activity生成桌面快捷方式

    有时候如果想让我们的应用在桌面上创建多个快捷方式,我们可以在Manifest.xml文件中对相应的activity进行声明. <application android:icon="@d ...

  6. List<List<model>>如何更快捷的取里面的model?

    访问接口返回数据类型为List<List<model>>,现在想将其中的model插入数据库,感觉一点点循环有点傻,0.0...,各位有没有其他的方法? List<Lis ...

  7. SQL--通过身份证号得到年龄的

    /* =======================================创 建 人:CuiYaChao创建日期:2017-08-16功能描述:通过身份证号来计算年龄单元名称: Fun_Ge ...

  8. Redis特点以及安装

       Mysql 的数据 是以"文件形式存储在硬盘"里边.硬盘运行速度相比较CPU.内存是排在第三的.而 Redis 是内存高速缓存数据库,运行速度比 Mysql 速度快,也支持数 ...

  9. jquery validate验证规则重用

    当多个控件验证规则相同时,如何避免冗余代码并应用相同规则呢? [1st way. addMethod+addClassRules] 场景:维护学生档案时需要维护父母.监护人.紧急联系人的身份证号码,此 ...

  10. 编码问题异常处理:UnicodeDecodeError: 'gbk' codec can't...

    作为编码问题集合: 2)UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbd in position 0: invalid start by ...