乙個加密套件指明了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位就將這個字串排序,當且僅當這個字串的某些字尾的完全相同,然而這樣就算不排序也...