1、DSA算法概述
DSA算法是美國的國家標准數字簽名算法,它只能用戶數字簽名,而不能用戶數據加密和密鑰交換。
DSA與RSA的生成方式不同,RSA是使用openssl提供的指令一次性的生成密鑰(包括公鑰),而通常情況下,DSA是先生成DSA的密鑰參數,然后根據密鑰參數生成DSA密鑰(包括公鑰),密鑰參數決定了DSA密鑰的長度,而且一個密鑰參數可以生成多對DSA密鑰對。
DSA生成的密鑰參數是p、q和g,如果要使用一個DSA密鑰,需要首先共享其密鑰參數。關於DSA加密的原理,請自行查閱。
2、DSA算法相關指令及用法
openssl中DSA算法指令主要有三個,分別是
指令 | 功能 |
dsaparam | 生成、處理DSA密鑰參數,也可以直接生成DSA密鑰 |
dsa | 處理DSA密鑰格式的轉換 |
gendsa | 根據DSA密鑰參數生成一個DSA密鑰 |
從上表可以看到,dsa和gendsa和RSA相關指令中的rsa和genrsa用法相似,但是DSA相關指令中沒有提供簽名和驗證操作的dsautl指令,所以如果需要使用DSA進行簽名和驗證,需要借助dgst指令,該指令在后續章節中介紹。
2.1 dsaparam指令說明
dsaparam主要用戶生成密鑰參數,也可以生成DSA密鑰其用法如下
xlzh@cmos:~/test$ openssl dsaparam - unknown option - dsaparam [options] [bits] <infile >outfile where options are -inform arg input format - DER or PEM // -outform arg output format - DER or PEM // -in arg input file // -out arg output file // -text print as text // -C Output C code // -noout no output // -genkey generate a DSA key // -rand files to use for random number input // -engine e use engine e, possibly a hardware device. // number number of bits to use for generating private key // xlzh@cmos:~/test$
其參數與RSA相關指令的參數類似,不再一一說明,下面以實例的方式說明其用法
1、生成密鑰參數並查看其各個參數值
/*生成1024位的密鑰參數*/ xlzh@cmos:~/test$ openssl dsaparam -out DSAP.pem 1024 Generating DSA parameters, 1024 bit long prime This could take some time ....
/*明文查看密鑰參數的值*/ xlzh@cmos:~/test$ openssl dsaparam -in DSAP.pem -text -noout
2、密鑰參數格式間的轉換
/*pem格式的密鑰參數轉為der格式*/ xlzh@cmos:~/test$ openssl dsaparam -in DSAP.pem -out DSAP.der -outform der /*der格式的密鑰參數轉為pem格式*/ xlzh@cmos:~/test$ openssl dsaparam -in DSAP.der -inform der -out R_DSAP.pem xlzh@cmos:~/test$ diff DSAP.pem R_DSAP.pem
3、直接生成DSA密鑰
/*直接生成DSA密鑰*/ xlzh@cmos:~/test$ openssl dsaparam -genkey -out DSA.pem 1024 Generating DSA parameters, 1024 bit long prime ... /*查看DSA密鑰,可知參數和密鑰都被放在輸出文件中,說明本質上還是先生成參數,再利用參數生成密鑰*/ xlzh@cmos:~/test$ cat DSA.pem -----BEGIN DSA PARAMETERS----- MIIBHgKBgQDAG1CFQRqKgrDa21dT2SO0OtvR0wtKo4GWEH+zikTt6eh6S0CdhtqX PdPiboZdYAJy7HzKHLe0BUkf4dfOOPZBcQrr9sYkJ6q2Zz/jSSA9EnpuQfstdE8a 2wrhIm8mPzBKuWfvz29O6KlBngLfXSfr8Iy2mNAf7NgAntDBMY8yHQIVAMaCaSge oBHtVo9cUoA5E69f2VqrAoGAbzC9wFnra1lT8Egak4N7YHkBwObN3T2ue3tRM7wE uv5rNuIyQrSQnp4vqFcnu3lOrP3ZGEJvEZ0kVo7e6LhfO8V0UOqElfhiuwEaZuzZ 22Sodbu7lUx3YMU1QRvk42IudIevi6LWq4zk+sxraAZ3h5rvo8/pKayxtRuKq8Ep 5kU= -----END DSA PARAMETERS----- -----BEGIN DSA PRIVATE KEY----- MIIBugIBAAKBgQDAG1CFQRqKgrDa21dT2SO0OtvR0wtKo4GWEH+zikTt6eh6S0Cd htqXPdPiboZdYAJy7HzKHLe0BUkf4dfOOPZBcQrr9sYkJ6q2Zz/jSSA9EnpuQfst dE8a2wrhIm8mPzBKuWfvz29O6KlBngLfXSfr8Iy2mNAf7NgAntDBMY8yHQIVAMaC aSgeoBHtVo9cUoA5E69f2VqrAoGAbzC9wFnra1lT8Egak4N7YHkBwObN3T2ue3tR M7wEuv5rNuIyQrSQnp4vqFcnu3lOrP3ZGEJvEZ0kVo7e6LhfO8V0UOqElfhiuwEa ZuzZ22Sodbu7lUx3YMU1QRvk42IudIevi6LWq4zk+sxraAZ3h5rvo8/pKayxtRuK q8Ep5kUCgYAh50mq26xMHfVxb/EkZzH+ouM3zPk6x8f9GFZzuUtGfNCzopTxEmw3 yYPaBwiojhZnK/LXVdEui97+D/rqAPCXAfwFhXLR9w7oikid+Ai1A1B+lycCJrim gyF/dzha7uYGzaA1+rAftE76aeGlZYnoO42CgkxuYsxYxCzTJF8swQIUcrqFkFhN Z2th/K4MZwy4QW6xPrA= -----END DSA PRIVATE KEY-----
2.1 gendsa指令說明
gendsa指令功能簡單,即利用輸入的密鑰參數生成DSA密鑰
xlzh@cmos:~/test$ openssl gendsa - usage: gendsa [args] dsaparam-file -out file - output the key to 'file' -des - encrypt the generated key with DES in cbc mode -des3 - encrypt the generated key with DES in ede cbc mode (168 bit key) -seed encrypt PEM output with cbc seed -aes128, -aes192, -aes256 encrypt PEM output with cbc aes -camellia128, -camellia192, -camellia256 encrypt PEM output with cbc camellia -engine e - use engine e, possibly a hardware device. -rand file:file:... - load the file (or the files in the directory) into the random number generator dsaparam-file - a DSA parameter file as generated by the dsaparam command
示例如下:
1、根據密鑰參數生成密鑰
/*根據密鑰參數生成密鑰*/ xlzh@cmos:~/test$ openssl gendsa -out DSA1.pem DSAP.pem Generating DSA key, 1024 bits xlzh@cmos:~/test$ openssl gendsa -out DSA2.pem DSAP.pem Generating DSA key, 1024 bits /*相同密鑰參數,每次生成的密鑰不同*/ xlzh@cmos:~/test$ diff DSA1.pem DSA2.pem 8,11c8,11 < TWcw1+XFAoGAEA1DLnv5efzB+ipIQ29q0ZedLVPyxdB44jpZES+esBQtU04HdI2N < bClgwj8c9M6Y/9rL1uy3NqKaGHM+mjLyAXVceigFx7v15r5LRmWjialdqkcVG/3S < Qo530ui/tXgFbFV9iA6C8L+nHDMPOf5v6oGyICmxN8DWzhQAsmy9mkICFBeqMbZM < 9qBeG0BaS/6PucBxObsv --- > TWcw1+XFAoGALWkjJeFunfvkiarJ1/pw8Lqvuyu/Glt3g/hURPPlrOIhA0pFXDmC > UzCM1x6wrHWFc0jmUNk6FtnjGyiCLxVJGzeB7/4MA35aInHkiHwzX7a+B0At8bMq > WEkWtzxhvTxTqWTAcC02Qr2mNNfJwWWVV0jVzMtm3Gb6YwhNnUvxp0ACFHrXO/8h > dIwr6pSuj6vdNpHFDlY2 /*生成密鑰並使用des3加密存儲*/ xlzh@cmos:~/test$ openssl gendsa -out DSA.pem -des3 -passout pass:123456 DSAP.pem Generating DSA key, 1024 bits
2.1 dsa指令說明
dsa和rsa指令功能及其類似,如下
xlzh@cmos:~/test$ openssl dsa - unknown option - dsa [options] <infile >outfile where options are -inform arg input format - DER or PEM -outform arg output format - DER or PEM -in arg input file -passin arg input file pass phrase source -out arg output file -passout arg output file pass phrase source -engine e use engine e, possibly a hardware device. -des encrypt PEM output with cbc des -des3 encrypt PEM output with ede cbc des using 168 bit key -aes128, -aes192, -aes256 encrypt PEM output with cbc aes -camellia128, -camellia192, -camellia256 encrypt PEM output with cbc camellia -seed encrypt PEM output with cbc seed -text print the key in text -noout don't print key out -modulus print the DSA public value
示例如下:
1、加密密鑰和解密密鑰
/*生成未加密的DSA密鑰*/ xlzh@cmos:~/test$ openssl dsaparam -out DSA.pem -genkey 1024 /*使用des3加密DSA密鑰*/ xlzh@cmos:~/test$ openssl dsa -in DSA.pem -out E_DSA.pem -des3 -passout pass:123456 read DSA key writing DSA key /*解密DSA密鑰*/ xlzh@cmos:~/test$ openssl dsa -in E_DSA.pem -out DSA1.pem -passin pass:123456 read DSA key writing DSA key
2、提取DSA的公鑰
xlzh@cmos:~/test$ openssl dsa -in DSA.pem -out pub.pem -pubout read DSA key writing DSA key
3、小結
可以看到,DSA和RSA的指令非常相似,熟悉了其中一種,另外一種也很容易上手。而且openssl提供的指令雖多,但參數來來回回就那么多,在多數情況下不同指令的相同參數含義大概一樣。
到此為止,介紹了對稱加密算法指令,非對稱加密算法RSA和DSA相關指令,這些都是一些基礎指令,在實際應用中,我們使用openssl做的大多數是與CA有關的簽名、驗證、加密、解密等。所以接下來要寫的是和實際應用相關的內容,比如證書自簽名、二級證書簽發、終端證書簽發、證書驗證等內容。