PHPで暗号化したファイルをopensslコマンドで戻そうとした際、
bad magic number
と表示され、戻すことができませんでした。
なんで?としばらく悩みましたが、openssl_encrypt()のUser Contributed Noteのところに、同じことでハマっていた人の大変有用な記述がありました。
要約すると、
- encrypt_openssl()でpassとなっている引数は、opensslコマンドでのpassではなく、keyだ!
- しかそもそのpass(key)やivはopensslで入力する際には16進数変換されたものとなる!
なので、普通にpassやivを指定しただけでは複合化できないということのようです。
うーん。
親切にサンプルコードも乗せてくれていたので、自分の用途に合わせて変更したものが下記です。
opensslコマンドでdecryptするコマンドも表示してくれます(一部、ファイル出力に変更)。
<?php
//与えられた文字を16進数に変換
function strtohex($x)
{
$s='';
foreach (str_split($x) as $c) $s.=sprintf("%02X",ord($c));
return($s);
}
//生成条件
//passとなっているところはopensslコマンド的にはkeyとなる
$iv = "1234567890123456";
$pass = '1234567890123456';
$method = 'aes-256-cbc';
//
echo "<h3>変換結果</h3>";
echo "コマンドで戻す人には下記を教えます。<br>";
echo "ivを16進数に変換: ".strtohex ($iv)."<br>";
echo "key(pass)を16進数に変換: ".strtohex ($pass)."<br>";
//変換
file_put_contents('./file.encrypted',openssl_encrypt (file_get_contents('input.txt'), $method, $pass, true, $iv));
//デーコードコマンド
$exec = "openssl enc -".$method." -d -in file.encrypted -out out.txt -nosalt -nopad -K ".strtohex($pass)." -iv ".strtohex($iv);
echo "<h3>opensslコマンドでデコードする際は下記のコマンドを利用。</h3>";
echo $exec."<br><br>";
//実際に実行
echo exec($exec);
通常、暗号化、復号化を利用する場合、暗号化する人と復号化する人は別で、かつ別の環境を利用していることが普通なので、この仕様はちょっと???な感じですね。