openssl之EVP系列之2---對稱加密演算法概述 (轉)

worldblog發表於2007-12-14
openssl之EVP系列之2---對稱加密演算法概述 (轉)[@more@]open之EVP系列之2---對稱演算法概述
 ---根據openssl doccryptoEVP_EncryptInit.pod和docssleay.txt cipher.doc部分翻譯和自己的理解寫成
 (作者:DragonKing, : wzhah@263 ,釋出於:之openssl專業論壇,版本:openssl-0.9.7)
 
 對稱加密演算法封裝的系列名字是以EVP_Encrypt*...*開頭的,其實,這些函式只是簡單了EVP_Cipher*...*系列的同名函式,換一個名字可能是為了更好的區別和理解。除了實現了對稱加密演算法外,EVP_Encrypt*...*系列還對塊加密演算法提供了緩衝功能。以後我們可能會更多使用EVP_Cipher的術語,因為它是真正的實現結構。
 EVP_Cipher*...*得以實現的一個基本結構是下面定義的一個演算法結構,它定義了EVP_Cipher系列函式應該採用什麼演算法進行資料處理,其定義如下(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, int enc);
  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 *, int type, int arg, void *ptr); /* Miscellaneous operations */
  void *app_data;
 }EVP_CIPHER;
 下面對這個結構的部分成員的含義作一些解釋:
 nid——是演算法型別的nid識別號,openssl裡面每個都有一個內部唯一的識別ID
 block_size——是每次加密的資料塊的長度,以位元組為單位
 key_len——各種不同演算法預設的金鑰長度
 iv_len——初始化向量的長度
 init——演算法結構初始化函式,可以設定為加密還是模式
 do_cipher——進行資料加密或解密的函式
 cleanup——釋放EVP_CIPHER_CTX結構裡面的資料和設定。
 ctx_size——設定ctx->cipher_data資料的長度
 set_asn1_parameters——在EVP_CIPHER_CTX結構中透過引數設定一個ASN1_TYPE
 get_asn1_parameters——從一個ASN1_TYPE中取得引數
 ctrl——其它各種操作函式
 app_data——應用資料
 透過定義這樣一個指向這個結構的指標,你就可以在連線的時候只連線自己使用的演算法;而如果你是透過一個整數來指明應該使用什麼演算法的話,會導致所有演算法的程式碼都被連線到程式碼中。透過這樣一個結構,還可以自己增加新的演算法。
 在這個基礎上,每個EVP_Cipher*...*函式都維護著一個指向一個EVP_CIPHER_CTX結構的指標。
 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;
 下面對這個結構部分成員做簡單的解釋:
 cipher——是該結構相關的一個EVP_CIPHER演算法結構
 engine——如果加密演算法是ENGINE提供的,那麼該成員儲存了相關的函式介面
 encrypt——加密或解密的標誌
 buf_len——該結構緩衝區裡面當前的資料長度
 oiv——初始的初始化向量
 iv——工作時候使用的初始化向量
 buf——儲存下來的部分需要資料
 num——在cfb/ofb模式的時候指定塊長度
 app_data——應用程式要處理資料
 key_len——金鑰長度,演算法不一樣長度也不一樣
 cipher_data——加密後的資料
 
 上述兩個結構是EVP_Cipher(EVP_Encrypt)系列的兩個基本結構,它們的其它一些列函式都是以這兩個結構為基礎實現了。evpevp_enc.c是最高層的封裝實現,各種加密的演算法的封裝在p_enc.c裡面實現,解密演算法的封裝在p_dec.c裡面實現,而各個e_*.c檔案則是真正實現了各種演算法的加解密功能,當然它們其實也是一些封裝函式,真正的演算法實現在各個演算法同名目錄裡面的檔案實現。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993244/,如需轉載,請註明出處,否則將追究法律責任。

相關文章