DH概述
- 用于密鑰交換的公開算法,廣泛應用于各種安全協議
- SSL協議同樣支持DH算法
- DH算法使用之前需要預先共享兩個參數,本原元g和模n,這兩個參數影響到算法的安全性,因此需要預先生成并檢測其安全性
- 生成這些必要參數和管理這些參數的指令dhparam、gendh和dh
- 注意事項:DH算法本身不定義加密和解密的操作,只是單純的提供一個安全交換或者生成共同數據加密密鑰(用于對稱加密的會話密鑰)的方法
- OpenSSL也沒有提供利用DH進行加密和解密操作的指令和生成DH的指令,只提供了生成DH參數和對DH管理的指令
- 雖然OpenSSL目前的版本還保留了三個DH算法相關指令,但是dhparam指令已經集成了gendh和dh兩個指令的所有功能,在后續的版本中,gendh和dh指令很可能被取消或者賦予新的功能定義
生成DH算法參數
- DH算法參數包括本原元g和模n,OpenSSL提供的指令gendh和dhparam都可以生成DH參數,并可以經過編碼保存在文件中。gendh指令的功能目前已經集成在dhparam指令中,但是dhparam指令還集成了dh指令的所有功能,在這部分,我們只介紹gendh指令。
- 首先來看看gendh指令的格式:
- out選項指定了DH算法參數輸出和保存的文件名,可以是標準輸出設備,比如Windows下就是當前指令行界面。
- gendh指令沒有輸入選項。
- 使用gendh指令輸出的DH算法參數都是PEM編碼的?
- DH算法參數指令的主要目的是產生公共模數n,而本原元g是指定的,目前常用的本原元有2和5,雖然3也偶爾被使用,但是OpenSSL并沒有提供支持。默認情況下使用2作為本原元。
- 產生DH算法參數的時候engine選項的影響體現在兩個方面,DH算法產生函數方面和隨機數生成函數方面。如果engine指定的設備有效并且支持DH算法參數的產生,那么將會調用Engine設備提供的DH參數生成函數而不再使用OpenSSL函數庫本身的DH參數產生函數。同時,如果Engine設備支持隨機數生成函數,那么在產生DH算法參數需要的隨機數的時候,調用的系列隨機數函數將直接使用Engine設備提供的相應函數,這時候,rand選項指定的隨機數種子文件是否有意義就依具體的Engine接口而定。
- 隨機數文件選項randrand選項指定了產生隨機數時使用的隨機數種子文件,該文件一般來說可以為任意類型的文件。如果沒有指定,指令會從其他途徑獲取必要的隨機數種子。如果使用了engine選項并且該Engine接口支持隨機數產生函數,那么該rand選項指定隨機數文件的意義及是否被真正使用要根據具體的Engine接口而定。
- DH密鑰長度依據DH算法參數的長度而定,所以,生成的DH算法參數的長度決定了DH密鑰的長度。一般來說,現在512位的DH密鑰是可以信任的,當然,如果你愿意,也可以采用更長的密鑰。密鑰越長,生成DH參數的時間越長,而安全性也越高。
例子
?管理DH算法參數
dh指令格式
- 將生成的DH參數保存在某個文件里面,并不需要對其進行加密,因為這個參數原本就是公開的,但是為了使用這個參數需要進行一些管理操作
- 管理操作:格式轉換、安全性測試、轉換成C編碼等操作
- dh指令的格式
- nform和outform選項指定DH參數編碼輸入和輸出文件的格式,默認情況下是PEM編碼。目前來說,支持的格式包括PEM編碼和DER編碼兩種格式。如果輸出信息不是編碼的DH參數,比如-text和-C選項的輸出,則不會受到out form格式選項的影響。
- (3)輸入和輸出文件選項in和out? ?in選項指定了輸入的DH參數文件,該文件應該保存了PEM編碼或者DER編碼格式的DH參數,如果你是使用gendh指令生成的DH參數文件,那么肯定就是PEM編碼的。如果是DER編碼的DH文件,則需要在inform中指定其格式。out選項指定了輸出文件,包括輸出格式轉換后DH參數和text選項輸出的明文解析信息。
- (4)DH參數檢測選項check? ?DH參數文件存放一段時間之后,你如果對該文件產生了懷疑,可以使用check選項對其中的DH參數進行檢查。check選項提供的檢查包含四個方面:模數是否正確,模數是否安全,本原元g是否正確及本原元是否合適。如果檢查有問題,指令會輸出提示信息。
- (5)輸出C語言代碼選項CDH算法參數在使用的時候,既可以從文件讀入,也可以直接集成在代碼里面。OpenSSL提供了從DH文件參數轉換成相應的C語言代碼的方法,就是使用C選項。使用該選項后,輸出三部分信息:模數數組、本原元g數組及getdh函數。需要注意的是,C語言的輸出代碼只輸出到標準輸出設備,不會輸出到out選項指定的文件中。
- ?使用C選項后輸出的一個512位DH算法參數C代碼的例子
- 其他選項? ?engine選項指定了要使用的Engine設備,如果該Engine接口支持在使用dh指令中要使用到的某個函數或者操作,那么就會使用Engine設備而不是OpenSSL本身算法庫的函數。text選項告訴指令輸出DH算法參數的明文解析信息,這包括模數n和本原元g的十六進制編碼數據。noout選項的使用會忽略輸出選項out,不輸出DH編碼參數到out選項指定文件或標準輸出設備。?
?更豐富和綜合的 DH算法參數指令 dhparam
- 綜合利用了gendh和dh指令的所有功能
- dsaparam選項是dhparam指令比gendh指令和dh指令唯一多出來的選項,該選項告訴指令生成一個DSA風格的DH參數,而不是使用典型的DH參數生成方式。所謂DSA風格的DH參數是利用DSA參數類型跟DH參數具有相似性的特點,先生成一個DSA參數,然后將其轉換為DH參數。
- DSA參數生成相對于DH參數來說速度更快,而其達到相同安全性能需要的密鑰長度更短一些,所以使用DH算法的時候效率就顯得更高。但也是有代價的,使用DSA風格的DH算法參數,最好為每一個應用生成一個算法參數,否則容易受到一種稱為“小群”(smal-subgroup)的方法的攻擊。使用了dsaparam選項之后,如果使用了輸入文件,那么輸入文件格式都被視作DSA參數文件,dhparam指令將會把DSA參數轉換成DH參數。輸出則是一個DSA風格的DH參數文件。?
- 輸出格式可以由用戶進行指定,可以選擇是保存成PEM格式還是DER格式,而不再受到gendh指令限制只能保存成PEM格式,然后再使用dh指令才能轉換成DER格式