小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

openssl之EVP系列之2---對稱加密算法概述

 MikeDoc 2011-01-04
對稱加密算法封裝的函數(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)部分成員做簡單的解釋:
cipher——
是該結(jié)構(gòu)相關的一個EVP_CIPHER算法結(jié)構(gòu)
engine——
如果加密算法是ENGINE提供的,那么該成員保存了相關的函數(shù)接口
encrypt——
加密或解密的標志
buf_len——
該結(jié)構(gòu)緩沖區(qū)里面當前的數(shù)據(jù)長度
oiv——
初始的初始化向量
iv——
工作時候使用的初始化向量
buf——
保存下來的部分需要數(shù)據(jù)
num——
cfb/ofb模式的時候指定塊長度
app_data——
應用程序要處理數(shù)據(jù)
key_len——
密鑰長度,算法不一樣長度也不一樣
cipher_data——
加密后的數(shù)據(jù)


       上述兩個結(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)。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多