openssldes加密解密
1. OpenSSL 功能介紹
1 概述
OpenSSL 是一個安全套接字層密碼庫,囊括主要的密碼演算法、常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用。
OpenSSL是實現安全套接字層(SSL v2 / v3)和傳輸層安全(TLS v1)網路協議及其所需的相關加密標準的加密工具包。
OpenSSL:開源項目
三個組件:
openssl: 多用途的命令行工具,包openssl
libcrypto: 加密演算法庫,包openssl-libs
libssl:加密模塊應用庫,實現了ssl及tls,包nss
.openssl命令:
兩種運行模式:交互模式和批處理模式
opensslversion:程序版本號
標准命令、消息摘要命令、加密命令
標准命令:enc, ca, req, ...
查看幫助:openssl ?
可以通過openssl 來創建CA和頒發證書,文章 http://ghbsunny.blog.51cto.com/7759574/1964754
有做介紹,本文僅介紹openssl這個工具包的其他常用功能
2 案例介紹
2.1 對稱加密
工具:openssl enc, gpg,文章 http://ghbsunny.blog.51cto.com/7759574/1964887 已經介紹
演算法:3des, aes, blowfish, twofish
.enc命令:
對稱密碼命令允許使用基於密碼或明確提供的密鑰的各種塊和流密碼來加密或解密數據。 Base64編碼或解碼也可以通過本身或加密或解密來執行。
The symmetric cipher commands allow data to be encrypted or decrypted using various block and stream ciphers using keys based on passwords or explicitly provided. Base64 encoding or decoding can also be performed either by itself or in addition to the encryption or decryption.
幫助:man enc
例子
加密文件
以下命令運行需要輸入一個密碼,當解密的時候需要輸入相同的密碼才能解密,這里新生成的文件後綴名不一定是cipher,可以自己指定
openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
解密文件
openssl enc -d -des3 -a -salt –in testfile.cipher -out testfile
2.2 公鑰加密
公鑰加密生成非對稱的密鑰
演算法:RSA, ELGamal
工具:gpg, openssl rsautl(man rsautl)
數字簽名:
演算法:RSA, DSA, ELGamal
密鑰交換:
演算法:dh
DSA: Digital Signature Algorithm
DSS:Digital Signature Standard
RSA公鑰加密演算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。命名是取其名字首字母組合成RSA
RSA公鑰與私鑰主要用於數字簽名(Digital Signature)與認證(Authentication),我們一般也稱之為不對稱加密/解密。
2.2.1 生成密鑰對
幫助:man genrsa
.生成私鑰,這個生成密鑰的過程要掌握
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS
私鑰文件生成後,建議把許可權改成600,保護,放在被其他人查看密碼信息
私鑰里的文件,如果被拿到,沒有通過des這關鍵字加密的話,就相當於是明文
這個命令執行的時候,要輸入八位數的密碼,當要使用這個私鑰的時候需要輸入密碼
(umask 077; openssl genrsa –out test.key –des 2048)
括弧表示子進程,結束後,umask就會恢復未默認的值,umask的值使得其他人和組都沒有任何許可權,是為了保護生成的私鑰
2.2.2 從私鑰中提取出公鑰,導出公鑰
公鑰推不出私鑰,私鑰可以推出公鑰
openssl rsa -in PRIVATEKEYFILE –pubout –out PUBLICKEYFILE
Openssl rsa –in test.key –pubout –out test.key.pub
公鑰是公開的,可以不設置許可權,以上是生成公鑰
2.2.3 公鑰加密文件
openssl rsautl -encrypt -in input.file -inkey pubkey.pem -pubin -out output.file
-in 指定被加密的文件
-inkey 指定加密公鑰文件
-pubin 表面是用純公鑰文件加密
-out 指定加密後的文件
例子:
openssl rsautl -encrypt -in ftpback -inkey test.key.pub -pubin -out ftpssl
2.2.4 私鑰解密文件
openssl rsautl -decrypt -in input.file -inkey key.pem -out output.file
-in 指定需要解密的文件
-inkey 指定私鑰文件
-out 指定解密後的文件
例子:
openssl rsautl -decrypt -in ftpssl -inkey test.key -out ftpdec
2.3 單向加密
單向加密即獲取摘要
工具:md5sum, sha1sum, sha224sum,sha256sum…
openssl dgst
dgst:摘要功能輸出所提供文件的消息摘要或十六進制形式的文件。 它們也可用於數字簽名和驗證。
The digest functions output the message digest of a supplied file or files in hexadecimal form. They can also be used for digital signing and verification.
.dgst命令:
幫助:man dgst
openssl dgst -md5 [-hex默認] /PATH/SOMEFILE
openssl dgst -md5 testfile
以上命令將文件生成一個固定長度的摘要值,演算法是md5,大小佔128bite
md5sum /PATH/TO/SOMEFILE
以上這兩個md5得到的結果是一樣的
.MAC: Message Authentication Code,單向加密(hash)的一種延伸應用,用於實現網路通信中保證所傳輸數據的完整性機制
MAC 消息認證碼,構造方法可以基於hash,也可以基於對稱加密演算法,HMAC是基於hash的消息認證碼。數據和密鑰作為輸入,摘要信息作為輸出,常用於認證。
源文檔
2.4 生成用戶密碼
passwd命令:
幫助:man sslpasswd
openssl passwd -1 -salt SALT
-1對應的就是hash的md5演算法
SALT:這里是鹽值,人為指定,使得同一密碼生成的加密值不一樣,最多8位,超過8位沒有意義,比如前面8位一樣,後面還有幾位數不一樣,這樣生成的密碼值是一樣的
openssl passwd -1 –salt centos
grub-md5-crypt同樣生成md5加密的口令,centos為鹽值
比如這里的密碼我都是輸入123,但是鹽值不一樣,一個是centos,一個是centos6,生成的加密值不一樣
2.5 生成隨機數
幫助:man sslrand
rand命令在播放隨機數生成器一次後輸出num偽隨機位元組。 與其他openssl命令行工具一樣,除了-rand選項中給出的文件外,PRNG種子使用文件$ HOME / .rnd或.rnd。 如果從這些來源獲得足夠的播種,將會寫回新的$ HOME / .rnd或.rnd文件。
The rand command outputs num pseudo-random bytes after seeding the random number generator once. As in other openssl command line tools, PRNG seeding uses the file $HOME/.rnd or .rnd in addition to the files given in the -rand option. A new $HOME/.rnd or .rnd file will be written back if enough seeding was obtained from these sources.
openssl rand -base64|-hex NUM
指定數字生成隨機數,如果是-hex 後面的數值比如6,那麼生成的長度是12位,因為hex生成的隨機數是16進制組合的數,hex 後面的num是位元組數,一個16進制數佔用4位,半個位元組
base後面可以生成隨機密碼
base64 生成隨機的數,可以用任何字元,也可以把圖片保存成base64的格式,通過base64生成的圖片,可以
用base64來還原出圖片
NUM: 表示位元組數;-hex時,每個字元為十六進制,相當於4位二進制,出現的字元數為NUM*2
3 總結
openssl還有很多用法,本文僅單純介紹了其中一部分,更多用法請使用幫助 man openssl 進行查看
2. openssl提供 DES_ecb3_encrypt方法
一. 利用openssl命令進行BASE64編碼解碼(base64 encode/decode)
1. BASE64編碼命令
對字元串『abc』進行base64編碼:
# echo abc | openssl base64
YWJjCg== (編碼結果)
如果對一個文件進行base64編碼(文件名t.txt):
# openssl base64 -in t.txt
2. BASE64解碼命令
求base64後的字元串『YWJjCg==』的原文:
# echo YWJjCg== | openssl base64 -d
abc (解碼結果)
如果對一個文件進行base64解碼(文件名t.base64):
# openssl base64 -d -in t.base64
二. 利用openssl命令進行md5/sha1摘要(digest)
1. 對字元串『abc』進行md5摘要計算:echo abc | openssl md5
若對某文件進行md5摘要計算:openssl md5 -in t.txt
2. 對字元串『abc』進行sha1摘要計算:echo abc | openssl sha1
若對某文件進行sha1摘要計算:openssl sha1 -in t.txt
三. 利用openssl命令進行AES/DES3加密解密(AES/DES3 encrypt/decrypt)
對字元串『abc』進行aes加密,使用密鑰123,輸出結果以base64編碼格式給出:
# echo abc | openssl aes-128-cbc -k 123 -base64
U2FsdGVkX18ynIbzARm15nG/JA2dhN4mtiotwD7jt4g= (結果)
對以上結果進行解密處理:
# echo U2FsdGVkX18ynIbzARm15nG/JA2dhN4mtiotwD7jt4g= | openssl aes-128-cbc -d -k 123 -base64
abc (結果)
若要從文件里取原文(密文)進行加密(解密),只要指定 -in 參數指向文件名就可以了。
進行des3加解密,只要把命令中的aes-128-cbc換成des3就可以了。
另外,站長團上有產品團購,便宜有保證
3. 用C++編寫DES加密解密的方法,具體思路是什麼
DES是對二元數字分組加密的分組密碼演算法,分組長度為64比特。每64位明文加密成64位密文,沒有數據壓縮和擴展,密鑰長度為56比特,若輸入64比特,則第8,16,24,32,40,48,56,64為奇偶檢驗位,所以,實際密鑰只有56位。DES演算法完全公開,其保密性完全依賴密鑰。
4. OpenSSL詳解
OpenSSL初接觸的人恐怕最難的在於先理解各種概念
公鑰/私鑰/簽名/驗證簽名/加密/解密/非對稱加密
我們一般的加密是用一個密碼加密文件,然後解密也用同樣的密碼.這很好理解,這個是對稱加密.而有些加密時,加密用的一個密碼,而解密用另外一組密碼,這個叫非對稱加密,意思就是加密解密的密碼不一樣.初次接觸的人恐怕無論如何都理解不了.其實這是數學上的一個素數積求因子的原理的應用,如果你一定要搞懂,網路有大把大把的資料可以看,其結果就是用這一組密鑰中的一個來加密數據,可以用另一個解開.是的沒錯,公鑰和私鑰都可以用來加密數據,相反用另一個解開,公鑰加密數據,然後私鑰解密的情況被稱為加密解密,私鑰加密數據,公鑰解密一般被稱為簽名和驗證簽名.
因為公鑰加密的數據只有它相對應的私鑰可以解開,所以你可以把公鑰給人和人,讓他加密他想要傳送給你的數據,這個數據只有到了有私鑰的你這里,才可以解開成有用的數據,其他人就是得到了,也看懂內容.同理,如果你用你的私鑰對數據進行簽名,那這個數據就只有配對的公鑰可以解開,有這個私鑰的只有你,所以如果配對的公鑰解開了數據,就說明這數據是你發的,相反,則不是.這個被稱為簽名.
實際應用中,一般都是和對方交換公鑰,然後你要發給對方的數據,用他的公鑰加密,他得到後用他的私鑰解密,他要發給你的數據,用你的公鑰加密,你得到後用你的私鑰解密,這樣最大程度保證了安全性.
RSA/DSA/SHA/MD5
非對稱加密的演算法有很多,比較著名的有RSA/DSA ,不同的是RSA可以用於加/解密,也可以用於簽名驗簽,DSA則只能用於簽名.至於SHA則是一種和md5相同的演算法,它不是用於加密解密或者簽名的,它被稱為摘要演算法.就是通過一種演算法,依據數據內容生成一種固定長度的摘要,這串摘要值與原數據存在對應關系,就是原數據會生成這個摘要,但是,這個摘要是不能還原成原數據的,嗯....,正常情況下是這樣的,這個演算法起的作用就是,如果你把原數據修改一點點,那麼生成的摘要都會不同,傳輸過程中把原數據給你再給你一個摘要,你把得到的原數據同樣做一次摘要演算法,與給你的摘要相比較就可以知道這個數據有沒有在傳輸過程中被修改了.
實際應用過程中,因為需要加密的數據可能會很大,進行加密費時費力,所以一般都會把原數據先進行摘要,然後對這個摘要值進行加密,將原數據的明文和加密後的摘要值一起傳給你.這樣你解開加密後的摘要值,再和你得到的數據進行的摘要值對應一下就可以知道數據有沒有被修改了,而且,因為私鑰只有你有,只有你能解密摘要值,所以別人就算把原數據做了修改,然後生成一個假的摘要給你也是不行的,你這邊用密鑰也根本解不開.
CA/PEM/DER/X509/PKCS
一般的公鑰不會用明文傳輸給別人的,正常情況下都會生成一個文件,這個文件就是公鑰文件,然後這個文件可以交給其他人用於加密,但是傳輸過程中如果有人惡意破壞,將你的公鑰換成了他的公鑰,然後得到公鑰的一方加密數據,不是他就可以用他自己的密鑰解密看到數據了嗎,為了解決這個問題,需要一個公證方來做這個事,任何人都可以找它來確認公鑰是誰發的.這就是CA,CA確認公鑰的原理也很簡單,它將它自己的公鑰發布給所有人,然後一個想要發布自己公鑰的人可以將自己的公鑰和一些身份信息發給CA,CA用自己的密鑰進行加密,這里也可以稱為簽名.然後這個包含了你的公鑰和你的信息的文件就可以稱為證書文件了.這樣一來所有得到一些公鑰文件的人,通過CA的公鑰解密了文件,如果正常解密那麼機密後裡面的信息一定是真的,因為加密方只可能是CA,其他人沒它的密鑰啊.這樣你解開公鑰文件,看看裡面的信息就知道這個是不是那個你需要用來加密的公鑰了.
實際應用中,一般人都不會找CA去簽名,因為那是收錢的,所以可以自己做一個自簽名的證書文件,就是自己生成一對密鑰,然後再用自己生成的另外一對密鑰對這對密鑰進行簽名,這個只用於真正需要簽名證書的人,普通的加密解密數據,直接用公鑰和私鑰來做就可以了.
密鑰文件的格式用OpenSSL生成的就只有PEM和DER兩種格式,PEM的是將密鑰用base64編碼表示出來的,直接打開你能看到一串的英文字母,DER格式是二進制的密鑰文件,直接打開,你可以看到........你什麼也看不懂!.X509是通用的證書文件格式定義.pkcs的一系列標準是指定的存放密鑰的文件標准,你只要知道PEM DER X509 PKCS這幾種格式是可以互相轉化的.
== End http://www.cnblogs.com/phpinfo/archive/2013/08/09/3246376.html ==
為了方便理解,我畫了一個圖,如下:
使用 openssl 生成證書(含openssl詳解)
一、openssl 簡介
openssl 是目前最流行的 SSL 密碼庫工具,其提供了一個通用、健壯、功能完備的工具套件,用以支持SSL/TLS 協議的實現。
官網: https://www.openssl.org/source/
構成部分
密碼演算法庫
密鑰和證書封裝管理功能
SSL通信API介面
用途
建立 RSA、DH、DSA key 參數
建立 X.509 證書、證書簽名請求(CSR)和CRLs(證書回收列表)
計算消息摘要
使用各種 Cipher加密/解密
SSL/TLS 客戶端以及伺服器的測試
處理S/MIME 或者加密郵件
二、RSA密鑰操作
默認情況下,openssl 輸出格式為 PKCS#1-PEM
生成RSA私鑰(無加密)
openssl genrsa -out rsa_private.key 2048
生成RSA公鑰
openssl rsa -in rsa_private.key -pubout -out rsa_public.key
生成RSA私鑰(使用aes256加密)
openssl genrsa -aes256 -passout pass:111111 -out rsa_aes_private.key 2048
其中 passout 代替shell 進行密碼輸入,否則會提示輸入密碼;
生成加密後的內容如:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,
Base64 Encoded
Data-----END RSA PRIVATE KEY-----
此時若生成公鑰,需要提供密碼
openssl rsa -in rsa_aes_private.key -passin pass:111111 -pubout -out rsa_public.key
其中 passout 代替shell 進行密碼輸入,否則會提示輸入密碼;
轉換命令
私鑰轉非加密
openssl rsa -in rsa_aes_private.key -passin pass:111111 -out rsa_private.key
私鑰轉加密
openssl rsa -in rsa_private.key -aes256 -passout pass:111111 -out rsa_aes_private.key
私鑰PEM轉DER
openssl rsa -in rsa_private.key -outform der-out rsa_aes_private.der
-inform和-outform 參數制定輸入輸出格式,由der轉pem格式同理
查看私鑰明細
openssl rsa -in rsa_private.key -noout -text
使用-pubin參數可查看公鑰明細
私鑰PKCS#1轉PKCS#8
openssl pkcs8 -topk8 -in rsa_private.key -passout pass:111111 -out pkcs8_private.key
其中-passout指定了密碼,輸出的pkcs8格式密鑰為加密形式,pkcs8默認採用des3 加密演算法,內容如下:
-----BEGIN ENCRYPTED PRIVATE KEY-----
Base64 Encoded Data
-----END ENCRYPTED PRIVATE KEY-----
使用-nocrypt參數可以輸出無加密的pkcs8密鑰,如下:
-----BEGIN PRIVATE KEY-----
Base64 Encoded Data
-----END PRIVATE KEY-----
三、生成CA自簽名證書和RSA私鑰(測試場景步驟)
測試場景步驟1:生成 RSA 私鑰和自簽名證書:
openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 36500 -out cert.crt
注釋:
操作步驟如下:提示填寫過程中如果想刪除填寫的內容,用ctrl+Backspace刪除前面的字元
[root@szxelab01-web-100 cert]# openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 36500 -out cert.crt
Generating a 2048 bit RSA private key
.............+++
........................+++
writing new private key to 'rsa_private.key'
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:GuangDong
Locality Name (eg, city) [Default City]:ShenZhen
Organization Name (eg, company) [Default Company Ltd]:SunFoBank
Organizational Unit Name (eg, section) []:IT Dept
Common Name (eg, your name or your server's hostname) []:sunfobank.com
Email Address [] :[email protected]
[root@szxjdwins01-web-27 cert]# ll
total 8
-rw-r--r--. 1 root root 1452 Jun 22 14:29 cert.crt
-rw-r--r--. 1 root root 1708 Jun 22 14:29 rsa_private.key
openssl req -newkey rsa:2048 -nodes -keyout rsa_private.key -x509 -days 36500 -out cert.crt -subj "/C=CN/ST=GuangDong/L=ShenZhen/O=SunFoBank/OU=IT Dept/CN= sunfobank.com/[email protected] "
openssl req -new -x509 -days 36500 -key rsa_private.key -out cert.crt
四、生成伺服器簽名請求文件及CA 簽名頒發伺服器證書()
server.key建議不要加密碼,如果加密碼,重啟nginx的時候每次都需要密碼才可以啟動nginx影響效率。
nginx配置只需要server.key和server.crt兩個文件。
openssl genrsa -aes256 -passout pass:111111 -out server.key 2048
openssl req -new -key server.key -out server.csr
[root@szxjdwins01-web-27 cert]# openssl genrsa -aes256 -passout pass:111111 -out server.key 2048
Generating RSA private key, 2048 bit long molus
............................+++
.......+++
e is 65537 (0x10001)
[root@szxjdwins01-web-27 cert]# openssl genrsa -aes256 -out server.key 2048
Generating RSA private key, 2048 bit long molus
.............................................+++
........................................................+++
e is 65537 (0x10001)
Enter pass phrase for server.key: 111111手動輸入密碼
Verifying - Enter pass phrase for server.key: 111111手動輸入密碼
[root@szxelab01-web-27 cert]# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:GuangDong
Locality Name (eg, city) [Default City]:ShenZhen
Organization Name (eg, company) [Default Company Ltd]:SunFoBank
Organizational Unit Name (eg, section) []:IT Dept
Common Name (eg, your name or your server's hostname) []:sunfobank.com
Email Address [] :[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: 不輸入密碼
An optional company name []: 不輸入密碼
此後輸入密碼、server證書信息完成,也可以命令行指定各類參數
openssl req -new -key server.key -passin pass:111111 -out server.csr -subj "/C=CN/ST=GuangDong/L=ShenZhen/O=SunFoBank/OU=IT Dept/CN= sunfobank.com/[email protected] "
*** 此時生成的 csr簽名請求文件可提交至 CA進行簽發 ***
cat server.csr
-----BEGIN CERTIFICATE REQUEST-----
Base64EncodedData
-----END CERTIFICATE REQUEST-----
openssl req -noout -text -in server.csr
openssl x509 -req -days 365000 -in server.csr -CA cert.crt -CAkey rsa_private.key -passin pass:111111 -CAcreateserial -out server.crt
[root@szxelab01-web-27 cert]# openssl x509 -req -days 365000 -in server.csr -CA cert.crt -CAkey rsa_private.key -passin pass:111111 -CAcreateserial -out server.crt
Signature ok
subject=/C=CN/ST=GuangDong/L=ShenZhen/O=SunFoBank/OU=IT Dept/CN= sunfobank.com/[email protected]
Getting CA Private Key
其中 CAxxx 選項用於指定CA 參數輸入
[root@szxelab01-web-27 cert]# ll
total 24
-rw-r--r--. 1 root root 1452 Jun 22 14:29 cert.crt
-rw-r--r--. 1 root root 17 Jun 22 15:07 cert.srl
-rw-r--r--. 1 root root 1708 Jun 22 14:29 rsa_private.key
-rw-r--r--. 1 root root 1334 Jun 22 15:07 server.crt
-rw-r--r--. 1 root root 1070 Jun 22 15:04 server.csr
-rw-r--r--. 1 root root 1766 Jun 22 14:54 server.key
此時對nginx任何操作,都需要提示輸入server.key的密碼才可以執行。
[root@szxelab01-web-27 nginx]# /application/nginx/sbin/nginx -t
Enter PEM pass phrase: 輸入密碼111111
nginx: the configuration file /application/nginx-1.12.2//conf/nginx.conf syntax is ok
為例不輸入密碼,需要把加密server.key轉換成不加密的server.key
[root@szxelab01-web-27 cert]# openssl rsa -in server.key -passin pass:111111 -out server.key
writing RSA key
此時nginx操作就不提示輸入密碼了:
[root@szxelab01-web-27 cert]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.12.2//conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.12.2//conf/nginx.conf test is successful
證書位置:
[root@szxelab01-web-27 cert]# pwd
/application/nginx/cert
[root@szxelab01-web-27 cert]# ll
total 24
-rw-r--r--. 1 root root 1452 Jun 22 14:29 cert.crt
-rw-r--r--. 1 root root 17 Jun 22 15:07 cert.srl
-rw-r--r--. 1 root root 1708 Jun 22 14:29 rsa_private.key
-rw-r--r--. 1 root root 1334 Jun 22 15:07 server.crt
-rw-r--r--. 1 root root 1070 Jun 22 15:04 server.csr
-rw-r--r--. 1 root root 1679 Jun 22 15:19 server.key
至此測試場景私有證書配置完成
五、證書查看及轉換
查看證書細節
openssl x509 -in cert.crt -noout -text
轉換證書編碼格式
openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem
合成 pkcs#12 證書(含私鑰)
** 將 pem 證書和私鑰轉 pkcs#12 證書 **
openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:111111 -password pass:111111 -out server.p12
其中-export指導出pkcs#12 證書,-inkey 指定了私鑰文件,-passin 為私鑰(文件)密碼(nodes為無加密),-password 指定 p12文件的密碼(導入導出)
** 將 pem 證書和私鑰/CA 證書 合成pkcs#12 證書**
openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:111111 \ -chain -CAfile ca.crt -password pass:111111 -out server-all.p12
其中-chain指示同時添加證書鏈,-CAfile 指定了CA證書,導出的p12文件將包含多個證書。(其他選項:-name可用於指定server證書別名;-caname用於指定ca證書別名)
** pcks#12 提取PEM文件(含私鑰) **
openssl pkcs12 -in server.p12 -password pass:111111 -passout pass:111111 -out out/server.pem
其中-password 指定 p12文件的密碼(導入導出),-passout指輸出私鑰的加密密碼(nodes為無加密)
導出的文件為pem格式,同時包含證書和私鑰(pkcs#8):
Bag Attributes
localKeyID: 97 DD 46 3D 1E 91 EF 01 3B 2E 4A 75 81 4F 11 A6 E7 1F 79 40 subject=/C=CN/ST=GD/L=SZ/O=vihoo/OU=dev/CN= vihoo.com/[email protected]
issuer=/C=CN/ST=GD/L=SZ/O=viroot/OU=dev/CN= viroot.com/[email protected] CERTIFICATE-----MIIDazCCAlMCCQCIOlA9/
1LpQCA+2B6dn4scZwaCD-----END CERTIFICATE-----Bag Attributes
localKeyID: 97 DD 46 3D 1E 91 EF 01 3B 2E 4A 75 81 4F 11 A6 E7 1F 79 40 Key Attributes: <No Attributes>
-----BEGIN ENCRYPTED PRIVATE KEY-----/6rAc1YaPRNf
K9ZLHbyBTKVaxehjxzJHHw==
-----END ENCRYPTED PRIVATE KEY-----
僅提取私鑰
openssl pkcs12 -in server.p12 -password pass:111111 -passout pass:111111 -nocerts -out out/key.pem
僅提取證書(所有證書)
openssl pkcs12 -in server.p12 -password pass:111111 -nokeys -out out/key.pem
僅提取ca證書
openssl pkcs12 -in server-all.p12 -password pass:111111 -nokeys -cacerts -out out/cacert.pem
僅提取server證書
openssl pkcs12 -in server-all.p12 -password pass:111111 -nokeys -clcerts -out out/cert.pem
六、openssl 命令參考
5. openssl 中調用哪個函數實現16位元組des密鑰cbc方式加密數據
使用OpenSSL的EVP介面實現des128加密的邏輯流程如下:
// 初始化上下文數據結構,指定演算法(EVP_des_ede_cbc)、密鑰(key)、初始化向量(initVector)
//
EVP_CIPHER_CTX_init(&ctx);
EVP_EncryptInit_ex(&ctx, EVP_des_ede_cbc(), NULL, key, initVector);
......
// 加數的中間過程調用EVP_EncryptUpdate,pInBuffer、inSize指定要加密的明文和長度。
// 函數從pOutBuffer,outSize中返回加密後的密文和長度。
// 可以反復調用該API加密多個數據塊。注意所有EVP函數是失敗時返回0值。
//
ret = EVP_EncryptUpdate(&ctx, pOutBuffer, &outSize, pInBuffer, inSize);
if (0 == ret) goto ErrorExit;
......
// 在所有數據塊加密完成後調用Final函數取得最後的對齊數據。
//
ret = EVP_EncryptFinal_ex(&ctx, pOutBuffer, &outSize);
if (0 == ret) goto ErrorExit;
......
// 最後返回的時候別忘了釋放資源。
ErrorExit:
EVP_CIPHER_CTX_cleanup(&ctx);
return ret;
解密過程與上面一樣,只是中間調用的函數分別變成EVP_DecryptInit_ex、EVP_DecryptUpdate和EVP_DecryptFinal_ex。OpenSSL EVP介面的相關說明可以去查官方文檔或請教網路老師。
6. openssl unix口令密文怎麼解密
下面我將單介紹使用Openssl進行文件的對稱加密操作。
一、Openssl支持的加密演算法有:
-aes-128-cbc -aes-128-cfb -aes-128-cfb1
-aes-128-cfb8 -aes-128-ecb -aes-128-ofb
-aes-192-cbc -aes-192-cfb -aes-192-cfb1
-aes-192-cfb8 -aes-192-ecb -aes-192-ofb
-aes-256-cbc -aes-256-cfb -aes-256-cfb1
-aes-256-cfb8 -aes-256-ecb -aes-256-ofb
-aes128 -aes192 -aes256
-bf -bf-cbc -bf-cfb
-bf-ecb -bf-ofb -blowfish
-cast -cast-cbc -cast5-cbc
-cast5-cfb -cast5-ecb -cast5-ofb
-des -des-cbc -des-cfb
-des-cfb1 -des-cfb8 -des-ecb
-des-ede -des-ede-cbc -des-ede-cfb
-des-ede-ofb -des-ede3 -des-ede3-cbc
-des-ede3-cfb -des-ede3-ofb -des-ofb
-des3 -desx -desx-cbc
-rc2 -rc2-40-cbc -rc2-64-cbc
-rc2-cbc -rc2-cfb -rc2-ecb
-rc2-ofb -rc4 -rc4-40
二、Openssl加密指令語法:
SYNOPSIS
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e]
[-d] [-a] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-p]
[-P] [-bufsize number] [-nopad] [-debug]
說明:
-chipername選項:加密演算法,Openssl支持的演算法在上面已經列出了,你只需選擇其中一種演算法即可實現文件加密功能。
-in選項:輸入文件,對於加密來說,輸入的應該是明文文件;對於解密來說,輸入的應該是加密的文件。該選項後面直接跟文件名。
-out選項:輸出文件,對於加密來說,輸出的應該是加密後的文件名;對於解密來說,輸出的應該是明文文件名。
-pass選項:選擇輸入口令的方式,輸入源可以是標准輸入設備,命令行輸入,文件、變數等。
-e選項:實現加密功能(不使用-d選項的話默認是加密選項)。
-d選項:實現解密功能。
-a和-A選項:對文件進行BASE64編解碼操作。
-K選項:手動輸入加密密鑰(不使用該選項,Openssl會使用口令自動提取加密密鑰)。
-IV選項:輸入初始變數(不使用該選項,Openssl會使用口令自動提取初始變數)。
-salt選項:是否使用鹽值,默認是使用的。
-p選項:列印出加密演算法使用的加密密鑰。
三、案例:
1. 使用aes-128-cbc演算法加密文件:
openssl enc -aes-128-cbc -in install.log -out enc.log
(註:這里install.log是你想要加密的文件,enc.log是加密後的文件,回車後系統會提示你輸入口令)
2. 解密剛剛加密的文件:
openssl enc -d -aes-128-cbc -in enc.log -out install.log
(註:enc.log是剛剛加密的文件,install.log是解密後的文件,-d選項實現解密功能)
3.加密文件後使用BASE64格式進行編碼:
openssl enc -aes-128-cbc -in install.log -out enc.log -a
4.使用多種口令輸入方式加密:
openssl enc -des-ede3-cbc -in install.log -out enc.log -pass pass:111111
(這種方式的好處是你可以把它寫入到腳本中,自動完成加密功能,不使用pass選項默認系統會提示輸入口令,並且確認,是需要人工操作的)
四、Openssl的功能還遠不只於此,感興趣的朋友可以參考Openssl的手冊學習。在linux系統中你可以通過:man openssl 快速獲得幫助文件。
例:對文件file.tar.gz進行加密,密碼為123456
openssl des3 -salt -k 123456 -in file.tar.gz -out file.tar.gz.des3
對file.tar.gz.des3 解密
openssl enc -des3 -d -in file.tar.gz.des3 -out file.tar.gz
7. OpenSSL之3DES用法
3DES(或稱為Triple DES)是三重數據加密演算法(TDEA,Triple Data Encryption Algorithm)塊密碼的通稱。它相當於是對每個數據塊應用三次DES加密演算法。由於計算機運算能力的增強,原版DES密碼的密鑰長度變得容易被暴力破解;3DES即是設計用來提供一種相對簡單的方法,即通過增加DES的密鑰長度來避免類似的攻擊,而不是設計一種全新的塊密碼演算法。
其具體實現如下:設Ek()和Dk()代表DES演算法的加密和解密過程,K代表DES演算法使用的密鑰,P代表明文,C代表密文,這樣:
3DES加密過程為:C=Ek3(Dk2(Ek1(P)))
3DES解密過程為:P=Dk1(EK2(Dk3(C)))
本文假設你已經安裝好了OpenSSL,並且持有一份1.1.1的源碼。
3DES相關的頭文件在des.h中、源文件在crypto/des目錄中。
# define DES_ENCRYPT 1
# define DES_DECRYPT 0
這里定義了加密和解密的類型。
typedef unsigned int DES_LONG;
這個結構定義了DES的密鑰上下文。相關欄位含義:
ks —— 16輪子密鑰。
在1.1.1中,大多數的數據結構已經不再向使用者開放,從封裝的角度來看,這是更合理的。如果你在頭文件中找不到結構定義,不妨去源碼中搜一搜。
void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output,
DES_key_schele *ks1, DES_key_schele *ks2,
DES_key_schele *ks3, int enc);
使用電子密碼本方式加解密一個分組。
ks1、ks2、ks3分別為傳入的三個64位密鑰。
其內部實現為:
可以看到內部使用了DES_encrypt3()這個內部分組加密函數,並且傳入了3個密鑰。
我們繼續來看DES_encrypt3()是如何利用這3個密鑰的。
void DES_encrypt3(DES_LONG *data, DES_key_schele *ks1,
DES_key_schele *ks2, DES_key_schele *ks3)
其內部實現為:
可以看到內部又繼續使用了DES_encrypt2()這個分組加密函數。沒有必要再繼續解開DES_encrypt2()了,因為它主要根據密鑰做分組的加解密處理。
關於三個密鑰的利用關系,在DES_encrypt3()中主要是做三次疊加運算:
使用第一個密鑰做分組加密運算。
使用第二個密鑰做分組解密運算。
使用第三個密鑰做分組加密運算。
3DES的疊加運算,根據密鑰的組合關系,經常又表現為以下模式:
void DES_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output,
long length,
DES_key_schele *ks1, DES_key_schele *ks2,
DES_key_schele *ks3, DES_cblock *ivec, int enc);
使用密文分組鏈加解密。
參數ivec為初使化向量,在本函數返回時會被更新,可用於下一次分組運算。
註:
從源碼實現來看,雖然DES_ede3_cbc_encrypt()自身支持明文長度多於一個分組的計算,但是卻沒有處理填充,所以從統一封裝來看,建議開發者在使用這個函數時,同DES_ecb_encrypt()的用法一樣,傳入單個分組。
下面這個例子演示了使用普通DES加密,3DES的DES的兼容模式解密(即3個密鑰完全相同)。
輸出:
f8a8707fea7d45cd
3132333435363738
8. OpenSSL之AES用法
密碼學中的高級加密標准(Advanced Encryption Standard,AES),又稱Rijndael加密法,是美國聯邦政府採用的一種分組加密標准。這個標准用來替代原先的DES(Data Encryption Standard),已經被多方分析且廣為全世界所使用。經過五年的甄選流程,高級加密標准由美國國家標准與技術研究院 (NIST)於2001年11月26日發布於FIPS PUB 197,並在2002年5月26日成為有效的標准。2006年,高級加密標准已然成為對稱密鑰加密中最流行的演算法之一 。
本文假設你已經安裝好了OpenSSL,並且持有一份1.1.1的源碼。
AES相關的頭文件在aes.h中、源文件在crypto/aes目錄中。
這里定義了加密和解密的類型。
這里定義了分組最大輪數和塊大小。
這個結構定義了AES的密鑰上下文。相關欄位含義:
rd_key —— 每輪的子密鑰。
rounds —— 加解密輪數。
在1.1.1中,大多數的數據結構已經不再向使用者開放,從封裝的角度來看,這是更合理的。如果你在頭文件中找不到結構定義,不妨去源碼中搜一搜。
int AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);
設置加密密鑰,bits必須是128、192、256,否則會失敗。
成功返回0,失敗返回負數。
int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key);
設置解密密鑰,bits必須是128、192、256,否則會失敗。
成功返回0,失敗返回負數。
void AES_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key);
執行AES ECB分組加密。
void AES_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key);
執行AES ECB分組解密。
void AES_ecb_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key, const int enc);
執行AES ECB分組加解密。其實是AES_encrypt()和AES_decrypt()的簡單封裝。
其內部實現為:
void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, size_t length,
const AES_KEY *key, unsigned char *ivec, const int enc);
執行AES CBC分組加解密。
ivec為16位元組的向量,每次加解密都需要,首次為初使向量,後續為前一次的密文分組。
其內部實現為:
下面這個例子演示了AES ECB分組加解密的基本用法。在實際項目中,需要程序員加以封裝,並充分考慮數據填充問題。
輸出:
AES_set_encrypt_key ret:0
AES_set_decrypt_key ret:0
9. linux怎麼獲取使用md5處理前的密碼
這里以字元串123456為例子,它的md5密文值為:
這里以1.txt為需要被加密的文件。
一、 用oppnssl md5 加密字元串和文件的方法。
1. oppnssl md5 加密字元串的方法
a.手動輸入命令及過程如下:
#openssl //在終端中輸入openssl後回車。
OpenSSL> md5 //輸入md5後回車
123456 //接著輸入123456,不要輸入回車。然後按3次ctrl+d。
123456 //123456後面的就是密文了
解釋:為何在輸入123456後不回車呢?
是因為openssl默認會把回車符當做要加密的字元串中的一個字元,所以得到的結果不同。如果你輸入123456後回車,在按2次ctrl+d。得到的結果是:
OpenSSL> md5
123456
//因為openssl不忽略回車符導致的
b.或者直接用管道命令
# echo -n 123456 | openssl md5 //必須要有-n參數,否則就不是這個結果了。
解釋:為何要加-n這個參數?
-n就表示不輸入回車符,這樣才能得到正確的結果。如果你不加-n,那麼結果和前面說的一樣為:
//因為openssl不忽略回車符導致的
2.用openssl加密文件。
#openssl md 5 -in 1.txt
##################################################3
Openssl其他相關加密的命令參數:引自:實用命令:利用openssl進行BASE64編碼解碼、md5/sha1摘要、AES/DES3加密解密 收藏
一. 利用openssl命令進行BASE64編碼解碼(base64 encode/decode)
1. BASE64編碼命令
對字元串『abc』進行base64編碼:
# echo abc | openssl base64
YWJjCg== (編碼結果)
如果對一個文件進行base64編碼(文件名t.txt):
# openssl base64 -in t.txt
2. BASE64解碼命令
求base64後的字元串『YWJjCg==』的原文:
# echo YWJjCg== | openssl base64 -d
abc (解碼結果)
如果對一個文件進行base64解碼(文件名t.base64):
# openssl base64 -d -in t.base64
二. 利用openssl命令進行md5/sha1摘要(digest)
1. 對字元串『abc』進行md5摘要計算:echo abc | openssl md5
若對某文件進行md5摘要計算:openssl md5 -in t.txt
2. 對字元串『abc』進行sha1摘要計算:echo abc | openssl sha1
若對某文件進行sha1摘要計算:openssl sha1 -in t.txt
三. 利用openssl命令進行AES/DES3加密解密(AES/DES3 encrypt/decrypt)
對字元串『abc』進行aes加密,使用密鑰123,輸出結果以base64編碼格式給出:
# echo abc | openssl aes-128-cbc -k 123 -base64
U2FsdGVkX18ynIbzARm15nG/JA2dhN4mtiotwD7jt4g= (結果)
對以上結果進行解密處理:
# echo U2FsdGVkX18ynIbzARm15nG/JA2dhN4mtiotwD7jt4g= | openssl aes-128-cbc -d -k 123 -base64
abc (結果)
若要從文件里取原文(密文)進行加密(解密),只要指定 -in 參數指向文件名就可以了。
進行des3加解密,只要把命令中的aes-128-cbc換成des3就可以了。
註:只要利用openssl help就可以看到更多的安全演算法了。
###############################################
二、 利用php的md5函數加密字元串
#touch a.php //創建a.php文件
#vi a.php //用vi 編輯a.php文件
將<?php echo md5(123456); ?>輸入進去後保存
#php a.php //運行a.php文件
顯示:
三、 利用md5sum命令
A.在linux或Unix上,md5sum是用來計算和校驗文件報文摘要的工具程序。一般來說,安裝了Linux後,就會有md5sum這個工具,直接在命令行終端直接運行。可以用下面的命令來獲取md5sum命令幫助 man md5sum
#md5sum –help
有個提示:「With no FILE, or when FILE is -, read standard input.」翻譯過來就是「如果沒有輸入文件選項或者文件選項為 - ,則從標磚讀取輸入內容」,即可以直接從鍵盤讀取字元串來加密。
利用md5sum加密字元串的方法
# md5sum //然後回車
123456 //輸入123456.然後按兩次ctrl+d.
顯示:
123456 紅色代表加密後的值
還可以用管道命令:
#echo -n '123123' | md5sum
或者寫成md5加密腳本,名字叫md5.sh,
將以下內容復制進腳本里:
#!/bin/bash
echo -n $1 | md5sum | awk '{print $1}'
保存後,給腳本執行許可權。
#sh md5.sh 123456
顯示:
B.其實也可以將文本放入文本文件,然後用md5sum 加密改文本,也可以得到字元串加密的值。過程如下:
#touch a.txt
#echo -n 123456 > a.txt //將123456寫進文本文件,不能丟了 –n參數,避免回車符干擾
#md5sum a.txt
顯示: a.txt
ctrl+d有兩個含義:
一是向程序發送文件輸入結束符EOF。
二是向程序發送exit退出指令。程序收到信號後具體動作是結束輸入、然後等待,還是直接退出,那就要看該程序捕獲信號後是如何操作的了。
md5sum屬於第一個含義。兩次strl+d了,第一次讀取EOF指令,再次捕獲就會當成exit指令。而shell一類的程序,會直接把ctrl+d解析為退出指令。