(9) openssl enc(對稱式加密)

來源:互聯網
上載者:User

標籤:class   ack   info   pen   filename   老版本   選項說明   -o   wrap   

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

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

選項說明:

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

-md      :指定單向密碼編譯演算法,預設md5。該演算法是拿來加密key部分的,見後文分析。

-in filename    :輸入檔案,不指定時預設是stdin

-out filename  :輸出檔案,不指定時預設是stdout

-e       :對輸入檔案加密操作,不指定時預設就是該選項

-d       :對輸入檔案解密操作,只有顯示指定該選項才是解密

-pass       :傳遞加、解密時的純文字密碼。若驗證簽名時使用的公開金鑰或私密金鑰檔案是被加密過的,則需要傳遞密碼來解密。

-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選項作用相同,但是列印時直接退出工具,不進行加密或解密操作

 

支援的單向密碼編譯演算法有:

-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編碼方式進行編碼,但對應的在解密前就需要先解碼,解碼後才能解密

所以,將對稱加、解密的機制簡單概括如下:

對稱式加密機制:

1、根據指定的單向密碼編譯演算法,對輸入的純文字密碼進行單向加密(預設是md5),得到固定長度的加密金鑰,即對稱金鑰,

2、再根據指定的對稱式加密演算法,使用對稱金鑰密碼編譯檔案,

3、最後重新編碼加密後的檔案。

      即單向加密純文字密碼結果作為對稱金鑰、使用對稱金鑰密碼編譯檔案、對檔案重新編碼。

對稱解密機制(加密的逆向操作):

1、先解碼檔案

2、然後根據單向密碼編譯演算法對解密時輸入的純文字密碼計算得到對稱金鑰

3、依此對稱金鑰對稱解密解碼後的檔案。

因此,解密過程中使用的解碼方式、單向加密和對稱式加密演算法都必須一致,且輸入的密碼必須是正確密碼。

但需要注意的一點是,解密時可以不指定salt,因為加密時使用的salt會記錄下來,解密時可以讀取該salt。

如所示,分別是加密和解密過程。

根據指定的單向密碼編譯演算法(-md -md5),對輸入的純文字密碼(123456)進行單向加密得到固定長度的加密金鑰,即對稱金鑰(f447b...15af),再根據指定的對稱式加密演算法(-des3),使用對稱金鑰密碼編譯檔案,最後重新編碼(-a 即-abse64)加密後的檔案

 

  

樣本:

以加密/etc/fstab的備份檔案/tmp/test.txt為例。

(1).首先測試openssl enc的編碼功能。由於未指定密碼選項"-k"或"-pass",所以僅僅只進行編碼而不進行加密(因為沒有密碼,沒有得到對稱金鑰),因此也不會提示輸入密碼。

[[email protected] ssl]# cat b.txt 
123456

[[email protected] ssl]# openssl enc -a -in b.txt -out b_base64.txt

[[email protected] ssl]# cat b_base64.txt
MTIzNDU2Cg==

再以base64格式進行解碼。

[[email protected] ssl]# openssl enc -a -d -in b_base64.txt
123456
[[email protected] ssl]# openssl enc -a -d -in b_base64.txt -out bd_base64.txt
[[email protected] ssl]# cat bd_base64.txt
123456

實際上,上述編碼和解碼的過程嚴格地說也是對稱式加密和解密,因為openssl enc預設會帶上加密選項"-e",只不過因為沒有指定輸入密碼選項,使用的加密密碼為空白而已,且單向密碼編譯演算法使用的也是預設值。解密時也一樣。

(2).測試使用des3對稱式加密演算法加密test.txt檔案。

[[email protected] ssl]# echo "to be or not to be" > test.txt


[[email protected] ssl]# openssl enc -pass pass:123456 -md md5 -des3 -a -in test.txt -out e_test.txt

-pass  指定純文字密碼

-md    指定對純文字密碼單向加密的演算法,得到對稱金鑰

-des3 使用對稱金鑰對稱式加密檔案

-a       對加密後的檔案進行base64編碼

 

加密後,查看加密後檔案test.1的結果。

[[email protected] ssl]# cat e_test.txt 
U2FsdGVkX19QKanxgeD1ug1bEax99vkTj2GeihsIHzsmMAE/rDgO8A==

解密檔案

[[email protected] ssl]# openssl enc -d -a -pass pass:123456 -md md5 -des3 -in e_test.txt -out de_test.txt
[[email protected] ssl]# cat de_test.txt
to be or not to be

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

[[email protected] ssl]# openssl enc -pass pass:123456 -md md5 -des3 -S ‘abcdef123‘ -a -in test.txt -out e2_test.txt
[[email protected] ssl]# cat e2_test.txt
U2FsdGVkX1+rze8SMAAAAEmS219zSQxGpmEgf5ff2U1U4CELKCM2Ng==

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

[[email protected] ssl]# openssl enc -d -pass pass:123456 -md md5 -des3 -a -in e2_test.txt -out de2_test.txt 
[[email protected] ssl]# cat de2_test.txt 
to be or not to be

[[email protected] ssl]# openssl enc -d -pass pass:123456 -md md5 -des3 -S ‘abcdef123‘ -a -in e2_test.txt -out sde2_test.txt
[[email protected] ssl]# cat sde2_test.txt
to be or not to be

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

加密時的情況。

[[email protected] tmp]# openssl enc -a -des3    -S ‘Fabc‘    -in test.txt    -out test.1     -pass pass:123456 -md md5    -psalt=FABC000000000000key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3Div =5128FDED01EE1499

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

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

[[email protected] tmp]# openssl enc -a -des3 -d    -S ‘Fabc‘    -in test.1    -pass pass:123456 -md md5     -Psalt=FABC000000000000key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3Div =5128FDED01EE1499

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

[[email protected] tmp]# openssl enc -a -des3 -d -in test.1 -pass pass:123456 -md md5 -P         salt=FABC000000000000key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3Div =5128FDED01EE1499
[[email protected] tmp]# openssl enc -a -des3 -S ‘FabM‘ -d -in test.1 -pass pass:123456 -md md5 -Psalt=FABC000000000000key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3Div =5128FDED01EE1499

可見,解密時,只要指定和加密時相同編碼格式和單向密碼編譯演算法,密鑰的結果就是一樣的,且解密時明確指定salt是無意義的,因為它可以讀取到加密時使用的salt。

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

[[email protected] tmp]# openssl enc -a -desx -d -in test.1 -pass pass:123456 -md md5 -p salt=FABC000000000000key=885FC58E6C822AEFC8032B4B98FA0355F8482BD654739F3Div =5128FDED01EE1499

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

  

(9) openssl enc(對稱式加密)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.