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


openssl之EVP系列之5---EVP_Encrypt系列函數詳細解釋(二)
    ---依據openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay.txt cipher.doc部分翻譯和自己的理解寫成
    (作者:DragonKing, Mail: wzhah@263.net ,公布於: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。


    【EVP_CIPHER_CTX_ctrl】
    該函數能夠設置不同算法的特定的參數。

眼下僅僅有RC2算法的有效密鑰長度和RC5算法的加密次數(rounds)能夠進行設置。
    
    BTW:我自己感覺都寫的有一點慢了。知道大家想知道怎么用來編程,可是,先把這么多函數介紹清楚了,以下看起來就會輕松多了,下一篇就將介紹EVP_Encrypt*...*系列函數的編程框架,並舉幾個樣例。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM