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

---依据openssl doc/crypto/EVP_DigestInit.pod翻译和自己的理解写成

(作者:DragonKing, Mail: [email protected] ,公布于:http://openssl.126.com 之openssl专业论坛,版本号:openssl-0.9.7)

EVP_Digest系列提供了与EVP_Encrypt系列相似的函数,定义例如以下(openssl/evp.h):

void EVP_MD_CTX_init(EVP_MD_CTX *ctx);

EVP_MD_CTX *EVP_MD_CTX_create(void);

int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl);

int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt);

int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md,

unsigned int *s);

int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx);

void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx);

int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out,const EVP_MD_CTX *in);

int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type);

int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md,

unsigned int *s);

int EVP_MD_CTX_copy(EVP_MD_CTX *out,EVP_MD_CTX *in);

#define EVP_MAX_MD_SIZE (16+20) /* The SSLv3 md5+sha1 type */

#define EVP_MD_type(e) ((e)->type)

#define EVP_MD_pkey_type(e) ((e)->pkey_type)

#define EVP_MD_size(e) ((e)->md_size)

#define EVP_MD_block_size(e) ((e)->block_size)

#define EVP_MD_CTX_md(e) (e)->digest)

#define EVP_MD_CTX_size(e) EVP_MD_size((e)->digest)

#define EVP_MD_CTX_block_size(e) EVP_MD_block_size((e)->digest)

#define EVP_MD_CTX_type(e) EVP_MD_type((e)->digest)

【EVP_MD_CTX_init】

该函数初始化一个EVP_MD_CTX结构。

【EVP_MD_CTX_create】

该函数创建一个EVP_MD_CTX结构,分配内存并进行初始化,返回该结构。

【EVP_DigestInit_ex】

该函数使用參数impl所指向的ENGINE设置该信息摘要结构体,參数ctx在调用本函数之前必须经过初始化。參数type通常是使用象EVP_sha1这种函数的返回值。假设impl为NULL。那么就会使用缺省实现的信息摘要函数。

大多数应用程序里面impl是设置为NULL的。

操作成功返回1,否则返回0。

【EVP_DigestUpdate】

该函数将參数d中的cnt字节数据进行信息摘要到ctx结构中去。该函数能够被调用多次。用以对很多其它的数据进行信息摘要。操作成功返回1,否则返回0。

【EVP_DigestFinal_ex】

本函数将ctx结构中的摘要信息数据返回到參数md中,假设參数s不是NULL,那么摘要数据的长度(字节)就会被写入到參数s中,大多数情况瞎,写入的值是EVP_MAX_MD_SIZE。在调用本函数后。不能使用同样的ctx结构调用EVP_DigestUpdate再进行数据的信息摘要操作,可是假设调用EVP_DigestInit_ex函数又一次初始化后能够进行新的信息摘要操作。操作成功返回1,否则返回0。

【EVP_MD_CTX_cleanup】

清除一个信息摘要结构,该函数应该在一个信息摘要结构使用后不再须要的时候调用。

【EVP_MD_CTX_destroy】

清除信息摘要结构并释放全部分配的内存空间,仅仅有使用EVP_MD_CTX_create函数创建的信息摘要结构才干使用该函数进行释放。

【EVP_MD_CTX_copy_ex】

该函数能够用来将信息摘要数据从in结构复制到out结构中。假设有大量的数据须要进行信息摘要。并且这些数据仅仅有最后几个字节不同的时候,使用该函数就显得特别实用。节省时间。当中,out结构必须在调用本函数之前进行初始化。操作成功返回1。否则返回0。

【EVP_DigestInit】

该函数功能跟EVP_DigestInit_ex函数同样,可是ctx參数能够不用初始化,并且该函数仅仅使用缺省实现的算法。

【EVP_DigestFinal】

该函数功能跟EVP_DigestFinal_ex函数同样,可是ctx结构会自己主动清除。一般来说,如今新的程序应该使用EVP_DigestInit_ex和EVP_DigestFinal_ex函数。由于这些函数能够在使用完一个EVP_MD_CTX结构后,不用又一次声明和初始化该结构就能使用它进行新的数据处理,并且新的带_ex的函数也能够使用非缺省的实现算法库。

【EVP_MD_CTX_copy】

该函数跟EVP_MD_CTX_copy_ex函数功能同样,可是out參数能够不用初始化。

【EVP_MD_size和EVP_MD_CTX_size】

这两个函数返回结构里面摘要信息的长度。

【EVP_MD_block_size和EVP_MD_CTX_block_size】

这两个函数返回摘要信息块处理的长度。

【EVP_MD_type和EVP_MD_CTX_type】

这两个函数返回信息摘要结构算法的NID。比如。EVP_MD_type(EVP_sha1())返回NID_sha1。该函数通常在设置ASN1 OID的时候使用。假设算法不存在。返回NID_undef。

【EVP_MD_CTX_md】

该函数返回给定EVP_MD_CTX结构里面的EVP_MD结构。

【EVP_MD_pkey_type】

该函数返回信息摘要结构里面公钥签名算法的NID。比如,假设EVP_sha1是使用RSA签名算法,那么就会返回NID_sha1WithRSAEncryption。

【EVP_md2、EVP_md5、EVP_sha、EVP_sha1、EVP_mdc2和EVP_ripemd160】

这些函数返回对应名字的EVP_MD结构,它们都使用RSA算法作为签名算法。在新的程序里,一般推荐使用sha1算法。

【EVP_dss和EVP_dss1】

这两个函数返回的EVP_MD结构分别使用sha和sha1信息摘要算法,可是签名算法使用DSS(DSA)。

【EVP_md_null】

该函数返回的信息摘要结构不作不论什么事情,返回的摘要信息长度为0。

【EVP_get_digestbyname、EVP_get_digestbynid和EVP_get_digestbyobj】

这三个函数分别依据给定的算法名称、算法NID以及ASN1_OBJECT结构返回一个对应的EVP_MD算法结构。

摘要算法在使用之前必须进行初始化,如使用Openssl_add_all_digests进行初始化。假设调用不成功,返回NULL。

时间: 2024-12-15 01:47:25

openssl之EVP系列之8---EVP_Digest系列函数具体解释的相关文章

openssl之EVP系列之10---EVP_Sign系列函数介绍

---依据openssl doc/crypto/EVP_SignInit.pod翻译 (作者:DragonKing, Mail: [email protected] ,公布于:http://openssl.126.com 之openssl专业论坛,版本号:openssl-0.9.7) EVP_Sign系列函数使用的基础结构跟信息摘要算法使用的基础结构是一样的.并且,其前面的两个操作步骤初始化和数据操作(信息摘要)也跟信息摘要算法是一样的,唯一不一样的是最后一步操作.本系列函数做了签名的工作,而信

php安装编译时 configure: error: Cannot find OpenSSL's <evp.h>

=============================================== yum install error: protected multilib versions error===============================================sudo yum downgrade openssl 降级sudo yum install openssl-devel ===另外参考====================================

解决 Cannot find OpenSSL's <evp.h>

yum install openssl openssl-devel ln -s /usr/lib64/libssl.so /usr/lib/ 解决 Cannot find OpenSSL's <evp.h>

【函数】Oracle函数系列(1)--字符函数

[函数]Oracle函数系列(1)--字符函数 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 常见字符函数(lower.upper.initcap.concat.substr.length.intr.lpad.rpad.trim.chr.ascii.replace.translate)的使用 ② 判断字符串中是否含有汉字 ③ substr和instr的联合使用 ④

微软100题系列之-----设计包含min函数的栈

题意: 定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素. 要求函数min.push 以及pop 的时间复杂度都是O(1). 思路:定义两个栈,一个用来记录数据的插入和删除,一个用来存储最小值的变化 代码如下: template <class T> class Stack { public: Stack(int len=100); T Min(); T Pop(); void Push(T val); private: T top1,top2; T *stack1,*stack

思科4500系列与华为9300系列交换机介绍与选配

思科4500系列与华为的9300系列交换机在整个交换机产品的产品线定位来说.都属于企业核心级交换机设备,今天把思科的4500系列和华为9300系列作为一篇文章,一来是这2个产品都是目前在企业当中应用非常广泛的设备,无论是甲方(企业网管)还是乙方(系统集成商)都不陌生.二来是这2个不同厂家的核心级设备都是定位是一个级别的.所以咱们今天就把它们放在一起作为一个专题. 1思科4500系列交换机 思科的4500系列交换机定位在"企业核心级交换机"这个产品线的级别上,典型的模块化交换机,前面一直

curl数据采集系列之单页面采集函数get_html

在做数据采集时经常要使用到curl+正则的方式采集需要的数据 根据自己的工作经验 把自己写的一些常用自定义函数 拿到博客园来分享 如果有写得不恰当的地方 请多多指教 这是一个系列 没办法在一两天写完 所以一篇一篇的发布 大致大纲: 1.curl数据采集系列之单页面采集函数get_html 2.curl数据采集系列之多页面并行采集函数get_htmls 3.curl数据采集系列之正则处理函数get _matches 4.curl数据采集系列之代码分离 5.curl数据采集系列之并行逻辑控制函数we

【T-SQL系列】新的排序函数

原文:[T-SQL系列]新的排序函数 如:ROW_NUMBER.RANK.DENSE_RANK三个分析函数都是按照col1分组内从1开始排序 ROW_NUMBER() 是没有重复值的排序(即使两天记录相等也是不重复的),可以利用它来实现分页 DENSE_RANK() 是连续排序,两个第二名仍然跟着第三名RANK() 是跳跃拍学,两个第二名下来就是第四名 示例: DECLARE @t1 TABLE ( Sequence INT , Name VARCHAR(20) , Score INT ) IN

C++语言笔记系列之十八——虚函数(1)

1.C++中的多态 (1)多态性:同一个函数的调用可以进行不同的操作,函数重载是实现多态的一种手段. (2)联编:在编译阶段进行联接,即是在编译阶段将一个函数的调用点和函数的定义点联接起来. A.静态联编:在编译阶段就完成的函数联编--函数重载. B.动态联编:在程序的运行阶段由系统自动选择具体的函数--虚函数. 注:C++的多态主要指的就是动态联编. 2.虚函数 (1)虚函数是在函数的定义时将其声明为虚函数即可. (2)说明:virtual 数据类型 函数名(参数表) {函数体} A.目的:当