openssl enc(對稱加密)

openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.htmlhtml


對稱加密工具。瞭解對稱加密的原理後就很簡單了,原理部分見下文。算法

openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-k password] [-S salt] [-salt] [-md] [-p/-P]安全

選項說明:ide

-ciphername:指定對稱加密算法(如des3),可獨立於enc直接使用,如openssl des3或openssl enc -des3。推薦在enc後使用,這樣不依賴於硬件工具

-in filename :輸入文件,不指定時默認是stdin測試

-out filename:輸出文件,不指定時默認是stdout編碼

-e:對輸入文件加密操做,不指定時默認就是該選項加密

-d:對輸入文件解密操做,只有顯示指定該選項纔是解密idea

-pass:傳遞加、解密時的明文密碼。若驗證簽名時實用的公鑰或私鑰文件是被加密過的,則須要傳遞密碼來解密。密碼的格式見"openssl 密碼格式"spa

-k     :已被"-pass"替代,如今還保留是爲了兼容老版本的openssl

-base64:在加密後和解密前進行base64編碼或解密,不指定時默認是二進制。注意,編碼不是加解密的一部分,而是加解密先後對數據的格式"整理"

-a:等價於-base64

-salt:單向加密時使用salt複雜化單向加密的結果,此爲默認選項,且使用隨機salt值

-S salt:不使用隨機salt值,而是自定義salt值,但只能是16進制範圍內字符的組合,即"0-9a-fA-F"的任意一個或多個組合

-p:打印加解密時salt值、key值和IV初始化向量值(也是複雜化加密的一種方式),解密時還輸出解密結果,見後文示例

-P:和-p選項做用相同,可是打印時直接退出工具,不進行加密或解密操做

-md:指定單向加密算法,默認md5。該算法是拿來加密key部分的,見後文分析。

支持的單向加密算法有:

-md4            to use the md4 message digest algorithm
-md5            to use the md5 message digest algorithm
-ripemd160      to use the ripemd160 message digest algorithm
-sha            to use the sha message digest algorithm
-sha1           to use the sha1 message digest algorithm
-sha224         to use the sha224 message digest algorithm
-sha256         to use the sha256 message digest algorithm
-sha384         to use the sha384 message digest algorithm
-sha512         to use the sha512 message digest algorithm
-whirlpool      to use the whirlpool message digest algorithm

支持的對稱加密算法有:

-aes-128-cbc               -aes-128-cbc-hmac-sha1     -aes-128-cfb             
-aes-128-cfb1              -aes-128-cfb8              -aes-128-ctr             
-aes-128-ecb               -aes-128-gcm               -aes-128-ofb             
-aes-128-xts               -aes-192-cbc               -aes-192-cfb             
-aes-192-cfb1              -aes-192-cfb8              -aes-192-ctr             
-aes-192-ecb               -aes-192-gcm               -aes-192-ofb             
-aes-256-cbc               -aes-256-cbc-hmac-sha1     -aes-256-cfb             
-aes-256-cfb1              -aes-256-cfb8              -aes-256-ctr             
-aes-256-ecb               -aes-256-gcm               -aes-256-ofb             
-aes-256-xts               -aes128                    -aes192                  
-aes256                    -bf                        -bf-cbc                  
-bf-cfb                    -bf-ecb                    -bf-ofb                  
-blowfish                  -camellia-128-cbc          -camellia-128-cfb        
-camellia-128-cfb1         -camellia-128-cfb8         -camellia-128-ecb        
-camellia-128-ofb          -camellia-192-cbc          -camellia-192-cfb        
-camellia-192-cfb1         -camellia-192-cfb8         -camellia-192-ecb        
-camellia-192-ofb          -camellia-256-cbc          -camellia-256-cfb        
-camellia-256-cfb1         -camellia-256-cfb8         -camellia-256-ecb        
-camellia-256-ofb          -camellia128               -camellia192             
-camellia256               -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-cfb1           
-des-ede3-cfb8             -des-ede3-ofb              -des-ofb                
-des3                      -desx                      -desx-cbc                
-id-aes128-GCM             -id-aes128-wrap            -id-aes128-wrap-pad      
-id-aes192-GCM             -id-aes192-wrap            -id-aes192-wrap-pad      
-id-aes256-GCM             -id-aes256-wrap            -id-aes256-wrap-pad      
-id-smime-alg-CMS3DESwrap  -idea                      -idea-cbc                 
-idea-cfb                  -idea-ecb                  -idea-ofb                
-rc2                       -rc2-40-cbc                -rc2-64-cbc              
-rc2-cbc                   -rc2-cfb                   -rc2-ecb                 
-rc2-ofb                   -rc4                       -rc4-40                  
-rc4-hmac-md5              -seed                      -seed-cbc                
-seed-cfb                  -seed-ecb                  -seed-ofb

在給出openssl enc命令用法示例以前,先解釋下對稱加密和解密的原理和過程。

對稱加解密時,它們使用的密碼是徹底相同的,例如"123456",但這是密碼,且是明文密碼,很是不安全,因此應該對此簡單密碼進行復雜化。最直接的方法是使用單向加密計算出明文密碼的hash值,單向加密後新生成的密碼已經比較安全(稱之爲密鑰比較好),能夠做爲對稱加密時的對稱密鑰。另外,因爲同一單向加密算法對相同明文密碼的計算結果是徹底一致的,這樣解密時使用相同的單向加密算法就能計算出徹底相同的密鑰,也就是解密時的對稱密鑰。若是想要更安全,還能夠在對稱加密後對加密文件進行從新編碼,如使用"base64"、二進制或hex編碼方式進行編碼,但對應的在解密前就須要先解碼,解碼後才能解密。

因此,將對稱加、解密的機制簡單歸納以下:

對稱加密機制:根據指定的單向加密算法,對輸入的明文密碼進行單向加密(默認是md5),獲得固定長度的加密密鑰,即對稱密鑰,再根據指定的對稱加密算法,使用對稱密鑰加密文件,最後從新編碼加密後的文件。即單向加密明文密碼結果做爲對稱密鑰、使用對稱密鑰加密文件、對文件從新編碼。

對稱解密機制:先解碼文件,再根據單向加密算法對解密時輸入的明文密碼計算獲得對稱密鑰,依此對稱密鑰對稱解密解碼後的文件。

所以,解密過程當中使用的解碼方式、單向加密和對稱加密算法都必須一致,且輸入的密碼必須是正確密碼。但須要注意的一點是,解密時能夠不指定salt,由於加密時使用的salt會記錄下來,解密時能夠讀取該salt。

以下圖所示,分別是加密和解密過程示意圖。

示例:

以加密/etc/fstab的備份文件/tmp/test.txt爲例。

(1).首先測試openssl enc的編碼功能。因爲未指定密碼選項"-k"或"-pass",因此僅僅只進行編碼而不進行加密,所以也不會提示輸入密碼。

[root@xuexi tmp]# openssl enc -a -in test.txt -out test_base64.txt

[root@xuexi tmp]# cat test_base64.txt
CiMKIyAvZXRjL2ZzdGFiCiMgQ3JlYXRlZCBieSBhbmFjb25kYSBvbiBUaHUgTWF5
IDExIDA0OjE3OjQ0IDIwMTcKIwojIEFjY2Vzc2libGUgZmlsZXN5c3RlbXMsIGJ5
IHJlZmVyZW5jZSwgYXJlIG1haW50YWluZWQgdW5kZXIgJy9kZXYvZGlzaycKIyBT
ZWUgbWFuIHBhZ2VzIGZzdGFiKDUpLCBmaW5kZnMoOCksIG1vdW50KDgpIGFuZC9v
ciBibGtpZCg4KSBmb3IgbW9yZSBpbmZvCiMKVVVJRD1iMmE3MGZhZi1hZWE0LTRk
OGUtOGJlOC1jNzEwOWFjOWM4YjggLyAgICAgICAgICAgICAgICAgICAgICAgeGZz
ICAgICBkZWZhdWx0cyAgICAgICAgMCAwClVVSUQ9MzY3ZDZhNzctMDMzYi00MDM3
LWJiY2ItNDE2NzA1ZWFkMDk1IC9ib290ICAgICAgICAgICAgICAgICAgIHhmcyAg
ICAgZGVmYXVsdHMgICAgICAgIDAgMApVVUlEPWQ1MDUxMTNjLWRhYTYtNGMxNy04
YjAzLWIzNTUxY2VkMjMwNSBzd2FwICAgICAgICAgICAgICAgICAgICBzd2FwICAg
IGRlZmF1bHRzICAgICAgICAwIDAK

再以base64格式進行解碼。

[root@xuexi tmp]# openssl enc -a -d -in test_base64.txt  
 
#
# /etc/fstab
# Created by anaconda on Thu May 11 04:17:44 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 /                       xfs     defaults        0 0
UUID=367d6a77-033b-4037-bbcb-416705ead095 /boot                   xfs     defaults        0 0
UUID=d505113c-daa6-4c17-8b03-b3551ced2305 swap                    swap    defaults        0 0

實際上,上述編碼和解碼的過程嚴格地說也是對稱加密和解密,由於openssl enc默認會帶上加密選項"-e",只不過由於沒有指定輸入密碼選項,使用的加密密碼爲空而已,且單向加密算法使用的也是默認值。解密時也同樣。

(2).測試使用des3對稱加密算法加密test.txt文件。

[root@xuexi tmp]# openssl enc -a -des3 -in test.txt -out test.1 -pass pass:123456 -md md5

加密後,查看加密後文件test.1的結果。

[root@xuexi tmp]# cat test.1
U2FsdGVkX1+c/d4NsXnY6Pd7rcZjGSsMRJWQOP0s5sxH6aLE5iCYjKEAbGac//iR
wkUUh6a57OpUA3+OOCKB4z+IxBcKo67BUDGR9vYeCfkobH9F+mSfVzZbXBrJmxwf
921tJ+8K+yKB6DjJfufpW+DWXmH8MFyvK60wnYHsfUQOp81EvaUtEfqEKIS8hgg7
4NTOyww+/VMDdc2wmkf08XNQUPlVtLaSx3vuBisxRdu8raiKWGGOB7qCwELCxDqu
NaRCIh0VjjffGohAOMMsAQ2kFCDUKx0Z4Df5fvifhPXoHfsj2lI216BPG5Cy88K2
KV78DoBm4pnMAymo/HRRF95LjvWYZIN88hIVN67u2j9zqSGeuyJakMyDVhYYmrHl
sMr2YTbTwus2DiO6qAzt/0a9nocTVKfGR81Xsh0a0ZudjtrMl5H36YJawpldvUCa
DzXPsbpQrp0VGi2HvJ4EVKKEx2uh8XYWmJ4ytj1s1wtCR6wQhmERtInGwULWTyI+
agXStSB5XzsvAJRJvexsaNycj5lAoQ8O6YXEj7B0inB7nBQTFbwkXyvJqXpr1179
i67leYc59OvlhRMA+GLW4g/Mg5dN5SBmgt1ChOJs4887zAUyLYrLvR4zDK6IQN/M
P6F15c9V+m9pw2t32sUQQmYrYqOV/AQf0t0EwvA0Myjmfqtvmp555Q==

解密文件test.1。

[root@xuexi tmp]# openssl enc -a -des3 -d -in test.1 -out test.2 -pass pass:123456 -md md5 

[root@xuexi tmp]# cat test.2
 
#
# /etc/fstab
# Created by anaconda on Thu May 11 04:17:44 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 /                       xfs     defaults        0 0
UUID=367d6a77-033b-4037-bbcb-416705ead095 /boot                   xfs     defaults        0 0
UUID=d505113c-daa6-4c17-8b03-b3551ced2305 swap                    swap    defaults        0 0

(3).加密時帶上點鹽salt。其實不寫時默認就已經加入了,只不過是加入隨機鹽值。使用-S能夠指定明確要使用的鹽的值。可是鹽的值只能是16進制範圍內字符的組合,即"0-9a-fA-F"的任意一個或多個組合。

[root@xuexi tmp]# openssl enc -a -des3 -S 'Fabc' -in test.txt -out test.1 -pass pass:123456 -md md5    

解密。解密時不用指定salt值,即便指定了也不會影響解密結果。      

[root@xuexi tmp]# openssl enc -a -des3 -d -in test.1 -pass pass:123456 -md md5          
 
#
# /etc/fstab
# Created by anaconda on Thu May 11 04:17:44 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 /                       xfs     defaults        0 0
UUID=367d6a77-033b-4037-bbcb-416705ead095 /boot                   xfs     defaults        0 0
UUID=d505113c-daa6-4c17-8b03-b3551ced2305 swap                    swap    defaults        0 0
[root@xuexi tmp]# openssl enc -a -des3 -d -S 'Fabcxdasd' -in test.1 -pass pass:123456 -md md5
 
#
# /etc/fstab
# Created by anaconda on Thu May 11 04:17:44 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 /                       xfs     defaults        0 0
UUID=367d6a77-033b-4037-bbcb-416705ead095 /boot                   xfs     defaults        0 0
UUID=d505113c-daa6-4c17-8b03-b3551ced2305 swap                    swap    defaults        0 0

(4).在測試下"-p"和"-P"選項的輸出功能。小寫字母p不只輸出密鑰算法結果,還輸出加解密的內容,而大寫字母P則只輸出密鑰算法結果。

加密時的狀況。

[root@xuexi tmp]# openssl enc -a -des3 -S 'Fabc' -in test.txt -out test.1 -pass pass:123456 -md md5 -p
salt=FABC000000000000
key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3D
iv =5128FDED01EE1499

其中key就是單向加密明文密碼後獲得的對稱密鑰,iv是密碼運算時使用的向量值。

再看解密時的狀況,此處加上了salt。

[root@xuexi tmp]# openssl enc -a -des3 -d -S 'Fabc' -in test.1 -pass pass:123456 -md md5 -P
salt=FABC000000000000
key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3D
iv =5128FDED01EE1499

若解密時不指定salt,或者隨意指定salt,結果以下。

[root@xuexi tmp]# openssl enc -a -des3 -d -in test.1 -pass pass:123456 -md md5 -P      
salt=FABC000000000000
key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3D
iv =5128FDED01EE1499
[root@xuexi tmp]# openssl enc -a -des3 -S 'FabM' -d -in test.1 -pass pass:123456 -md md5 -P
salt=FABC000000000000
key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3D
iv =5128FDED01EE1499

可見,解密時,只要指定和加密時相同編碼格式和單向加密算法,密鑰的結果就是同樣的,且解密時明確指定salt是無心義的,由於它能夠讀取到加密時使用的salt。

甚至,解密時指定不一樣的對稱加密算法,密鑰結果也是同樣的。

[root@xuexi tmp]# openssl enc -a -desx -d -in test.1 -pass pass:123456 -md md5 -p 
salt=FABC000000000000
key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3D
iv =5128FDED01EE1499

由此,能推理出對稱加密時使用的對稱密鑰和對稱算法是毫無關係的。

相關文章
相關標籤/搜索