1. 程式人生 > >openssl 非對稱加密演算法DSA命令詳解

openssl 非對稱加密演算法DSA命令詳解

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金鑰其用法如下

複製程式碼
[email protected]:~/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 // [email protected]:~/test$
複製程式碼

其引數與RSA相關指令的引數類似,不再一一說明,下面以例項的方式說明其用法

1、生成金鑰引數並檢視其各個引數值

複製程式碼
/*生成1024位的金鑰引數*/
[email protected]:~/test$ openssl dsaparam -out DSAP.pem 1024
Generating DSA parameters, 1024 bit long prime
This could take some time
....
/*明文檢視金鑰引數的值*/
[email protected]:~/test$ openssl dsaparam -in DSAP.pem -text -noout 
複製程式碼

2、金鑰引數格式間的轉換

/*pem格式的金鑰引數轉為der格式*/
[email protected]:~/test$ openssl dsaparam -in DSAP.pem -out DSAP.der -outform der
/*der格式的金鑰引數轉為pem格式*/
[email protected]:~/test$ openssl dsaparam -in DSAP.der -inform der -out R_DSAP.pem
[email protected]:~/test$ diff DSAP.pem R_DSAP.pem

3、直接生成DSA金鑰

複製程式碼
/*直接生成DSA金鑰*/
[email protected]:~/test$ openssl dsaparam -genkey -out DSA.pem 1024
Generating DSA parameters, 1024 bit long prime
...
/*檢視DSA金鑰,可知引數和金鑰都被放在輸出檔案中,說明本質上還是先生成引數,再利用引數生成金鑰*/
[email protected]:~/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金鑰

複製程式碼
[email protected]:~/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、根據金鑰引數生成金鑰

複製程式碼
/*根據金鑰引數生成金鑰*/
[email protected]:~/test$ openssl gendsa -out DSA1.pem  DSAP.pem
Generating DSA key, 1024 bits
[email protected]:~/test$ openssl gendsa -out DSA2.pem  DSAP.pem
Generating DSA key, 1024 bits
/*相同金鑰引數,每次生成的金鑰不同*/
[email protected]:~/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加密儲存*/
[email protected]:~/test$ openssl gendsa -out DSA.pem -des3 -passout pass:123456 DSAP.pem
Generating DSA key, 1024 bits
複製程式碼

2.1 dsa指令說明

dsa和rsa指令功能及其類似,如下

複製程式碼
[email protected]:~/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金鑰*/
[email protected]:~/test$ openssl dsaparam -out DSA.pem -genkey 1024
/*使用des3加密DSA金鑰*/
[email protected]:~/test$ openssl dsa -in DSA.pem -out E_DSA.pem -des3 -passout pass:123456
read DSA key
writing DSA key
/*解密DSA金鑰*/
[email protected]:~/test$ openssl dsa -in E_DSA.pem -out DSA1.pem -passin pass:123456
read DSA key
writing DSA key
複製程式碼

2、提取DSA的公鑰

[email protected]:~/test$ openssl dsa -in DSA.pem -out pub.pem -pubout
read DSA key
writing DSA key

3、小結

可以看到,DSA和RSA的指令非常相似,熟悉了其中一種,另外一種也很容易上手。而且openssl提供的指令雖多,但引數來來回回就那麼多,在多數情況下不同指令的相同引數含義大概一樣。

到此為止,介紹了對稱加密演算法指令,非對稱加密演算法RSA和DSA相關指令,這些都是一些基礎指令,在實際應用中,我們使用openssl做的大多數是與CA有關的簽名、驗證、加密、解密等。所以接下來要寫的是和實際應用相關的內容,比如證書自簽名、二級證書籤發、終端證書籤發、證書驗證等內容。