今回はAES256以上でファイルを暗号化して!と言われたのでテストしてみました。
文字列の際と同様に、基本は、openssl_encrypt()を使う。
文法的には、
string openssl_encrypt ( string $data , string $method , string $password [, int $options = 0 [, string $iv = "" ]] )
となっており、第一引数に暗号化する対象データをstringで渡す。
この第一引数に、
file_get_contents('plain_file')
を渡してやることで、ファイル全体を暗号化の対象とする。
あとは、file_put_contents()
で保存してやります。
変に関数化して見難いですが、コードは下記の通り。
<?php
//暗号化パラメータ
define('PASSWORD','hogehogefoofoo');
define('IV','1234567890123456');
//入出力ファイル
$plain_file = './plain.txt';
$enc_file = './enc.txt';
$out_file = './out.txt';
//暗号化
encData($plain_file,$enc_file);
//復号化
decData($enc_file,$out_file);
/* --------------------------------------------------------- */
//暗号化関数
function encData($plain_file,$enc_file)
{
//パラメータ設定
$password = PASSWORD;
$method = 'aes-256-cbc';
$options = OPENSSL_RAW_DATA;
$iv = IV; //これは16桁じゃないとだめ。
//暗号化
$enc_data = openssl_encrypt(
file_get_contents($plain_file),
$method,
$password,
$options,
$iv
);
//出力
$res = file_put_contents($enc_file, $enc_data);
//結果
if($enc_file != FALSE && $res != FALSE)
{
return true;
}else
{
return false;
}
}
//復号化関数
function decData($enc_file,$plain_file)
{
//パラメータ設定
$password = PASSWORD;
$method = 'aes-256-cbc';
$options = OPENSSL_RAW_DATA;
$iv = IV; //これは16桁じゃないとだめ。
//復号化
$dec_data = openssl_decrypt(
file_get_contents($enc_file),
$method,
$password,
$options,
$iv
);
//出力
$res = file_put_contents($plain_file, $dec_data);
//結果
if($dec_data != FALSE && $res != FALSE)
{
return true;
}else
{
return false;
}
}
##その他
###ivの生成
ivは通常、
$iv = openssl_random_pseudo_bytes(16);
などとします。但し、$iv
は復号の際も必要なので、明示的に指定してもいいです。
###モードについて
なお、恐らく単にAES256として利用した場合は、ECBモードで動作します。ECBは、同じ情報からは、同じパターンとなるため、MD5と同様に辞書化のリスクが0ではありません。CBCは、都度パターンが違うので、セキュリティー的にECBより優れているとされます。
モードについてはこちら。
###opensslコマンドでの復号化
普通?の方法では復号できませんでした。やり方のメモ。