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*...*系列函数的编程框架,并举几个样例。

转载于:https://www.cnblogs.com/zhchoutai/p/8426118.html

openssl之EVP系列之5---EVP_Encrypt系列函数具体解释(二)相关推荐

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

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

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

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

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

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

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

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

  5. openssl之EVP

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

  6. XML系列之--解析电文格式的XML(二)

    上一节介绍了XML的结构以及如何创建.讲到了XML可作为一种简单文本存储数据,把数据存储起来,以XML的方式进行传递.当接收到XML时,必不可少的就是对其进行解析,捞取有效数据,或者将第三方数据以节点 ...

  7. [译]Effective Kotlin系列之探索高阶函数中inline修饰符(三)

    简述: 不知道是否有小伙伴还记得我们之前的Effective Kotlin翻译系列,之前一直忙于赶时髦研究Kotlin 1.3中的新特性.把此系列耽搁了,赶完时髦了还是得踏实探究本质和基础,从今天开始 ...

  8. openresty开发系列14--lua基础语法3函数

    openresty开发系列14--lua基础语法3函数 一)function (函数) 有名函数: optional_function_scope function function_name( ar ...

  9. JS组件系列——Bootstrap Table 表格行拖拽(二:多行拖拽)

    原文:JS组件系列--Bootstrap Table 表格行拖拽(二:多行拖拽) 前言:前天刚写了篇JS组件系列--Bootstrap Table 表格行拖拽,今天接到新的需要,需要在之前表格行拖拽的 ...

最新文章

  1. jquery插件Loadmask
  2. Python列表和元祖
  3. Android移动开发之【Android实战项目】DAY15-翻页效果原理
  4. nginx有10个以上参数rewrite的处理
  5. LeetCode 558. 四叉树交集(递归)
  6. shell 脚本学习(一)
  7. java怎么一段字符串全为数字_java 如何判断一个字符串是数字
  8. 格式小结 css 0926
  9. 函数和常用模块【day04】:内置函数(十)
  10. 查看anaconda环境下各个包的版本
  11. html手机验证码登录页面代码,htmlunit 模拟登录 数字验证码(示例代码)
  12. CentOS使用DNF配置
  13. VC2010编译源代码编辑控件scintilla
  14. 【关于NAT64的实现】
  15. Hibernate 第一个程序的问题Unknown entity(新手必看)
  16. 从零开始手写 VIO
  17. 基于二元语义的中文语序分析
  18. 数据库中关于preparedStatement和Statement分析
  19. 硬件中的三角函数计算 Cordic算法入门
  20. 搜狗workflow项目研究(三)线程池

热门文章

  1. Vue自定义滚动条niceScroll
  2. SQL Server详细使用教程(包含启动SQL server服务、建立数据库、建表的详细操作) 非常适合初学者
  3. SAS杂谈--001--如何配置使用增强编辑器
  4. ubuntu20虚拟机安装VMtools后无法传输文件
  5. 安装 Chrome 插件:Stylish、xStyle​、Tampermonkey、SwitchyOmega
  6. Java开源项目—知识付费(多个版本)
  7. java蓝桥杯——矩形面积交
  8. Docker容器网络实例管理
  9. ClusterProfiler在线基因集富集分析,支持自定义基因集、任意物种
  10. 山西将部署5万个5G基站,并对5G基站进行电价补贴