《openssl 编程》之数据压缩
16.1?簡介
數據壓縮是將原有數據通過某種壓縮算法計算得到相對數據量小的過程。這種過程是可逆的,即能通過壓縮后的數據恢復出原數據。數據壓縮能夠節省存儲空間,減輕網絡負載。
在即需要加密又需要壓縮的情況下,必須先壓縮再加密,次序不能顛倒。因為加密后的數據是一個無序的數據,對它進行數據壓縮,效果不大。
SSL協議本身支持壓縮算法,Openssl實現也支持壓縮算法。它實現了一個空的壓縮算法(crypto/comp/c_rle.c)并支持zlib壓縮算法(crypto/comp/ c_zlib.c)。openssl中用戶可實現自己的壓縮算法。
當openssl在有zlib庫的平臺下安裝時,需要有zlib 或者zlib-dynamic選項。比如:
./config zlib
./config zlib-dynamic
?????16.2??數據結構
Openssl通過函數地址來抽象數據壓縮。主要數據結構如下:
1)?? COMP_METHOD
該數據結構定義了具體壓縮/解壓函數,這些函數可由用戶自己實現。
typedef struct comp_method_st
{
??????? int type;
??????? const char *name;
??????? int (*init)(COMP_CTX *ctx);
??????? void (*finish)(COMP_CTX *ctx);
int (*compress)(COMP_CTX *ctx,unsigned char *out, unsigned int olen,??????????????????????? unsigned char *in, unsigned int ilen);
int (*expand)(COMP_CTX *ctx,unsigned char *out, unsigned int olen,????????????????????? unsigned char *in, unsigned int ilen);
??????? long (*ctrl)(void);
??????? long (*callback_ctrl)(void);
} COMP_METHOD;
各項意義如下:
type:壓縮算法的nid;
name:壓縮算法的名字;
init:初始化函數;
finish:結束操作;
commpress:具體的壓縮算法,本函數必須實現;
expand:具體的解壓算法,本函數必須實現;
ctrl和callback_ctrl:控制函數與回調控制函數,用于內部控制。
通過COMP_METHOD,Openssl能調用用戶自己實現的壓縮算法。只要用戶實現了COMP_METHOD中的各個函數(主要是compress和expand函數)。
?????? Openssl壓縮源碼位于crypto/comp目錄下。它實現了一個空壓縮算法和zlib壓縮算法。其中空壓縮算法由openssl自己實現,只是簡單的拷貝數據。而zlib算法,openssl實現了基于其接口的COMP_METHOD,需要zlib庫支持(/usr/lib/libz.a,/usr/lib/libz.so)。
2)?? comp_ctx
該結構用于存放壓縮/解壓中的上下文數據,主要供crypto/comp/comp_lib.c使用。
struct comp_ctx_st
?????? ?????? {
?????? ?????? ?????? COMP_METHOD *meth;
?????? ?????? ?????? unsigned long compress_in;
?????? ?????? ?????? unsigned long compress_out;
?????? ?????? ?????? unsigned long expand_in;
?????? ?????? ?????? unsigned long expand_out;
?????? ?????? ?????? CRYPTO_EX_DATA???? ex_data;
?????? ?????? };
?????? ?????? 各項意義如下:
?????? ?????? meth:COMP_METHOD結構,一個comp_ctx通過它指明了一種具體的壓縮算法;
?????? ?????? compress_in:被壓縮數據總字節數;
?????? ?????? compress_out:壓縮數據(結果)總字節數;
?????? ?????? expand_in:被解壓數據總字節數;
?????? ?????? expand_out:解壓數據(結果)總字節數;
?????? ?????? ex_data:供用戶使用的擴展數據,用于存放用戶自定義的信息。
16.3??函數說明
?????? 1)??? COMP_rle
????????????? 返回openssl實現的空壓縮算法,返回值為一個COMP_METHOD。
2)??? COMP_zlib
返回基于zlib庫的COMP_METHOD。
3)? COMP_CTX_new
?????? 初始化上下文,輸入參數為COMP_METHOD。
4)? COMP_compress_block
壓縮計算。
5)? COMP_expand_block
?????? 解壓計算。
16.4? openssl中壓縮算法協商
?????? Openssl中的壓縮算法的協商與加密套件一樣,都是由客戶端在client hello消息中指定一個算法列表,而由服務端決定選取其中的一種,并通過server hello消息來通知客戶端。
?
16.5??編程示例
#include <string.h>
?????? #include <openssl/comp.h>
?????? int??? main()
?????? {
????????????? COMP_CTX????????? *ctx;
????????????? int????????????????? len,olen=100,ilen=50,i,total=0;
????????????? unsigned char in[50],out[100];
????????????? unsigned char expend[200];
??????
?????? #ifdef????? _WIN32
????????????? ctx=COMP_CTX_new(COMP_rle());
?????? #else
????????????? /* for linux */
????????????? ctx=COMP_CTX_new(COMP_zlib());
?????? #endif
????????????? for(i=0;i<50;i++)
???????????????????? memset(&in[i],i,1);
????????????? total=COMP_compress_block(ctx,out,olen,in,50);
????????????? len=COMP_expand_block(ctx,expend,200,out,total);
????????????? COMP_CTX_free(ctx);
????????????? return 0;
?????? }
總結
以上是生活随笔為你收集整理的《openssl 编程》之数据压缩的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《openssl 编程》之大数
- 下一篇: 《openssl 编程》之错误处理