天天看點

openssl之EVP系列之5---EVP_Encrypt系列函數具體解釋(二)

openssl之EVP系列之5---EVP_Encrypt系列函數詳細解釋(二)

    ---依據openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay.txt cipher.doc部分翻譯和自己的了解寫成

    (作者:DragonKing, Mail: [email protected] ,公布于:http://gdwzh.126.com之openssl專業論壇,版本号:openssl-0.9.7)

    前面的文章我們介紹了EVP_ENcrypt系列函數的基本部分,本文将介紹他們的一些擴充部分,即一些參數設定和其他輔助的函數。其定義例如以下(openssl/evp.h):

     int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *x, int padding);

     int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen);

     const EVP_CIPHER *EVP_get_cipherbyname(const char *name);

     #define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a))

     #define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a))

     int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a);

     #define EVP_CIPHER_nid(e) ((e)->nid)

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

     #define EVP_CIPHER_key_length(e) ((e)->key_len)

     #define EVP_CIPHER_iv_length(e) ((e)->iv_len)

     #define EVP_CIPHER_flags(e) ((e)->flags)

     #define EVP_CIPHER_mode(e) ((e)->flags) & EVP_CIPH_MODE)

     int EVP_CIPHER_type(const EVP_CIPHER *ctx);

     #define EVP_CIPHER_CTX_cipher(e) ((e)->cipher)

     #define EVP_CIPHER_CTX_nid(e) ((e)->cipher->nid)

     #define EVP_CIPHER_CTX_block_size(e) ((e)->cipher->block_size)

     #define EVP_CIPHER_CTX_key_length(e) ((e)->key_len)

     #define EVP_CIPHER_CTX_iv_length(e) ((e)->cipher->iv_len)

     #define EVP_CIPHER_CTX_get_app_data(e) ((e)->app_data)

     #define EVP_CIPHER_CTX_set_app_data(e,d) ((e)->app_data=(char *)(d))

     #define EVP_CIPHER_CTX_type(c) EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c))

     #define EVP_CIPHER_CTX_flags(e) ((e)->cipher->flags)

     #define EVP_CIPHER_CTX_mode(e) ((e)->cipher->flags & EVP_CIPH_MODE)

     int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type);

     int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type);

    【EVP_CIPHER_CTX_set_padding】

    該函數設定是否採用padding功能.在算法預設的情況下。是使用标準的塊padding功能的,而且在解密的時候會自己主動接測padding并将它删除。

假設将參數pad設定為0,則padding功能就會被禁止,那麼在加密和解密的時候。資料應該為加密塊長度的整數倍,否則就會出錯。函數恒傳回1。

    【EVP_CIPHER_CTX_set_key_length】

    該函數進行加密算法結構EVP_CIPHER_CTX密鑰長度的設定。

假設算法是一個密鑰長度固定的算法,那麼假設設定的密鑰長度跟它固定的長度不一緻,就會産生錯誤。

    【EVP_get_cipherbyname, EVP_get_cipherbynid和EVP_get_cipherbyobj】

    這三個函數都依據給定的參數傳回一個EVP_CIPHER結構,不同的是給定的參數各自是算法名稱、算法的NID和一個ASN1_OBJECT結構。

詳細的算法名稱、NID以及ASN1_OBJECT結構請參看object/boject.h檔案的定義。

    【EVP_CIPHER_nid和EVP_CIPHER_CTX_nid】

    這兩個函數傳回EVP_CIPHER或EVP_CIPHER_CTX結構内部的算法的NID。傳回的NID值僅僅是一個内部存儲的值。并不一定真的有對應的OBJECT定義。

    【EVP_CIPHER_key_length和EVP_CIPHER_CTX_key_length】

    這兩個函數傳回EVP_CIPHER或EVP_CIPHER_CTX結構内部的算法的密鑰長度。

常量EVP_MAX_KEY_LENGTH定義了全部算法最長的密鑰長度。

須要注意的是,對于EVP_CIPHER_key_length函數來說,對特定的一種算法密鑰長度是不變的。可是EVP_CIPHER_CTX_key_length函數對同一個算法密鑰長度卻是可變的。

    【EVP_CIPHER_iv_length和EVP_CIPHER_CTX_iv_length】

    這兩個函數傳回EVP_CIPHER或EVP_CIPHER_CTX結構内部的算法的初始化向量長度。假設算法不使用IV,那麼就會傳回0。

常量EVP_MAX_IV_LENGTH定義了全部算法最長的IV長度

    【EVP_CIPHER_block_size和EVP_CIPHER_CTX_block_size】

    這兩個函數傳回EVP_CIPHER或EVP_CIPHER_CTX結構内部的算法的加密塊長度。

常量EVP_MAX_IV_LENGTH也是全部算法最長的塊長度。

    【EVP_CIPHER_type和EVP_CIPHER_CTX_type】

    這兩個函數傳回EVP_CIPHER或EVP_CIPHER_CTX結構内部的算法的類型。該類型的值是算法的NID,一般來說,NID忽略了算法的一些參數,如40位和129位RC2算法的NID是同樣的。假設算法沒有對應定義的NID或者不是ASN1所支援的,那麼本函數就會傳回NID_undef。

    【EVP_CIPHER_CTX_cipher】

    該函數傳回EVP_CIPHER_CTX結構裡面的EVP_CIPHER結構。

    【EVP_CIPHER_mode和EVP_CIPHER_CTX_mode】

    這兩個函數傳回對應結構算法的塊加密模式,包含EVP_CIPH_ECB_MODE, EVP_CIPH_CBC_MODE, EVP_CIPH_CFB_MODE和EVP_CIPH_OFB_MODE;假設算法是流加密算法,那麼就傳回EVP_CIPH_STREAM_CIPHER 。

    【EVP_CIPHER_param_to_asn1】

    該函數設定算法結構的參數。一般來說設定的值包含了全部參數和一個IV值。假設算法有IV,那麼調用該函數時IV是必須設定的。該函數必須在所設定的算法結構使用之前(如調用EVP_EncryptUpdate和EVP_DecryptUpdate函數之前)調用。

假設ASN1不支援該算法。那麼調用該函數将導緻失敗。操作成功傳回1,否則傳回0。

    【EVP_CIPHER_asn1_to_param】

    該函數給用算法結構裡面的值設定參數type的結構。

其設定的内容由詳細的算法決定。如在RC2算法中。它會設定IV和有效密鑰長度。

本函數應該在算法結構的基本算法類型已經設定了可是密鑰還沒有設定之前調用。比如,調用EVP_CipherInit函數的時候使用參數IV,并将key設定位NULL,然後就應該調用本函數,最後再調用EVP_CipherInit,這時候除了key設定位NULL外全部參數都應該設定。

當ASN1不支援不支援該算法或者有參數不能設定的時候(如RC2的有效密鑰長度不支援),該函數調用就會失敗。操作成功傳回1,否則傳回0。