openssl之EVP系列之7---信息摘要算法結(jié)構(gòu)概述 ---根據(jù)openssl doc\crypto\EVP_DigestInit.pod翻譯和自己的理解寫成 (作者:DragonKing, Mail: [email protected] ,發(fā)布于:http://openssl.126.com 之openssl專業(yè)論壇,版本:openssl-0.9.7) 該系列函數(shù)封裝了openssl加密庫所有的信息摘要算法,,通過這種EVP封裝,當(dāng)使用不同的信息摘要算法時,,只需要對初始化參數(shù)修改一下就可以了,,其它代碼可以完全一樣,。這些算法包括MD2,、MD5以及SHA等算法,。 【EVP_MD結(jié)構(gòu)介紹】 所有的算法都維護著下面定義的結(jié)構(gòu)的一個指針,,在此基礎(chǔ)上實現(xiàn)了算法的功能,。該結(jié)構(gòu)EVP_MD如下: typedef struct env_md_st { int type; int pkey_type; int md_size; unsigned long flags; int (*init)(EVP_MD_CTX *ctx); int (*update)(EVP_MD_CTX *ctx,const void *data,unsigned long count); int (*final)(EVP_MD_CTX *ctx,unsigned char *md); int (*copy)(EVP_MD_CTX *to,const EVP_MD_CTX *from); int (*cleanup)(EVP_MD_CTX *ctx); int (*sign)(); int (*verify)(); int required_pkey_type[5]; /*EVP_PKEY_xxx */ int block_size; int ctx_size; } EVP_MD; 下面對該結(jié)構(gòu)體的部分參數(shù)解釋: type——信息摘要算法的NID標(biāo)識 pkey_type——是信息摘要-簽名算法體制的相應(yīng)NID標(biāo)識,如NID_shaWithRSAEncryption md_size——是信息摘要算法生成的信息摘要的長度,,如SHA算法是SHA_DIGEST_LENGTH,,該值是20 init——指向一個特定信息摘要算法的初始化函數(shù),如對于SHA算法,,指針指向SHA_Init update——指向一個真正計算摘要值的函數(shù),,例如SHA算法就是指向SHA_Update final——指向一個信息摘要值計算之后要調(diào)用的函數(shù),該函數(shù)完成最后的一塊數(shù)據(jù)的處理工作,。例如SHA算法就是指向SHA_Final. copy——指向一個可以在兩個EVP_MD_CTX結(jié)構(gòu)之間拷貝參數(shù)值的函數(shù) required_pkey_type——指向一個用來簽名的算法EVP_PKEY的類型,,如SHA算法就指向EVP_PKEY_RSA_method block_size——一個用來進行信息摘要的輸入塊的的長度(單位是字節(jié)),如SHA算法就是SHA_CBLOCK ctx_size——是CTX結(jié)構(gòu)的長度,,在SHA算法里面應(yīng)該就是sizeof(EVP_MD*)+sizeof(SHA_CTX) 如果你要增加新的算法,,那么可以定義這個結(jié)構(gòu),并進行必要的一直,,然后就可以使用通用的函數(shù)了,。跟EVP_CIPHER系列函數(shù)一樣,使用這個封裝技術(shù),, 就可以在使用一種摘要算法時,,比如MD5,在連接程序的時候就只連接MD5的代碼,。如果使用證書來標(biāo)識算法,,那么就會導(dǎo)致所有其它的信息摘要算法代碼都連 接到程序中去了。 【EVP_MD_CTX結(jié)構(gòu)介紹】 在調(diào)用函數(shù)的時候,,一般來說需要傳入上面說的type的參數(shù)和下面所定義的一個CTX結(jié)構(gòu),,該結(jié)構(gòu)EVP_MD_CTX定義如下: typedef struct env_md_ctx_st { const EVP_MD *digest; ENGINE *engine; unsigned long flags; void *md_data; }EVP_MD_CTX ; 該結(jié)構(gòu)的成員解釋如下: digest——指向上面介紹的EVP_MD結(jié)構(gòu)的指針 engine——如果算法由ENGINE提供,該指針指向該ENGINE md_data——信息摘要數(shù)據(jù) 【支持的信息摘要算法】 EVP_md_null(void) EVP_md2(void) EVP_md4(void) EVP_md5(void) EVP_sha(void) EVP_sha1(void) EVP_dss(void) EVP_dss1(void) EVP_mdc2(void) EVP_ripemd160(void) |
|