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

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

1、對稱加密演算法概述

openssl的加密演算法庫提供了豐富的對稱加密演算法,我們可以通過openssl提供的對稱加密演算法指令的方式使用,也可以通過呼叫openssl提供的API的方式使用。

openssl的對稱加密演算法指令主要用來對資料進行加密和解密處理,openssl基本上為所有其支援的對稱加密演算法都提供了指令的方式的應用,這些應用指令的名字基本上都是以對稱加密演算法本身的名字加上位數、加密模式或者其他屬性組合而成。例如DES演算法的CBC模式,其對應的指令就是des-cbc。可以通過命令檢視當前版本的openssl支援的對稱加密演算法,例如Ubunt14.04 openssl版本及支援對稱加密演算法指令如下:

複製程式碼
[email protected]:~$ openssl enc -help
unknown option '-'
options are
...
/**/
Cipher Types
-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-aes192-GCM -id-aes256-GCM -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
複製程式碼

可以看到上述我們執行的是enc -help命令,enc是什麼東西?原來openssl提供了兩種方式呼叫對稱加密演算法:

一種就是直接呼叫對稱加密指令,例如:

openssl des-cbc -in plain.txt -out encrypt.txt -pass pass:12345678

另外一種是使用enc的方式,即用對稱加密指令作為enc指令的引數,例如:.

openssl enc -des-cbc -in plain.txt -out encrypt.txt -pass pass:12345678

上述兩條指令完成的功能是一樣的,而且其引數也是一樣。原來enc是作用是什麼呢?簡單來說,為了省事……。

openssl提供了N多的對稱加密演算法指令,enc就是把這些N多的對稱的加密演算法指令統一整合到enc指令中。當用戶使用時,只需使用enc,指定加密演算法,就是完成單獨的加密演算法指令完成的操作。而且,enc中可以指定的對稱加密演算法指令可能並沒有以單獨指令的形式存在。所有筆者建議使用enc這種方式。

當然,雖然openssl為我們提供的對稱加密演算法指令雖然功能強大,但並不完整,例如對稱加密演算法不支援76位的RC2加解密或者84位的RC4加解密燈功能。如果想靈活的使用這些加密演算法和模式,就需要學習openssl提供的API

2、對稱加密演算法指令引數

可以通過enc的man手冊檢視enc的詳細用法,也可以通過enc -help的方式檢視主要引數概要說明,如下

複製程式碼
[email protected]:~$ openssl enc -help
unknown option '-help'
options are
-in <file>     input file
-out <file>    output file
-pass <arg>    pass phrase source
-e             encrypt
-d             decrypt
-a/-base64     base64 encode/decode, depending on encryption flag
-k             passphrase is the next argument
-kfile         passphrase is the first line of the file argument
-md            the next argument is the md to use to create a key
                 from a passphrase.  One of md2, md5, sha or sha1
-S             salt in hex is the next argument
-K/-iv         key/iv in hex is the next argument
-[pP]          print the iv/key (then exit if -P)
-bufsize <n>   buffer size
-nopad         disable standard block padding
-engine e      use engine e, possibly a hardware device.
Cipher Types
...
複製程式碼

[in/out]

這兩個引數指定輸入檔案和輸出檔案,加密是輸入檔案是明文,輸出檔案是密文;解密時輸入檔案是密文,輸出檔案是明文。

[pass]

指定密碼的輸入方式,共有五種方式:命令列輸入(stdin)、檔案輸入(file)、環境變數輸入(var)、檔案描述符輸入(fd)、標準輸入(stdin)。預設是標準輸入,及從鍵盤輸入。

[e/d]

e:加密, d:解密  預設是加密

[-a/-base64]

由於檔案加密後是二進位制形式,不方便檢視,使用該引數可以使加密後的內容經過base64編碼,使其可讀;同樣,解密時需要先進行base64解編碼,然後進行解密操作。

[-k/-kfile]

相容以前版本,指定密碼輸入方式,現已被pass引數取代

[md]

指定金鑰生成的摘要演算法,使用者輸入的口令不能直接作為檔案加密的金鑰,而是經過摘要演算法做轉換,此引數指定摘要演算法,預設md5

[-S]

為了增強安全性,在把使用者密碼轉換成加密金鑰的時候需要使用鹽值,預設鹽值隨機生成。使用該引數,則鹽值由使用者指定。也可指用-nosalt指定不使用鹽值,但降低了安全性,不推薦使用。

[K/IV]

預設檔案的加密金鑰的Key和IV值是有使用者輸入的密碼經過轉化生成的,但也可以由使用者自己指定Key/IV值,此時pass引數不起作用

[pP]

加上p引數會列印檔案金鑰Key和IV值,加上P引數也會列印檔案金鑰Key和IV值,但不進行真正的加解密操作

[bufsize]

讀寫檔案的I/O快取,一般不需要指定

[-nopad]

不使用補齊,這就需要輸入的資料長度是使用加密演算法的分組大小的倍數

[engine]

指定三方加密裝置,沒有環境,暫不實驗

3、對稱加密演算法使用示例

1、只對檔案進行base64編碼,而不使用加解密

/*對檔案進行base64編碼*/
openssl enc -base64 -in plain.txt -out base64.txt
/*對base64格式檔案進行解密操作*/
openssl enc -base64 -d -in base64.txt -out plain2.txt
/*使用diff命令檢視可知解碼前後明文一樣*/
diff plain.txt plain2.txt

2、不同方式的密碼輸入方式

複製程式碼
/*命令列輸入,密碼123456*/
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass pass:123456
/*檔案輸入,密碼123456*/
echo 123456 > passwd.txt
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass file:passwd.txt
/*環境變數輸入,密碼123456*/
passwd=123456
export passwd
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass env:passwd
/*從檔案描述輸入*/ 
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass fd:1  
/*從標準輸入輸入*/ 
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass stdin 
複製程式碼

3、固定salt值加密

複製程式碼
[email protected]:~$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -pass pass:123456 -P
salt=32F5C360F21FC12D
key=D7E1499A578490DF940D99CAE2E29EB1
iv =78EEB538897CAF045F807A97F3CFF498
[email protected]:~$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -pass pass:123456 -P
salt=DAA482697BECAB46
key=9FF8A41E4AC011FA84032F14B5B88BAE
iv =202E38A43573F752CCD294EB8A0583E7
[email protected]:~$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -pass pass:123456 -P -S 123
salt=1230000000000000
key=50E1723DC328D98F133E321FC2908B78
iv =1528E9AD498FF118AB7ECB3025AD0DC6
[email protected]:~$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -pass pass:123456 -P -S 123
salt=1230000000000000
key=50E1723DC328D98F133E321FC2908B78
iv =1528E9AD498FF118AB7ECB3025AD0DC6
[email protected]:~$ 
複製程式碼

可以看到,不使用-S引數,salt引數隨機生成,key和iv值也不斷變化,當slat值固定時,key和iv值也是固定的。

4、加解密後過程使用base64編解碼

複製程式碼
/*使用-a引數加密後使用base64編碼*/
[email protected]:~$ openssl enc -aes-128-cbc -in plain.txt -a -out encrypt.txt -pass pass:123456
/*使用-a引數解密前使用base64解碼*/
[email protected]:~$ openssl enc -aes-128-cbc -in encrypt.txt -d -a -out plain1.txt -pass pass:123456
/*檔案一樣*/
[email protected]:~$ diff plain.txt plain1.txt 
/*加密後文件使用了base64編碼*/
[email protected]:~$ cat encrypt.txt 
U2FsdGVkX19KbCj9GMI1TBOQjP8JJcefIUH1tHwf/Z4=
複製程式碼

 5、手動指定Key和IV值

複製程式碼
/*手動指定key和iv值,salt固定*/
[email protected]:~$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt  -K 1223 -iv f123 -p
salt=0B00000000000000
key=12230000000000000000000000000000
iv =F1230000000000000000000000000000
/*指定pass密碼,不起作用,注意Key和IV值是16進位制*/
[email protected]:~$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt  -K 1223 -iv f123 -p -pass pass:123456
salt=F502F4B8DE62E0E5
key=12230000000000000000000000000000
iv =F1230000000000000000000000000000
複製程式碼