openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
openssl dhparam用於生成和管理dh文件。dh(Diffie-Hellman)是著名的密鑰交換協議,或稱為密鑰協商協議,它可以保證通信雙方安全地交換密鑰。但注意,它不是加密算法,所以不提供加密功能,僅僅只是保護密鑰交換的過程。在openvpn中就使用了該交換協議。關於dh算法的整個過程,見下文。
openssl dhparam命令集合了老版本的openssl dh和openssl gendh,后兩者可能已經失效了,即使存在也僅表示未來另有用途。
openssl dhparam [-in filename] [-out filename] [-dsaparam] [-noout] [-text] [-rand file(s)] [numbits]
選項說明:
-in filename:從filename文件中讀取密鑰交換協議參數。
-out filename:輸出密鑰交換協議參數到filename文件。
-dsaparam:指定此選項將使用dsa交換協議替代dh交換協議。雖然生成速度更快,但更不安全。
-noout:禁止輸出任何信息。
-text:以文本格式輸出dh協議。
-rand:指定隨機數種子文件。
numbits:指定生成的長度。
注意,dh協議文件生成速度隨長度增長而急劇增長,使用隨機數種子可以加快生成速度。
例如:生成1024長度的交換協議文件,其消耗的時間2秒不到。
[root@xuexi tmp]# time openssl dhparam -out dh.pem 1024
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
..........+.................................................+....................+..+.................................+.........+..................+.............................................+
...................................................................................................+..................................+............+...................+................+..........
.........................................................................................................................................................................................+.........
................................................................................................................................................+.............................................+....
........................................+......................+.......................++*++*++*
real 0m1.762s
user 0m1.608s
sys 0m0.017s
但生成長度2048的交換協議文件用了4分多鍾,可見長度增長會導致協議生成的時間急劇增長。
[root@xuexi ~]# time openssl dhparam -out dh.pem 2048
.........
.........
real 4m36.606s
user 4m14.404s
sys 0m0.538s
而使用了64位隨機數種子的同樣命令只需50秒鍾。
[root@xuexi tmp]# time openssl dhparam -rand rand.seed -out dh.pem 2048
.........
.........
real 0m50.264s
user 0m46.039s
sys 0m0.104s
openssl命令實現的是各種算法和加密功能,它的cpu的使用率會非常高,再結合dhparam,可以使得openssl dhparam作為一個不錯的cpu壓力測試工具,並且可以長時間飆高cpu使用率。
DH密鑰協商過程:
密鑰交換協議(DH)的大概過程是這樣的(了解即可,可網上搜索完整詳細的過程):
(1).雙方協商一個較大的質數並共享,這個質數是種子數。
(2).雙方都協商好一個加密生成器(一般是AES)。
(3).雙方各自提出另一個質數,這次雙方提出的質數是互相保密的。這個質數被認為是私鑰(不是非對稱加密的私鑰)。
(4).雙方使用自己的私鑰(即各自保密的質數)、加密生成器以及種子數(即共享的質數)派生出一個公鑰(由上面的私鑰派生而來,不是非對稱加密的公鑰)。
(5).雙方交換派生出的公鑰。
(6).接收方使用自己的私鑰(各自保密的質數)、種子數(共享的質數)以及接收到的對方公鑰計算出共享密鑰(session key)。盡管雙方的session key是使用對方的公鑰以及自己的私鑰計算的,但因為使用的算法,能保證雙方計算出的session key相同。
(7).這個session key將用於加密后續通信。例如,ssh連接過程中,使用host key對session key進行簽名,然后驗證指紋來完成主機認證的過程(見https://www.cnblogs.com/f-ck-need-u/p/7129122.html#blog131)。
在此可見,在計算session key過程中,雙方使用的公鑰、私鑰是相反的。但因為DH算法的原因,它能保證雙方生成的session key是一致的。而且因為雙方在整個過程中是完全平等的,沒有任何一方能掌控協商的命脈,再者session key沒有在網絡上進行傳輸,使得使用session key做對稱加密的數據傳輸是安全的。