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. C++学习第一天--编译命令

    前一个月的时间主要是在捯饬自己的ubuntu vim环境,昨天终于都搞好了,从今天开始,学习C++.至于为什么学习C++,其实很大一部分原因还是因为自己喜欢vim,又听说vim对C++的支持还不错,所 ...

  2. java9新特性-3-JDK 和 JRE 的改变

    1.JDK 与 JRE 的关系 JDK :JavaDevelopmentKit (Java开发工具包) JRE :JavaRuntimeEnvironment (Java运行环境)     说明: J ...

  3. CUDA学习笔记(三)

    近期对CUDA的理解,是对库的利用. 1 nvcc.exe是CUDA C编译器. 2 cudart.dll是CUDA运行时API动态链接库. 3 在Sdk目录下,\lib有CUTIL.CUDPP等函数 ...

  4. VS2012恢复默认设置的2种方法

    方法一: 工具 → 导入和导出设置 → 重置所有设置 → 下一步 → 选择“是否保存当前设置”,下一步 → 选择“要重置的开发语言(如,Visual C# 开发设置)” → 完成. 方法二: 1.依次 ...

  5. c# static 常量

    1 关键字 static 修饰 类  字段 属性 方法 ,标记static的就不用创建类的实例调用了,直接通过类名点出来 2 用于变量前,表示每次重新使用该变量所在的方法,类或者自定义的类时,变量的值 ...

  6. <<大学>>原文

    大学之道,在明明德,在亲民,在止于至善.知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得.物有本末,事有终始,知所先后,则近道矣. 古之欲明明德于天下者,先治其国,欲治其国者,先齐其家:欲 ...

  7. 20180929 北京大学 人工智能实践:Tensorflow笔记08

    https://www.bilibili.com/video/av22530538/?p=28 ———————————————————————————————————————————————————— ...

  8. 【转】 java RSA加密解密实现

    [转] java RSA加密解密实现 该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar 下载地址:http://download.csdn.net/detai ...

  9. 洛谷——P1965 转圈游戏

    https://www.luogu.org/problem/show?pid=1965 题目描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n- ...

  10. 减少UIViewController切换的耦合

    我们一般切换UIViewController的时候用的是例如以下代码 #import "UIViewControllerDemo.h" UIViewControllerDemo * ...