opensslのaes-256-ofbでファイル暗号化

■opensslが「CVE-2011-1945」で更新されたようです。
 偽SSLのECDHE_ECDS暗号の脆弱性に対する更新です。

参考URL1:http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2011-1945
参考URL2:http://security-tracker.debian.org/tracker/CVE-2011-1945
参考URL3:http://www.redhat.com/security/data/cve/CVE-2011-1945.html

■opensslってオプションが多いんですよね。

$ man openssl | grep -A 7 ^SYNOPSIS
SYNOPSIS
openssl command [ command_opts ] [ command_args ]

openssl [ list-standard-commands | list-message-digest-commands | list-
cipher-commands ]

openssl no-XXX [ arbitrary options ]

■標準コマンドのリスト

$ openssl list-standard-commands | column
asn1parse dsa gendsa prime sess_id
ca dsaparam genrsa rand smime
ciphers ec nseq req speed
crl ecparam ocsp rsa spkac
crl2pkcs7 enc passwd rsautl verify
dgst engine pkcs12 s_client version
dh errstr pkcs7 s_server x509
dhparam gendh pkcs8 s_time

■とりあえずバージョンの確認。

$ openssl version
OpenSSL 0.9.8g 19 Oct 2007

$ dpkg -l openssl
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)維持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W)トリガ待ち/(T)トリガ保留
|/ エラー?=(空欄)無/(H)維持/(R)要再インストール/X=両方(状態,エラーの大文字=異常)
||/ 名前 バージョン 説明
+++-================-================-================================================
ii openssl 0.9.8g-15+lenny1 Secure Socket Layer (SSL) binary and related cry

$ apt-cache show openssl | grep ^Version
Version: 0.9.8g-15+lenny12
Version: 0.9.8g-15+lenny11

$ apt-cache showpkg openssl | grep ^Versions -A 1
Versions:
0.9.8g-15+lenny12 (/var/lib/apt/lists/security.debian.org_dists_lenny_updates_main_binary-amd64_Packages) (/var/lib/dpkg/status)

$ apt-cache dump | grep -B 1 0.9.8g-15+lenny12 | sort | uniq -c
2 File: /var/lib/apt/lists/security.debian.org_dists_lenny_updates_main_binary-amd64_Packages
2 Depends: libssl0.9.8 0.9.8g-15+lenny12
4 Version: 0.9.8g-15+lenny12
3 --
1 Package: libssl-dev
1 Package: libssl0.9.8
1 Package: libssl0.9.8-dbg
1 Package: openssl

■ダイジェスト認証コマンドのリスト

$ openssl list-message-digest-commands | column
md2 md4 md5 rmd160 sha sha1

■暗号のアルゴリズムコマンドのリスト

$ openssl list-cipher-commands | column
aes-128-cbc bf-cfb des des-ede3-cbc rc2-cbc
aes-128-ecb bf-ecb des-cbc des-ede3-cfb rc2-cfb
aes-192-cbc bf-ofb des-cfb des-ede3-ofb rc2-ecb
aes-192-ecb cast des-ecb des-ofb rc2-ofb
aes-256-cbc cast-cbc des-ede des3 rc4
aes-256-ecb cast5-cbc des-ede-cbc desx rc4-40
base64 cast5-cfb des-ede-cfb rc2
bf cast5-ecb des-ede-ofb rc2-40-cbc
bf-cbc cast5-ofb des-ede3 rc2-64-cbc

■暗号のコマンドについてはもう少し整理しましょう。

$ openssl list-cipher-commands | sed s/"\-"/" "/g | \
for list in `xargs`;do echo "$list"; done | \
sort | uniq | grep -v ^[0-9] | column
aes bf cast5 cfb des3 ecb ede3 rc2
base64 cast cbc des desx ede ofb rc4

■aesについてはmanマニュアルからは見つからないようですが、まあ分かりますよね。。。

$ echo "aes bf cast5 cfb des3 ecb ede3 rc2
base64 cast cbc des desx ede ofb rc4" | \
for list in `xargs`;do man openssl | grep -i "$list" > /dev/null 2>&1 || echo "Not Found : ${list}";done
Not Found : aes

参考URL:http://www.triplefalcon.com/Lexicon/Encryption-Block-Mode-1.htm


(抜粋)------------------------------------------------------------

略号名称

CBC 暗号文ブロック連鎖モード(Cipher Block Chaining)
OFB 出力フィードバックモード(Oftput Feed Back)
CFB 暗号フィードバックモード(Cipher Feed Back)
ECB 暗号ブックモード(Electric Code Book)

(抜粋)------------------------------------------------------------

■上記からCBCかOFBモードを使うことにします。

$ openssl list-cipher-commands | grep "ofb\|cbc" | column
aes-128-cbc bf-ofb des-cbc des-ede3-ofb rc2-cbc
aes-192-cbc cast-cbc des-ede-cbc des-ofb rc2-ofb
aes-256-cbc cast5-cbc des-ede-ofb rc2-40-cbc
bf-cbc cast5-ofb des-ede3-cbc rc2-64-cbc

■manマニュアルに無かったaesを使うことにします。
 暗号の種類は以下の通りです。

$ openssl list-cipher-commands | grep "ofb\|cbc" | awk -F\- '{print $1}' | sort | uniq | column
aes bf cast cast5 des rc2

■ファイルの暗号化の実行

$ file=plain.txt; \
openssl enc -e -aes-256-ofb < ${file} > ${file}.enc

$ file=plain.txt; \
openssl enc -e -aes-256-ofb -in ${file} -out ${file}.enc

※どちらも2回パスワードの入力が必要です。
enter aes-256-ofb encryption password:
Verifying - enter aes-256-ofb encryption password:

■ファイルの暗号化のチェック

$ hexdump -C ${file}.enc | head -1
00000000 53 61 6c 74 65 64 5f 5f 15 fb a1 0e 4d cb 2b e1 |Salted__....M.+.|

■ファイルの復号化の実行

$ openssl enc -d -aes-256-ofb -in ${file}.enc -out ${file}.new
$ openssl enc -d -aes-256-ofb < ${file}.enc > ${file}.new

※復号化のパスワード入力は1回です。
enter aes-256-ofb decryption password:

■ファイルの整合性の確認
 (diffやmd5sumを使って比較する)

$ diff ${file} ${file}.new
$ md5sum ${file};md5sum ${file}.new

★正しく復号出来るならば、暗号化ファイルも正常ですね。
 暗号化ファイルのmd5sumの値を持っていれば、復号の前に同様にチェック出来ます。

■複数のファイルの場合はtarとgzipかbzip2などで圧縮してから行えばよいですね。

★gzipの場合

$ srcdir="target"; \
tar cvf ${srcdir}.tar ${srcdir}/; \
gzip ${srcdir}.tar

$ tar zcvf ${srcdir}.tar.gz ${srcdir}/

★bzip2の場合

$ srcdir="target"
tar cvf ${srcdir}.tar ${srcdir}/; \
bzip2 ${srcdir}.tar

$ tar jcvf ${srcdir}.tar.bz2 ${srcdir}/

■まとめ。

上記は共通鍵暗号方式による安易な暗号化です。
実際に利用する時は、「Salted」が最初に付かない方法を考えます。

公開鍵暗号方式やその他のオプションは、今回は見なかった事に。。。