1. 程式人生 > >openssl框架閒談--EVP加密/解密介面(附:加密)

openssl框架閒談--EVP加密/解密介面(附:加密)

openssl 框架中的另一個重頭戲就是EVP介面,它提供了所有的加密和解密實現,不但封裝了已有的著名演算法,而且其簡單易用的介面可以讓你自己輕鬆實現一個演算法,這 就增強了它的可擴充套件性,基本上,openssl只是提供了機制框架,策略由使用者實現。EVP介面的重要資料結構如下:
typedef struct evp_cipher_st
{
    int nid;        //物件識別ID
    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);     //操作函式
    void *app_data;
}EVP_CIPHER;
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;
我 們看一下EVP有幾種被使用的方式,首先它可以直接被使用,也就是直接生成一個特定加密演算法EVP_CIPHER物件即可,然後呼叫其do_cipher 實現加密或者解密,另外如果我們在更加複雜的環境或者更加複雜的流程中使用它的話,那麼就需要更大的資料結構EVP_CIPHER_CTX來作為一個上下 文環境來包容一個特定的加密解密演算法,比如它可以包含在一個BIO之中:
typedef struct enc_struct
{
    int buf_len;
     int buf_off;
     int cont;               /* <= 0 when finished */
     int finished;
     int ok;                 /* bad decrypt */
     EVP_CIPHER_CTX cipher;
     char buf[ENC_BLOCK_SIZE+BUF_OFFSET+2];
} BIO_ENC_CTX;
本 身來講,BIO中就有那麼一種過濾型別的BIO專門就是為了加密解密用的。另外用於ssl是必然的,本身openssl中最拿手的就是這個EVP了,所有 的安全加密解密都由它來實現,ssl本身就是安全相關的協議,因此實用角度,EVP的意義對於openssl來講比BIO更加重要。因此正如下文講的 SSL結構體中就有一個EVP的指標。
附:加密
迄今為止,加密演算法分為對稱演算法和不對稱演算法又稱公鑰演算法,公鑰演算法自然不必多說,依賴數 學函式的反解困難性,安全性大大提供,但是缺點就是太聰明瞭,導致不太容易被硬體實現,或者用軟體實現速度也不佳,而對稱演算法由於基本都是靠置換和移位來 加密的,而計算機硬體最擅長的可能就是做這種事情了,因此往往都是使用公鑰演算法交換對稱金鑰,然後用對稱演算法進行加密,但是問題是,為何眾人皆知的過程最 終就可以加密資料呢?要知道S盒之類的可是公開的啊。其實很簡單,這就是混亂和和諧的辯證,1000中和諧只要加入1個混亂,那麼結果就是混亂的,這是信 息熵決定的。和諧和混亂本來就是不是對稱的,因為和諧的資訊熵更低,而混亂的資訊熵更高,同樣數量的和諧和混亂資訊熵不同,因此人們徹底搞清楚資訊含義所 付出的努力也不會相同。如果一個數字序列,很和諧,1,2,3,4..突然在403後面來了一個37,是不是暈了,前面的假設被推翻,有時候就是這樣,混 亂不一定越多越亂,在有序當中插入一點混亂就不得了了,對稱加密演算法中的置換其實就是為了掩人耳目的。事實證明,如果完全用混亂的加密演算法,效率很差,效 果不一定多好,混入一些可以高效實現的置換,移位,不會因為這些操作是有序的就很容易被破解,效率還可以得到大大提升,要點就是整個加密過程不是完全的有 序的,而是混雜進了一點點無序,哪怕每次加一點或者說線性加入,解密難度將會指數級上升。