cipher加密套件(openssl)

2021-07-05 03:22:24 字數 1365 閱讀 9153

乙個加密套件指明了ssl握手階段和通訊階段所應該採用的各種演算法。這些演算法包括:認證演算法、金鑰交換演算法、對稱演算法和摘要演算法等。

在握手初始化的時候,雙方都會匯入各自所認可的多種加密套件。在握手階段,由服務端選擇其中的一種加密套件。

openssl的ciphers命令可以列出所有的加密套件。openssl的加密套件在s3_lib.c 的

ssl3_ciphers陣列中定義。比如有:

/* cipher 05 */

其中1表示是合法的加密套件;

ssl3_txt_rsa_rc4_128_sha為加密套件的名字,

ssl3_ck_rsa_rc4_128_sha 為 加密套件 id ,

ssl_krsa|ssl_arsa|ssl_rc4 |ssl_sha1|ssl_sslv3 表明了各種演算法,

其中金鑰交換採用rsa演算法(ssl_krsa),認證採用rsa演算法(ssl_arsa),對稱加密演算法採用rc4演算法(ssl_rc4),摘要採用sha1,採用ssl協議第三版本,

ssl_not_exp|ssl_medium表明演算法的強度。

在客戶端和伺服器端建立安全連線之前,雙方都必須指定適合自己的加密套件。加密套件的選擇可以通過組合的字串來控制。

字串的形式舉例:all:!adh:rc4+rsa:+sslv2:@strength。

openssl定義了4中選擇符號:「+」,「-」,「!」,「@」。其中,「+」表示取交集;「-」表示臨時刪除乙個演算法;「!」表示永久刪除乙個演算法;「@「表示了排序方法。

多個描述之間可以用「:」、「,」、「 」、「;」來分開。選擇加密套件的時候按照從左到的

順序構成雙向鍊錶,存放與記憶體中。

all:!adh:rc4+rsa:+sslv2:@strength表示的意義是:首先選擇所有的加密套件

(不包含enull,即空對稱加密演算法),然後在得到的雙向鍊錶之中去掉身份驗證採用dh

的加密套件;加入包含rc4演算法並將包含rsa的加密套件放在雙向鍊錶的尾部;再將支援

sslv2的加密套件放在尾部;最後得到的結果按照安全強度進行排序。

ssl建立鏈結之前,客戶端和伺服器端用openssl函式來設定自己支援的加密套件。主要

的函式有: 

int ssl_set_cipher_list(ssl *s,const char *

str);

int ssl_ctx_set_cipher_list(ssl_ctx *ctx, const char *

str);

比如只設定一種加密套件:

int ret=ssl_set_cipher_list(ssl,"rc4-md5"); 

如果服務端只設定了一種加密套件,那麼客戶端要麼接受要麼返回錯誤。加密套件的選

擇是由服務端做出的。

VOJ 字元加密Cipher (字尾陣列)

字元加密cipher hysbz 1031 給你乙個長度為n的字串,讓你輸出乙個字串,要求,這個字串是原字串迴圈 即每次將第乙個字元移至最後乙個位置 總共會用n個這樣的字串,然後將這些字串按照字典序排列,按照順序每次輸出這些串的最後乙個字元,這樣就形成了乙個加密過的字串。資料範圍 n 10 5n 1...

bzoj 1031 字元加密Cipher

題意 給出乙個字串,求將其所有迴圈串排序之後,每個串的最後乙個字元 字串長度 100000 題解 字尾陣列裸題。吧 學長拿這個當例題我還差點不會做。反正就是把字串倍增之後求字尾陣列 然後按字尾陣列來掃一遍求解 難點就是字尾排序 廢話!這裡用的是o nlogn 的倍增 基數排序方法 模板純手寫。一堆f...

BZOJ1031 字元加密Cipher

被wsh大爺拉入坑,然而我會說他現在在睡覺?題意 求乙個迴圈同構的字串的按字典序排序後末尾的字元的序列 颯颯颯我們把這個字串粘 nian 兩遍,然後颯颯颯就好啦 可以這麼輕易是因為對於乙個倍長後的字串,如果我們不能僅按前n位就將這個字串排序,當且僅當這個字串的某些字尾的完全相同,然而這樣就算不排序也...