openssl之EVP系列之5---EVP_Encrypt系列函數詳解(二)_openssl
最後更新:2018-08-22
來源:互聯網
上載者:User
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*...*系列函數的編程架構,並舉幾個例子。