PHPのOpenSSL関数で、ファイルを暗号化して保存する方法

前回は、PHPmcryptでファイルを暗号化・復号化し、末尾に\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  330 20:50 2014 encrypt-me.txt
-rw-rw-r-- 1 user user 16  330 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  330 20:50 2014 encrypt-me.txt
-rw-rw-r-- 1 user user 10  330 20:48 2014 encrypt-me.txt.dec

OpenSSL関数の場合は、パディングが考慮されているため、同じファイルサイズになる。


参考;
http://www.php.net/manual/ja/ref.openssl.php