|
對稱加密算法封裝的函數(shù)系列名字是以EVP_Encrypt*...*開頭的,其實,這些函數(shù)只是簡單調(diào)用了EVP_Cipher*...*系列的同名函數(shù),換一個名字可能是為了更好的區(qū)別和理解。除了實現(xiàn)了對稱加密算法外,EVP_Encrypt*...*系列還對塊加密算法提供了緩沖功能。以后我們可能會更多使用EVP_Cipher的術語,因為它是真正的實現(xiàn)結(jié)構(gòu)。 EVP_Cipher*...*得以實現(xiàn)的一個基本結(jié)構(gòu)是下面定義的一個算法結(jié)構(gòu),它定義了EVP_Cipher系列函數(shù)應該采用什么算法進行數(shù)據(jù)處理,其定義如下(evp.h): typedef struct evp_cipher_st { int nid; int block_size; int key_len; int iv_len; unsigned long flags; int(*init)(EVP_CIPHER_CTX* ctx,const unsigned char* key,const unsigned char* iv,intenc); int(*do_cipher)(EVP_CIPHER_CTX*ctx,unsigned char* out,const unsigned char*in,unsigned int inl); int(*cleanup)(EVP_CIPHER_CTX*); int ctx_size; int(*set_asn1_parameters)(EVP_CIPHER_CTX*,ASN1_TYPE*); int(*get_asn1_parameters)(EVP_CIPHER_CTX*,ASN1_TYPE*); int(*ctrl)(EVP_CIPHER_CTX*,inttype,intarg,void*ptr);/*Miscellaneousoperations*/ void*app_data; }EVP_CIPHER; 下面對這個結(jié)構(gòu)的部分成員的含義作一些解釋: nid——是算法類型的nid識別號,openssl里面每個對象都有一個內(nèi)部唯一的識別ID block_size——是每次加密的數(shù)據(jù)塊的長度,以字節(jié)為單位 key_len——各種不同算法缺省的密鑰長度 iv_len——初始化向量的長度 init——算法結(jié)構(gòu)初始化函數(shù),可以設置為加密模式還是解密模式 do_cipher——進行數(shù)據(jù)加密或解密的函數(shù) cleanup——釋放EVP_CIPHER_CTX結(jié)構(gòu)里面的數(shù)據(jù)和設置。 ctx_size——設定ctx->cipher_data數(shù)據(jù)的長度 set_asn1_parameters——在EVP_CIPHER_CTX結(jié)構(gòu)中通過參數(shù)設置一個ASN1_TYPE get_asn1_parameters——從一個ASN1_TYPE中取得參數(shù) ctrl——其它各種操作函數(shù) app_data——應用數(shù)據(jù) 通過定義這樣一個指向這個結(jié)構(gòu)的指針,你就可以在連接程序的時候只連接自己使用的算法;而如果你是通過一個整數(shù)來指明應該使用什么算法的話,會導致所有算法的代碼都被連接到代碼中。通過這樣一個結(jié)構(gòu),還可以自己增加新的算法。 在這個基礎上,每個EVP_Cipher*...*函數(shù)都維護著一個指向一個EVP_CIPHER_CTX結(jié)構(gòu)的指針。 typedef struct evp_cipher_ctx_st { const EVP_CIPHER* cipher; ENGINE* engine; int encrypt; int buf_len; unsigned char oiv[EVP_MAX_IV_LENGTH]; unsigned char iv[EVP_MAX_IV_LENGTH]; unsigned char buf[EVP_MAX_BLOCK_LENGTH]; int num; void* app_data; int key_len; unsigned long flags; void* cipher_data; int final_used; int block_mask; unsigned char final[EVP_MAX_BLOCK_LENGTH]; }EVP_CIPHER_CTX;
下面對這個結(jié)構(gòu)部分成員做簡單的解釋: 上述兩個結(jié)構(gòu)是EVP_Cipher(EVP_Encrypt)系列的兩個基本結(jié)構(gòu),它們的其它一系列函數(shù)都是以這兩個結(jié)構(gòu)為基礎實現(xiàn)了。文件evp\evp_enc.c是最高層的封裝實現(xiàn),各種加密的算法的封裝在p_enc.c里面實現(xiàn),解密算法的封裝在p_dec.c里面實現(xiàn),而各個e_*.c文件則是真正實現(xiàn)了各種算法的加解密功能,當然它們其實也是一些封裝函數(shù),真正的算法實現(xiàn)在各個算法同名目錄里面的文件實現(xiàn)。 |
|
|