openssl之evp系列之6---evp_encrypt系列函式程式設計架構及例子
在前面的兩篇文章,已經對evp_encrypt*...*系列函式做了詳細的介紹,本章將說明該系列函式通用的應用架構,並舉幾個函式應用例子。
【應用架構】
一般來說,evp_encrypt*...*系列函式的應用架構如下所描述(假設加密演算法為3des):
定義一些必須的變數
char key[evp_max_key_length];
char iv[evp_max_iv_length];
evp_cipher_ctx ctx;
unsigned char out[512+8];
int outl;
2. 給變數key和iv賦值,這裡使用了函式evp_bytestokey,該函式從輸入密碼產生了金鑰key和初始化向量iv,該函式將在後面做介紹。如果可以有別的辦法設定key和iv,該函式的呼叫不是必須的
evp_bytestokey(evp_des_ede3_cbc,evp_md5,null,passwd,strlen(passwd),key,iv);
3.初始加密演算法結構evp_cipher_ctx
evp_encryptinit_ex(&ctx, evp_des_ede3_cbc(), null, key, iv);
4.進行資料的加密操作
while (....)
一般來說採用了迴圈的結構進行處理,每次迴圈加密資料為512位元組,密文輸出到out,out和int應該是指向不相同的記憶體的。
5.結束加密,輸出最後的一段512位元組的資料
evp_encryptfinal_ex(&ctx, out, &outl)
該函式會進行加密的檢測,如果加密過程有誤,一般會檢查出來。
說明:加密跟上述過程是一樣的,只不過要使用evp_decrypt*...*系列函式。
【例子】
1.取得演算法rc5使用的迴圈次數(round)
int nrounds;
evp_cipher_ctx_ctrl(ctx, evp_ctrl_get_rc5_rounds, 0, &nrounds);
2.取得演算法rc2的有效金鑰長度
int key_bits;
evp_cipher_ctx_ctrl(ctx, evp_ctrl_get_rc2_key_bits, 0, &key_bits);
3.設定演算法rc5使用的迴圈次數(round)
int nrounds;
evp_cipher_ctx_ctrl(ctx, evp_ctrl_set_rc5_rounds, nrounds, null);
4.設定演算法rc2的有效金鑰長度
int key_bits;
evp_cipher_ctx_ctrl(ctx, evp_ctrl_set_rc2_key_bits, key_bits, null);
5.使用blowfish演算法加密乙個字串
int do_crypt(char *outfile)
;unsigned char iv = ;
char intext = "some crypto text";
evp_cipher_ctx ctx;
file *out;
evp_cipher_ctx_init(&ctx);
evp_encryptinit_ex(&ctx, evp_bf_cbc(), null, key, iv);
if(!evp_encryptupdate(&ctx, outbuf, &outlen, intext, strlen(intext)))
//注意,傳入給下面函式的輸出快取引數必須注意不能覆蓋了原來的加密輸出的資料
if(!evp_encryptfinal_ex(&ctx, outbuf + outlen, &tmplen))
outlen += tmplen;
evp_cipher_ctx_cleanup(&ctx);
//注意,儲存到檔案的時候要使用二進位制模式開啟檔案,因為密文資料是二進位制的,而且,不能採用strlen函式,因為密文字串不是以null(0)為結束的字串
out = fopen(outfile, "wb");
fwrite(outbuf, 1, outlen, out);
fclose(out);
return 1;
}上面舉的例子加密的密文可以使用openssl提供的應用程式cipher.exe來解密,命令如下:
openssl bf -in cipher.bin -k 000102030405060708090a0b0c0d0e0f -iv 0102030405060708 -d
6.使用檔案i/o和80位金鑰rc2演算法的通用加密解密函式例項,該函式可以進行加密,也可以進行解密,由引數do_encrypt決定,該引數為1時則執行加密,為0時則執行解密。
int do_crypt(file *in, file *out, int do_encrypt)
fwrite(outbuf, 1, outlen, out);
}if(!evp_cipherfinal_ex(&ctx, outbuf, &outlen))
fwrite(outbuf, 1, outlen, out);
evp_cipher_ctx_cleanup(&ctx);
return 1;
}openssl之evp系列之7---資訊摘要演算法結構概述
---根據openssl doc\crypto\evp_digestinit.pod翻譯和自己的理解寫成
之openssl專業論壇,版本:openssl-0.9.7)
該系列函式封裝了openssl加密庫所有的資訊摘要演算法,通過這種evp封裝,當使用不同的資訊摘要演算法時,只需要對初始化引數修改一下就可以了,其它**可以完全一樣。這些演算法包括md2、md5以及sha等演算法。
【evp_md結構介紹】
所有的演算法都維護著下面定義的結構的乙個指標,在此基礎上實現了演算法的功能。該結構evp_md如下:
typedef struct env_md_st
evp_md;
下面對該結構體的部分引數解釋:
如果你要增加新的演算法,那麼可以定義這個結構,並進行必要的一直,然後就可以使用通用的函式了。跟evp_cipher系列函式一樣,使用這個封裝技術,就可以在使用一種摘要演算法時,比如md5,在連線程式的時候就只連線md5的**。如果使用證書來標識演算法,那麼就會導致所有其它的資訊摘要演算法**都連線到程式中去了。
【evp_md_ctx結構介紹】
在呼叫函式的時候,一般來說需要傳入上面說的type的引數和下面所定義的乙個ctx結構,該結構evp_md_ctx定義如下:
typedef struct env_md_ctx_st
evp_md_ctx ;
該結構的成員解釋如下:
【支援的資訊摘要演算法】
evp_md_null(void)
evp_md2(void)
evp_md4(void)
evp_md5(void)
evp_sha(void)
evp_sha1(void)
evp_dss(void)
evp_dss1(void)
evp_mdc2(void)
evp_ripemd160(void)
1123分享總結
var jsondata function createtree jsons,subnetnode return ul function function factorial num else var truefactorial factorial factorial function alert ...
12 10分享會心得
有幸參加了ucai組織的一場分享會,感覺收穫還是蠻大的,不僅見識到了許多大牛,還獲得了一些學習方法,收穫頗豐!在這裡我見到了php的swoole擴充套件的開發者王晶 半桶水,也見到了熊家貴這樣的android大牛,以及各種ceo和cto。後面也聽了一些優秀者的分享會,感覺他們的經歷都挺傳奇的,日後必...
hdu 3400 Line belt 三分套三分)
題意 在乙個二維空間中給出兩條線段ab,cd,線段ab,cd上的運動速度分別為p,q。在這兩條線段之外的空間上運動的速度為r。求從a到d的最短時間。思路 ps 在這種求解方法中,中間運用了比較多的除法,導致精度損失,所以再開方前加乙個eps,防止開方後的值比真實值小。include include ...