- 一般來說,使用OpenSSL對稱加密算法有兩種方式,一種是使用API函數的方式,一種是使用OpenSSL提供的對稱加密算法指令方式。本書將介紹對稱加密算法的指令方式
- OpenSSL的對稱加密算法指令主要用來對數據進行加密和解密處理,輸入輸出的方式主要是文件,當然,也可以是默認的標準輸入輸出設備。
- OpenSSL基本上為所有其支持的對稱加密算法都提供了指令方式的應用,這些應用指令的名字基本上都是以對稱加密算法本身的名字加上位數、加密模式或其他屬性組合而成。比如DES算法的CBC模式,其對應的指令就是des-cbc。
- 要查找最新版本的OpenSSL支持哪些對稱加密算法指令,只要在OpenSSL應用程序提示符下輸入“-help”,就可以看到在輸出信息最后部分(Ciphercommands)有很多我們熟悉的算法名稱,這些就是OpenSSL支持的對稱加密算法指令。OpenSSL還將所有的對稱加密算法指令集成在一個指令程序中,那就是enc指令。
- enc指令是OpenSSL中對稱加密算法指令的集大成者,用戶可以在它的一個參數中指定使用哪種加密算法和模式,從而統一了對稱加密算法指令的入口。enc指令的格式跟單獨一個對稱加密算法指令的格式是基本一樣的,但是增加了一個算法類型的選擇參數選項。
- 比如,下面兩種形式的指令是等價的:
- OpenSSL的對稱加密算法指令還可以增加BASE64編解碼的功能,也就是說,可以在數據加密后將數據進行BASE64編碼后輸出保存,然后在解密的時候先將數據進行BASE64解碼后再進行解密。這樣,對于加密后數據的保存和處理就更加方便,因為BASE64編碼將加密后的很多不可見字符都編碼成可見的字符了。當然,如果你愿意,也可以單獨使用BASE64編碼的功能,OpenSSL為此也提供了專門的指令,其使用形式跟其他對稱加密算法指令是一致的。
- OpenSSL的對稱加密算法指令還可以作為使用第三方加密庫(通常是硬件加密設備)的應用接口,也就是說,它可以使用第三方的加密庫作為完成加密操作的真正設備。這是通過OpenSSL的Engine機制實現的。當然,使用第三方加密庫的前提是你已經安裝了第三方的加密設備并成功通過Engine機制加載到了OpenSSL中。?
- 不過,對OpenSSL的所有指令,包括對稱加密算法指令,你不能期望過高,這些指令雖然功能強大,但是并沒有支持所有可能的加密算法和模式,只是提供了固定的部分功能。比如對稱加密算法指令就不支持76位的RC2加解密或者84位的RC4加解密等功能。如果你想使用這些靈活的加密模式和算法,那么就需要對OpenSSL進行進一步的深入研究,即使用OpenSSL的API。
?
- 對于大部分塊加密對稱加密算法,OpenSSL都提供了CBC、CFB、ECB和OFB四種加密模式。需要注意的是,對于使用兩個密鑰和三個密鑰EDE方式的三重DES算法,其ECB模式的指令名稱并沒有明確標出,很容易跟CBC模式混同,因為塊加密算法使用最多的是CBC方式。?
- 如果要單獨使用BASE64編碼而不進行數據的加密和解密,那么只要簡單地忽略算法類型參數并加上“a”或者“base64”選項就可以了,當然,你如果不愿意忽略算法類型,也可以輸入“-none”選項。下面三種形式是等價的,僅使用BASE64編碼的指令:
- 從表還可以看出,對于絕大部分對稱加密算法來說,都有enc參數式的指令和單獨的指令兩種方式,它們都是等價的,至于選擇哪一種,主要取決于用戶本身的偏好。不過,enc指令可能會更快地支持新的對稱加密算法,而單獨的對稱加密算法指令就不一定能得到及時的更新。這跟enc實現的機制是有關系的,因為enc使用的是OpenSSL內部定義的對稱加密算法簡稱作為類型輸入參數,只要是OpenSSL定義的對稱加密算法模式,enc程序都能通過接口API自動支持,不需要因為增加了新的對稱加密算法而進行enc應用程序的修改。?
-
相對于其他指令來說,對稱加密算法的指令參數比較少,使用起來也相對容易。對稱 加密算法指令的參數形式如下:
- iphername是在表7-1中第二列和第三列中出現的參數值之一。如果你選擇第一種指令形式,那么就需要選擇表7-1第二列的參數形式;如果你選擇的是后一種獨立對稱加密算法指令方式,那就應該使用表7-1第三列的參數形式。對于第一種對稱加密算法指令使用方式來說,如果你不需要進行任何加密或解密處理,那么可以輸入none選項替代ciphername,當然,你也可以簡單忽略ciphername選項,其效果是一樣的。
(2)in和out選項
- 這兩個選項分別用于指令輸入和輸出文件,對于加密操作來說,輸入的應該是明文文件,也就是要加密的文件,輸出的是密文文件,即經過加密的文件;對于解密操作來說,輸入的是經過加密的文件,而輸出的是恢復的明文文件。輸入和輸出文件名本身是沒有任何限制的,只要符合習慣的文件名形式即可。需要注意的是,一般不要試圖編輯和改變加密后的文件,那樣做可能引起文件的部分甚至全部內容不能進行正確的解密!默認的輸入和輸出文件是標準輸入和輸出設備,對于Windows來說,就是指令行界面。需要注意的是,如果提供的輸出文件名是已經存在的文件,那么程序會首先將該文件內容清空!
(3)口令輸入選項pass,k和kfile
- 如果你不愿意輸入繁雜的用來加密數據的密鑰和初始向量,那么可以使用從口令中提取密鑰和初始向量的方法。OpenSSL對稱加密算法指令中輸入口令的目的正在于此,事實上,OpenSSL中幾乎所有輸入的口令都是用作提取密鑰的材料,而不是直接用作加密的密鑰。pass選項提供了最靈活的口令輸入方式,輸入的源可以是標準輸入設備、指令行直接輸入、提示輸入、文件、環境變量和文件描述符,具體的格式介紹讀者可以參考7-4節的應用實例。k選項和kfile選項都是為了兼容以前的版本而保留的,它們的功能目前都可以使用pass選項來實現。k選項后面輸入的參數是口令字符。kfile選項后面輸入的參數是作為口令的文件名,當然,必要的時候應該也提供路徑。OpenSSL的口令文件以第一行作為輸入口令。
(4)e和d選項
-
e和d選項分別表示執行加密操作(encryption)和解密操作(decryption),兩個參數是互斥的,不能同時出現,但是可以同時不出現,這時候就執行默認的操作,即執行加密操作。這兩個選項都不帶參數。
(5)base64,a和A選項
-
選項a和base64的作用是相同的,就是將文件進行BASE64的編解碼操作。對于加密操作來說,就在數據加密之后進行BASE64編碼;對于解密操作來說,就在解密操作之前執行BASE64解碼。A選項跟a或者base64選項一起使用才能生效,如果出示了A選項,則程序將努力將所有加密數據作為一行進行BASE64編碼,而不是按照文件原有的換行格式進行BASE64編碼。需要注意的是,在文件比較大的時候,A選項經常會導致指令執行失敗。上述三個選項都不帶參數。
(6)K和IV選項
-
如果你使用這兩個選項,意味著你不相信OpenSSL從口令提取加密密鑰和初始向量的方法,而使用自己直接提供的加密密鑰和初始向量,那么這時候你就不再需要使用口令選項。K選項后面的參數是加密密鑰,是以十六進制的方式表示,長度不能超過64個字符。IV選項只有在分組加密算法的某些模式才需要,其參數也是以十六進制的方式表示,長度不能超過32個字符。如果輸入的參數不是十六進制的字符,那么程序就會報錯。上述選項參數輸入的長度如果不夠,就在后面補零替代。
(7)salt,nosalt和S選項
-
salt選項指明在從口令提取密鑰的過程中使用鹽值,這可以增強被加密數據的安全性,事實上,即便不出示此選項,默認指令也會使該選項生效。nosalt選項跟salt選項相反,告訴指令在密鑰提取的過程中不使用鹽值,一般來說,如果不是特別地為了跟OpenSSL一些老版本兼容,不要做這樣降低安全性的事情。S選項后面的輸入參數是十六進制編碼的真正使用的鹽值,其長度不能超過16個字符。所有這些選項只有跟口令輸入選項一起使用才會生效,如果你使用K和IV選項方式輸入加入密鑰,那么這些選項將不會產生任何作用。
(8)engine選項
- 該選項的參數是OpenSSL支持的Engine的名稱,一般是以字符串表示,比如“cswift”,“nuron”和“pkcs11”等。如果你不知道目前你的OpenSSL支持的Engine特征字符串,可以輸入下列指令,其中有效的Engine都會提示出來:
- OpenSSL>engine -t
- 如果你使用了有效的Engine,那么你所執行的加密操作實際上都是在第三方加密設備中執行,而不再是使用OpenSSL密碼庫的軟件算法。
(9)p和P選項
- p選項打印出對稱加密算法真正使用的加密密鑰和初始向量,輸出的格式是十六進制的形式。如果出示了P選項,則程序在打印出加密密鑰和初始向量后就立刻退出,而不執行真正的加密或解密操作。
(10)nopad,bufsize和debug選項
- 這幾個選項之間其實并沒有聯系,這里之所以放在一起,只是為了節省篇幅。nopad選項指定不使用默認的PKCS#5標準的補丁方式,如果這樣做,那么就要確保在塊加密算法中輸入的數據是加密塊長度的整數倍,比如使用DES算法,就要保證輸入的數據是8字節的整數倍。
- bufsize選項的參數指定了讀寫文件的I/O緩存,指定的數字以字節為單位,也可以在數字后面加“k”表示是以1024字節為單位。比如,下面的格式都是可以被接受的:
- -bufsize 256 或者 -bufsize 8k
- 如果你指定的緩存小于80字節,指令程序會自動將它增加為80字節,這是進行BASE64一行編碼所需要的最小長度。
- 使用debug選項后,OpenSSL的對稱加密算法指令會將整個執行過程中I/O操作相關的BIO列出來。這主要是為了調試目的而使用,對于一般用戶來說,該選項很少使用。
例子
- 本節將給出對稱加密算法指令的一些具體實例,在下面的例子中,“pln.txt”表示明文文件,“enc.txt”表示經過加密的密文文件,而“rcv.txt”表示恢復的明文文件。
- 下面指令將文件pln.txt的內容復制到文件enc.txt中:
- 使用的時候 需要指定文件的絕對路徑?
- ?OpenSSL對稱加密算法加密數據的時候需要使用密鑰,對于塊加密算法的某些模式,還需要初始向量,既可以直接輸入加密密鑰和初始向量,也可以通過口令來提取加密密鑰和初始向量。
- 就口令輸入來說,也有多種不同的方式,本節將給出多種輸入口令和密鑰的例子。
- 下面是DES算法CBC模式指令直接使用加密密鑰和初始向量的例子: