51
60

More than 5 years have passed since last update.

PHPでファイルを暗号化

Last updated at Posted at 2016-02-18

以前、単純な文字列を暗号化する方法書きました

今回は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コマンドでの復号化

普通?の方法では復号できませんでした。やり方のメモ

51
60
3

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
51
60