18
15

More than 5 years have passed since last update.

PHPのopenssl_encrypt()で暗号化したファイルをopensslコマンドで戻す

Last updated at Posted at 2016-02-18

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);

通常、暗号化、復号化を利用する場合、暗号化する人と復号化する人は別で、かつ別の環境を利用していることが普通なので、この仕様はちょっと???な感じですね。

18
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
15