前回は、PHPのmcryptでファイルを暗号化・復号化し、末尾に\0 がパディングされる事をメモしました。
http://shobon.hatenablog.com/entry/2014/03/31/215323
今回は、ファイルを暗号化・複合化する方法として、OpenSSL関数を使う方法です。
<環境>
・CentOS 6.5
・PHP 5.3(yum版)
PHPでOpenSSL関数を利用するには、PHP5.3以降で、opensslがリンクされてビルドされている必要がある。
CentOS6.xのyumでインストールされたPHP5.3では使える(phpinfoで確認)。
暗号化したいファイルを用意する。
$ echo -n 'test-text.' > encrypt-me.txt $ cat encrypt-me.txt test-text.
これをAES128で暗号化する
$file_name = './encrypt-me.txt'; $encrypt_file = $file_name.'.enc'; $pass = 'test'; $method = 'aes128'; $options = OPENSSL_RAW_DATA; $iv = '1234567812345678'; file_put_contents($encrypt_file, openssl_encrypt(file_get_contents($file_name), $method, $pass, $options, $iv));
※暗号化メソッドの一覧は、openssl_get_cipher_methods で取得できる。
http://docs.php.net/manual/ja/function.openssl-get-cipher-methods.php
このPHPを実行すると、暗号化してファイルを保存し、そのファイルを再び読み出して復号化して出力する。
ファイルが暗号化されているか確認。
$ cat encrypt-me.txt.enc →暗号化されて読めない
ファイルサイズを確認
$ ls -l encrypt-me.txt* -rw-rw-r-- 1 user user 10 3月 30 20:50 2014 encrypt-me.txt -rw-rw-r-- 1 user user 16 3月 30 20:48 2014 encrypt-me.txt.enc
AES128で暗号化したので、128bit(16Byte)の倍数に満たない分が \0 でパディングされて暗号化されている。
また、mcrypt関数のように、復号化したデータの末尾に「\0」がパディングされていないか確認する。
暗号化したデータを復号化してファイルに書き込む処理を追加
// file decrypt $dectypt_data = openssl_decrypt(file_get_contents($encrypt_file), $method, $pass, $options, $iv); file_put_contents('./encrypt-me.txt.dec', $dectypt_data);
復号化して保存した内容を確認
$ cat encrypt-me.txt.dec
test-text.
ファイルサイズを確認
$ ls -l encrypt-me.txt* -rw-rw-r-- 1 user user 10 3月 30 20:50 2014 encrypt-me.txt -rw-rw-r-- 1 user user 10 3月 30 20:48 2014 encrypt-me.txt.dec
OpenSSL関数の場合は、パディングが考慮されているため、同じファイルサイズになる。