一、 基礎知識
Openssl是一個開源的用以實現SSL協議的產品,它主要包括了三個部分:密碼算法庫、應用程序、SSL協議庫。Openssl實現了SSL協議所需要的大多數算法。
OpenSSL一共提供了8種對稱加密算法,其中7種是分組加密算法,僅有的一種流加密算法是RC4。這7種分組加密算法分別是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持電子密碼本模式(ECB)、加密分組鏈接模式(CBC)、加密反饋模式(CFB)和輸出反饋模式(OFB)四種常用的分組密碼加密模式。其中,AES使用的加密反饋模式(CFB)和輸出反饋模式(OFB)分組長度是128位,其它算法使用的則是64位。事實上,DES算法里面不僅僅是常用的DES算法,還支持三個密鑰和兩個密鑰3DES算法。
下面是使用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加密指令語法
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選項:打印出加密算法使用的加密密鑰。
(三)案例
openssl的對稱加密算法指令主要用來對數據進行加密和解密處理,openssl基本上為所有其支持的對稱加密算法都提供了指令的方式的應用,這些應用指令的名字基本上都是以對稱加密算法本身的名字加上位數、加密模式或者其他屬性組合而成。例如DES算法的CBC模式,其對應的指令就是des-cbc。
原來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
利用OpenSSL作對稱加密需要使用其子命令enc,其用法為:
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]
其中常用的選項為:
-in filename —— 輸入文件
-out filename ——輸出文件,省略則為標准輸出
-pass arg —— 口令設置,用於沒有提供密鑰時,采用摘要算法從口令中生成一個密鑰,如果加密時使用了口令,則解密也要使用口令,arg如下所示:
-pass pass:"123" #密碼是123
-pass pass:123 #密碼是123
-pass evn:VAR #密碼從環境變量VAR中去
-pass file:p.txt #密碼從文件p.txt第一行取,不包括換行符,注意DOS格式的^M及回車符。
-pass fd:3 #密碼從文件描述符3中讀
-pass stdin #標准輸入
-e —— 加密,二選一
-d —— 解密,二選一
-a/-base64 —— 加密時設置結果以base64編碼,,解密時設置輸入為base64
-A ——加密時設置結果以base64編碼成一行,解密時設置輸入為一行base6
-K key —— 加密秘鑰,16進制
-iv IV ——初始向量,16進制
-S salt ——指定16進制鹽值
-salt ——帶有隨機鹽值 二選一
-z ——是否壓縮,需要編譯時選擇了zlib庫
-md digstname —— 摘要算法,當沒有提供密鑰時候,用於從口令中生成一個密鑰,默認md5
-p ——打印出使用的salt、口令以及初始化向量IV。二選一
-P ——打印出使用的salt、口令以及初始化向量IV。不做加解密,二選一
-bufsize number ——緩沖區大小
-nopad ——無填充
-debug ——打印調試信息
-none ——不執行加 解密
-engine id ——引擎
-cihername ——要使用的加密算法,支持的加密算法如下
-aes-128-cbc -aes-128-cbc-hmac-sha1 -aes-128-cbc-hmac-sha256 -aes-128-ccm -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-ccm -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-cbc-hmac-sha256 -aes-256-ccm -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-CCM -id-aes128-GCM -id-aes128-wrap -id-aes192-CCM -id-aes192-GCM -id-aes192-wrap -id-aes256-CCM -id-aes256-GCM -id-aes256-wrap -id-smime-alg-CMS3DESwrap -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
二、 命令詳解
1、des3 desx:不同的加密算法(在密碼學課程中會做詳細的學習)
例:對文件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
2、rc2:rc2是一種加密算法
rc2-40-cbc:cbc是支持的加密分組鏈接模式, 40為位數。
rc2-64-cbc:cbc是支持的加密分組鏈接模式, 64為位數。
rc2-cbc:cbc是支持的加密分組鏈接模式。
rc2-cfb:cfb是加密反饋模式。
rc2-ecb:ecb是電子密碼本模式。
rc2-ofb:ofb是輸出反饋模式。
rc4:OpenSSL一共提供了8種對稱加密算法,其中7種是分組加密算法,僅有的一種流加密算法是RC4。
rc4-40:40為對應的位數。
補充:Rc2加密算法:
(1).introduction
RC2是一種傳統的私鑰塊加密算法,曾經被考慮作為DES算法的替代品。輸入和輸出塊大小都是64bits。而密鑰是可變的,從1byte到128bytes,現在常用的是8字節。
Algorithm description
字:16比特位;‘+’:加;‘&’:表示比特敏感的與操作;‘XOR’:表示比特敏感的與或操作;‘~’:表示換位補碼;‘^’:表示取冪運算;
(2).key expansion(密鑰擴展)
對於字操作,將規定緩存位置K[0],…,K[63];each K[i] is a 16 bit word
對於比特位操作,將規定緩存位置L[0],…,L[127];each L[i] is an eight-bit字節。
轉換公式:K[i] = L[2*i] + 256*L[2*i+1].
密鑰擴張的目的就是根據提供的密鑰將其擴張成要求的密鑰長度。
(3).Encryption algorithm(加密算法)
主要是兩個操作,mix和mash操作。’x rol k’表示16比特位左轉k位,高位補低位。
3.1 Mix up R[i]
3.2 Mixing round
3.3 Mash R[i]
3.4 Mashing round
3.5 Encryption operation
(4).Decryption algorithm(解密算法)
4.1 R-Mix up R[i]
4.2 R-Mixing round
4.3 R-Mash R[i]
4.4 R-Mashing round
4.5 Decryption operation