DSA算法和DSA指令概述
- DSA算法是美國國家標準的數字簽名算法,只具備數字簽名的功能不具備密鑰交換的功能
- 生成DSA參數然后生成DSA密鑰,DSA參數決定了DSA密鑰的長度
- 三個指令
- 首先是dsaparam指令,該指令主要用來生成DSA密鑰參數,并提供了一些格式轉換、C代碼生成等其他類似于dhparam指令的功能。一組DSA參數可以用來生成多個不同的DSA密鑰,而不是僅僅對應于一個DSA密鑰。
- gendsa指令用來從現有的DSA參數中生成DSA密鑰,使用相同的DSA參數可以生成不同的DSA密鑰,不過這需要rand選項指定的隨機數種子文件配合。
- 同樣,為了提供一些可能需要的DSA密鑰管理功能,如格式轉換、保護口令更改等,OpenSSL提供了dsa指令
- 為什么生成DSA密鑰參數跟生成DSA密鑰區分開來呢?首先,因為要使用一個DSA密鑰,必須預先共享其參數p、q和g;其次,因為生成一組DSA密鑰參數所耗費的時間比較多,而一組DSA密鑰參數可以用來生成許多組DSA密鑰,所以分開來就可以避免每次生成一對DSA密鑰都要重新生成DSA密鑰參數,耗費大量的時間。
- OpenSSL沒有提供類似rsautl指令的專門DSA算法使用指令,但是可以在dgst指令中使用DSA算法和密鑰進行數字簽名和驗證的操作。這基本上滿足了DSA算法使用的要求。
生成和管理 DSA密鑰參數
-
dsaparam 用于生成和管理DSA密鑰參數,其功能和參數類似dhparam,使用dsaparam 生成的密鑰參數不僅僅可以用于生成不同的DSA密鑰,還可以用于生成DH密鑰參數
- ?(2)輸入和輸出格式選項inform和outform? ? inform和outform選項指定了輸入DSA密鑰參數和輸出DSA密鑰參數或者DSA密鑰的編碼格式,目前支持的格式有PEM和DER兩種,默認的是PEM格式。
- (3)輸入和輸出文件選項in和out? ?in選項指定了輸入文件名,一般來說,如果使用了in選項,表示是從已有的DSA密鑰參數中生成新的DSA密鑰或者對密鑰參數進行格式轉換等管理操作。如果要生成新的DSA密鑰參數或者利用新生成的密鑰參數生成DSA密鑰,那么一般不需要使用in選項。
- out選項指定了輸出文件名,輸出的信息可能是DSA密鑰參數、DSA密鑰和text選項給出的明文解析信息。輸出的DSA密鑰參數和DSA密鑰的編碼格式由outform選項指定。如果輸出的是DSA密鑰,那么其形式是DSA私鑰的形式,但是包含了DSA公鑰參數。
- (4)engine選項? 如果使用了有效的Engine設備并提供該選項,而且在生成DSA密鑰參數的過程中執行的操作或者函數在Engine中支持,比如大數操作、隨機數生成及信息摘要函數等,那么就會采用Engine設備而不是OpenSSL默認的算法庫的函數進行實際的操作和運算。同樣,engine_id是一個簡短的描述型字符串,由Engine接口決定。
- (5)C語言代碼輸出選項某些時候,我們可能需要將DSA密鑰參數寫入到C語言的代碼中去,OpenSSL提供了從一組DSA密鑰參數轉換成代碼的方法,就是在dsaparam指令中使用C選項。下面是使用dsaparam指令的C選項生成的一段DSA密鑰參數的C語言代碼。
- ?(6)直接生成DSA密鑰選項genkey? ? 雖然dsaparam指令通常用來生成DSA密鑰參數,但是如果你想直接生成一個DSA密鑰而不是DSA密鑰參數,那么可以使用genkey選項。該選項使得輸出到out選項指定的輸出文件的是一個PEM編碼或者DER編碼的DSA私鑰。但是,該私鑰是沒有進行加密的,如果要安全地存放,必須使用下面將要介紹的dsa指令進行加密保存。使用該選項后,輸出的雖然只是一個DSA私鑰,但是私鑰結構里面已經包含了DSA公鑰的參數,所以,如果要得到相應的DSA公鑰,那么只要從這個DSA私鑰里面提取相應的參數就可以了,dsa指令可以幫助你從一個DSA私鑰得到相應的DSA公鑰。
- (7)DSA密鑰參數長度選項numbits? ? ? DSA密鑰參數決定了用其產生的DSA密鑰的長度,一般來說,512位的DSA密鑰只能提供很短期的安全性能,所以一般建議使用1024位的DSA密鑰。
- (8)其他選項rand選項跟其他指令同名選項一樣,指定了一個隨機數種子文件,默認情況下指令也會從其他可能的途徑自動獲取。text選項告訴指令輸出DSA密鑰參數的明文解析
-
使用了text選項的 DSA 密鑰參數輸出結果
- noout選項告訴指令不用輸出DSA密鑰參數或者DSA密鑰到out選項指定的文件或者標準輸出設備中(通常是指令行界面)。一般來說,在你想測試和查看DSA密鑰參數的時候,為了避免還要到相應的目錄中去刪除一個無意義的文件的時候會使用這個選項。?
生成DSA密鑰
- ?(1)gendsa指令格式? ? DSA密鑰是在DSA密鑰參數的基礎上產生的,一對DSA密鑰可以包含三個部分:DSA密鑰參數(p、q和g)、DSA私鑰和DSA公鑰。DSA密鑰參數是公開的,甚至可以為一組網絡用戶所共享,即這組網絡用戶使用相同的DSA密鑰參數產生各自的DSA密鑰對。內部使用隨機數控制不同的用戶密鑰不是完全一樣的
- dsaparam指令為我們生成了DSA密鑰參數,緊接著我們就要使用OpenSSL提供的gendsa指令生成真正要使用的DSA密鑰對。雖然說是密鑰對,但是gendsa指令只輸出DSA私鑰,這是因為DSA私鑰里面已經包含了DSA公鑰的所有參數,所以如果需要使用相應的DSA公鑰,那么可以通過DSA私鑰來獲得。dsa指令提供了從DSA私鑰輸出相應DSA公鑰的功能。
- gendsa指令的格式如下:
- (2)輸出文件選項out? ?out選項指定了保存生成的DSA密鑰的文件,如果沒有使用out選項,那么DSA密鑰將會輸出到標準輸出設備,一般就是當前指令行界面。
- 輸出密鑰的編碼格式OpenSSL沒有提供可以選擇的余地,只能是PEM編碼。
- (3)輸出DSA私鑰保護口令passout? ? 如果輸出的DSA私鑰是保存在文件里面,那么對私鑰進行加密保護就顯得非常必要。跟其他密鑰保護的方式一樣,OpenSSL提供了基于口令的加密保護方式。passout指定了獲取加密口令的源和方法,口令可以從指令參數、文件、環境變量等獲得。pasout選項只有在指定了DSA私鑰使用加密選項之后才會有效,否則該選項將被簡單忽略。
- (4)密鑰加密算法選項對DSA私鑰進行保護的重要性我們已經反復強調多次,現在就不用說為什么了。加密算法選項指定了使用什么對稱加密算法來對DSA私鑰進行加密,可選的算法有6種:DES、DES3、IDEA、128位AES、192位AES和256位AES。這些算法使用的加密密鑰和初始變量都經過特定的算法從提供的口令中獲取。如果使用了上述加密算法選項之一但卻沒有使用pasout選項指定加密口令,那么指令會在指令行界面提示用戶輸入口令。如果沒有使用上述任意一種加密算法,那么對DSA密鑰將不會進行加密,這當然很危險!
- (5)engine選項engine選項似乎緊緊跟隨每一個OpenSSL指令,在這里也不例外。在gendsa指令里使用engine選項指定有效的Engine之后,受影響最顯著的地方就是加密密鑰的算法,也就是說,如果加密的密鑰算法在指定的Engine接口中支持,那么指令就會調用Engine設備對DSA密鑰進行加密。其次,產生隨機數的操作也可能會在Engine設備中進行,只要Engine接口支持這些相應的操作。?
- (6)DSA密鑰參數選項該選項指定用于生成DSA密鑰的DSA密鑰參數文件,DSA密鑰的長度就取決于文件里面的DSA密鑰參數。遺憾的是對于該文件的格式你沒有選擇,只有輸入PEM編碼的DSA密鑰參數才能夠正確運行gendsa指令。如果你擁有的是一個DER編碼的DSA密鑰參數,那么請使用dsaparam指令先將其轉換成PEM編碼的DSA密鑰參數。
- (7)隨機數選項生成DSA密鑰的過程同樣需要隨機數的參與,既然有隨機數參與,我們就需要隨機數種子文件,rand選項一直就充當這樣的功能。當然,如果你不提供該文件,那么指令也會想辦法從其他可能的途徑獲取隨機數種子。在使用了Engine的情況下,甚至硬件設備有可能自己能夠支持產生隨機數種子的操作。
?管理DSA密鑰
- 考慮到用戶后期對先前生成的DSA密鑰的要求的變化,提供dsa指令
- dsa指令格式
- (2)輸入和輸出格式選項inform和outform? ? ?inform和outform選項分別指定了輸入DSA密鑰和輸出DSA密鑰的編碼格式,目前支持的格式包括PEM編碼和DER編碼兩種。
- (3)輸入和輸出密鑰類型選項pubin和pubout默認情況下,輸入和輸出的密鑰都應該是DSA私鑰,但是,有時候我們可能需要從一個輸入的DSA私鑰里面獲取一個相應的DSA公鑰發送給簽名驗證方,那么就可以選擇pubout選項來輸出一個DSA公鑰。在某些情況下,我們甚至可能輸入一個DSA公鑰,對它的信息進行解釋或者進行格式轉換。因為DSA公鑰不需要加密,所以如果使用了pubin或者pubout選項,相應的passin和passout選項指定的口令也會被忽略,輸出的公鑰不會被加密。
- (4)輸入和輸出文件選項in和out? ? in指定了輸入DSA密鑰的保存文件,默認情況下輸入的文件應該保存一個PEM編碼或者DER編碼的DSA私鑰。如果使用了pubin選項,則指令認為輸入文件保存的是一個沒有加密的DSA公鑰。密鑰的編碼格式默認是PEM,如果是DER格式,則需要使用inform選項指定。
- out選項指定了輸出DSA密鑰的保存文件,如果輸入的是DSA私鑰,默認情況下輸出的也是DSA私鑰,但是如果使用了pubout選項,則輸出的將是一個DSA公鑰。如果輸入是一個DSA公鑰,那么輸出也是一個DSA公鑰。輸出公鑰的時候不會對密鑰進行加密操作。默認情況下輸出的密鑰編碼格式是PEM,如果需要輸出密鑰編碼格式為DER的密鑰,那么可以使用outform選項指定。
- 如果使用了text和modulus選項,還會在out指定的文件中輸入明文解析信息。使用了noout選項將不會輸出編碼密鑰數據。
- (5)輸入和輸出口令選項passin和passout? ? ? pasin選項指定了解密DSA私鑰需要的口令的方式和源,口令可以從多種渠道獲取。如果輸入了DSA私鑰而沒有使用pasin選項,那么指令會從指令行界面提示輸入解密密鑰數據需要的口令。如果使用了pubin選項,那么passin選項會被忽略。pasout選項指定加密輸出的DSA私鑰需要的口令的方式和源。如果選擇了加密算法但是沒有使用pasout選項,那么指令會從指令行界面提示用戶輸入保護密鑰的口令。如果輸入的是DSA公鑰(使用pubin選項)或者輸出的是DSA公鑰(使用pubout選項),那么pasout選項就會被忽略。
- (6)加密算法選項dsa指令提供了更加豐富的密鑰加密算法,理論上,所有OpenSSL支持的對稱加密算法都可以在這里用于加密DSA私鑰。使用的方式是直接輸入該對稱加密算法的合法名稱。
- (7)engine選項? ?engine選項指定使用Engine設備中支持的對稱加密算法替代OpenSSL算法庫中的加密算法對DSA私鑰進行加密或者解密。例如,如果Engine設備支持DES3算法,而且你指定了使用DES3算法對DSA密鑰進行加密,那么指令就會調用Engine設備中相應的DES3算法對DSA私鑰進行加密。
- (8)解析信息輸出選項使用text選項會輸出DSA密鑰各項參數的明文解析信息,包括DSA密鑰的三個基本參數、公鑰參數和私鑰參數。使用modulus選項會輸出DSA公鑰的參數信息。而使用noout選項則指令不會輸出編碼的密鑰數據。